2017-12-18 5 views
1

まずは、WordPressの開発における私の貧しい人々の知識について申し訳ありません。質問の文字列パラメータとして渡されたuser_idに基づいて、管理者のカスタム投稿タイプリストのレコードをフィルタリングするには

http://album.multibaselocal.com/wp-admin/edit.php?post_type=albums&user_id=31のようなクエリ文字列として渡されたuser_idに基づいて、管理者のカスタム投稿タイプの投稿リストをさらにフィルタリングできるオプションはありますか?

これは私が達成したいことです: albumと呼ばれるカスタムポストタイプがあります。これはサイトユーザーがアルバムをシステムにアップロードするために使用します。デフォルトでは、リストページに行くとすべてのアルバムがうまくいきます。ユーザーリストページでは、上記のようなクエリ文字列user_idでアルバムリストページにリンクする各ユーザーの公開アルバムの数を示すカスタム列を追加しました。

私はuser_idによってアルバムをフィルタリングしたいと思います。これは可能ですか?

私はこれをしようとしています:

add_filter('parse_query', 'filter_albums_further_if_user_id_found'); 

function filter_albums_further_if_user_id_found($query) { 
    if(isset($_GET['user_id']) && !empty($_GET['user_id'])) { 
     $user_id = $_GET['user_id']; 

     $requery = array(
      'post_type' => 'albums', 
      'post_author' => $user_id, 
      'status' => 'publish', 
      'posts_per_page' => -1, 
     ); 

     // What to do here? 
    } 
} 

私は完全にここに失っています。経験豊富なWP開発者ではありません!

私が使用しているフックがparse_queryと呼ばれているため、間違ったことが分かっていない場合は、どうかして再度クエリを解析して、既存の結果をフィルタリングする必要があります。user_id。しかし、どこで、どの:(

あなたの助けをいただければ幸いです

EDIT(クエリ出力)知りません:。

WP_Query Object 
(
    [query] => Array 
     (
      [post_type] => albums 
      [posts_per_page] => 20 
     ) 

    [query_vars] => Array 
     (
      [post_type] => albums 
      [posts_per_page] => 20 
      [error] => 
      [m] => 
      [p] => 0 
      [post_parent] => 
      [subpost] => 
      [subpost_id] => 
      [attachment] => 
      [attachment_id] => 0 
      [name] => 
      [static] => 
      [pagename] => 
      [page_id] => 0 
      [second] => 
      [minute] => 
      [hour] => 
      [day] => 0 
      [monthnum] => 0 
      [year] => 0 
      [w] => 0 
      [category_name] => 
      [tag] => 
      [cat] => 
      [tag_id] => 
      [author] => 
      [author_name] => 
      [feed] => 
      [tb] => 
      [paged] => 0 
      [meta_key] => user_id 
      [meta_value] => 31 
      [preview] => 
      [s] => 
      [sentence] => 
      [title] => 
      [fields] => 
      [menu_order] => 
      [embed] => 
      [category__in] => Array 
       (
       ) 

      [category__not_in] => Array 
       (
       ) 

      [category__and] => Array 
       (
       ) 

      [post__in] => Array 
       (
       ) 

      [post__not_in] => Array 
       (
       ) 

      [post_name__in] => Array 
       (
       ) 

      [tag__in] => Array 
       (
       ) 

      [tag__not_in] => Array 
       (
       ) 

      [tag__and] => Array 
       (
       ) 

      [tag_slug__in] => Array 
       (
       ) 

      [tag_slug__and] => Array 
       (
       ) 

      [post_parent__in] => Array 
       (
       ) 

      [post_parent__not_in] => Array 
       (
       ) 

      [author__in] => Array 
       (
       ) 

      [author__not_in] => Array 
       (
       ) 

     ) 

    [tax_query] => WP_Tax_Query Object 
     (
      [queries] => Array 
       (
       ) 

      [relation] => AND 
      [table_aliases:protected] => Array 
       (
       ) 

      [queried_terms] => Array 
       (
       ) 

      [primary_table] => 
      [primary_id_column] => 
     ) 

    [meta_query] => 
    [date_query] => 
    [post_count] => 0 
    [current_post] => -1 
    [in_the_loop] => 
    [comment_count] => 0 
    [current_comment] => -1 
    [found_posts] => 0 
    [max_num_pages] => 0 
    [max_num_comment_pages] => 0 
    [is_single] => 
    [is_preview] => 
    [is_page] => 
    [is_archive] => 1 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_embed] => 
    [is_paged] => 
    [is_admin] => 1 
    [is_attachment] => 
    [is_singular] => 
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 1 
    [query_vars_hash:WP_Query:private] => 1c0b485390fc9607d8008a14177bd63d 
    [query_vars_changed:WP_Query:private] => 
    [thumbnails_cached] => 
    [stopwords:WP_Query:private] => 
    [compat_fields:WP_Query:private] => Array 
     (
      [0] => query_vars_hash 
      [1] => query_vars_changed 
     ) 

    [compat_methods:WP_Query:private] => Array 
     (
      [0] => init_query_flags 
      [1] => parse_tax_query 
     ) 

) 

EDIT(関数本体は、現在使用して):

add_action('pre_get_posts', 'filter_albums_further_if_user_id_found'); 

function filter_albums_further_if_user_id_found($query) { 
    if(!is_admin()) 
     return; 

    if(isset($_GET['user_id']) && !empty($_GET['user_id'])) { 
     $user_id = $_GET['user_id']; 

     $query->set('meta_key', 'user_id'); 
     $query->set('meta_value', $user_id); 

    } 

    echo '<pre>'; print_r($query); echo '</pre>'; die(); 
} 

答えて

1

これは私が数週間前に似た問題を思い出させてくれました。クエリの 'orderby'部分を調整する必要がありますが、私はあなたが同じ行動であなたの仕事を達成できると信じています。そのフィルタの代わりに 'pre_get_posts'アクションを使用してみてください。私はこれをテストしていないので、それが動作するかどうか教えてください!

(ユーザ入力後に編集)正解:

function user_id_filter($query) { 
    if (! is_admin() && !$query->is_main_query()) 
     return; 

    if(isset($_GET['user_id']) && !empty($_GET['user_id'])) { 
     $user_id = $_GET['user_id']; 
     $query->set('author', $user_id); 
    } 
    //Debug if necessary 
    //echo '<pre>'; print_r($query); echo '</pre>'; die(); 
} 
add_action('pre_get_posts', 'user_id_filter', 500000000); 

Iを基準としてこれを使用します。 https://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

+0

ご回答いただきありがとうございます。私はあなたのコードを私のfunctions.phpに追加しましたが、user_idがクエリ文字列に渡されたときに投稿が表示されなくなりました。しかし、urlからuser_idパラメータを取得すると、アルバムはすべてのユーザーに読み込まれます。 –

+0

「print_r」の部分のコメントを外して、クエリーがどのようになっているかを確認して共有してください! – Samyer

+0

もう一度ご支援いただきありがとうございます!元の質問を編集してクエリ出力を追加しました。 –

関連する問題