web-dev-qa-db-ja.com

Edit.phpのクエリを変更する

投稿編集画面(edit.php)で実行されているクエリを変更するための最良の方法は何ですか?

私が使用している現在の方法は、次のようにグローバルな$ wp_queryに引数を渡すことです。

$wp_query->query( array ('category__in' => array(14,9,2) ) );

ただし、ユーザーが前後にページング、フィルタ処理、または検索を行うと、これは実際には期待どおりに機能しません。

3
user2607

数日前、私は 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忍者が修正することを確認してください。)

3
Michal Mau

汚れている場合は、ローカルの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

投稿一覧の場合、$pagenowedit.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;
}

それが役に立つことを願っています.. :)

4
t31os