投稿編集画面(edit.php)で実行されているクエリを変更するための最良の方法は何ですか?
私が使用している現在の方法は、次のようにグローバルな$ wp_queryに引数を渡すことです。
$wp_query->query( array ('category__in' => array(14,9,2) ) );
ただし、ユーザーが前後にページング、フィルタ処理、または検索を行うと、これは実際には期待どおりに機能しません。
数日前、私は pre_get_posts filterを使って管理領域のいくつかのページを隠す簡単な解決策を書きました。
たぶん、あなたが達成したいことすべてのための良い出発点としてそれを使うことができました。
if ( is_admin() ) add_filter('pre_get_posts', 'mau_filter_admin_pages');
function mau_filter_admin_pages($query) {
$query->set('post__not_in', array(1,2,3) );
// Do not display posts with IDs 1, 2 and 3 in the admin area.
return $query;
}
しかし、注意してください。pre_get_posts
あなたのサイト上のほぼすべての投稿クエリに影響します。 必要な場合にのみ機能させるためには、いくつかの条件を使用する必要があります。 if (is_admin())
は私にとっては十分でしたが、私が言ったようにそれは迅速な解決策であり、私はまだそれを正しくテストしていません。
汚れている場合は、ローカルのwp忍者が修正することを確認してください。)
汚れている場合は、ローカルのwp忍者が修正することを確認してください。)
これは悪い方法ではありませんが、機能を向上させるためのいくつかのポインターを提供できます。
過去にpre_get_posts
の使用に関する多くの例を挙げてきましたが、pre_get_posts
は実際には特定のページで数回実行できることを理解するようになりました(少なくとも私は言われ、同じくらい読んだ)何度も呼ばれる(そうする必要がない場合)。
pre_get_posts
を使用するのではなく、クエリオブジェクトの末尾に向かって実行され、クエリパラメータに対する必要な制御レベルを提供しながら、一度だけ実行されるparse_query
を使用することができます。
私がmauglyの答えに対するコメントでも指摘したように、pre_get_posts
はあなたのサイト中のほとんどすべての投稿クエリに対して実行されるので、そのフックにフィルタ/アクションを追加するとき、フィルタが実行されないことを保証するためそれが望まれていないとき。フィルタをバイパスするために特定のポストクエリに設定できるパラメータがあるので、ほぼすべてのクエリを使用します(suppress_filtersが正しく記憶されている場合)。
WordPressは各ページのadmin.phpにさまざまな管理変数を設定しているので、いつでもどの種類のページが表示されているかを判断できます...
$pagenow
$parent_file
$plugin_page
$submenu_file
$typenow
これらの変数は、管理ページに関する十分な情報を提供して、選択した1つ以上のページでフィルターまたはアクションを実行するのを非常に簡単にします。
これらの変数がソースでここでどのように定義されているかを見ることができます。
http://core.trac.wordpress.org/browser/tags/3.0.4/wp-admin/admin.php
投稿一覧の場合、$pagenow
はedit.phpであることが期待でき、$typenow
は奇妙に空になります(投稿タイプが投稿の場合のみです)。
あなたは条件付きでページをうまく処理するためにいくつかの条件付きロジックを使用してクエリにそのフィルタを追加することができます...
add_action( 'admin_init', 'possibly_add_exclude_filter' );
function possibly_add_exclude_filter() {
global $pagenow, $typenow;
if( 'edit.php' == $pagenow && '' == $typenow )
add_action( 'parse_query', 'set_viewable_posts_by_cat' );
}
function set_viewable_posts_by_cat() {
set_query_var('category__in', array(1) );
return;
}
それが役に立つことを願っています.. :)