web-dev-qa-db-ja.com

Parse_queryフィルタでメインのWordPressループを修正する

私のカテゴリページのメインのWordPressループを以下のように修正しようとしています。

add_filter('parse_query', 'my_modified_query');

function my_modified_query( $q ) {
       if (!is_admin() && is_category()) {
              $q->set( 'orderby', 'meta_value' );
              $q->set( 'meta_key', 'my_key' );
       }

       return $q;
}

しかしうまくいかないようです。

しかし、他に何かを修正する:

 $q->set( 'order','title' );
 $q->set( 'orderby', 'DESC');

完璧に動作します。ではない

$q->set( 'orderby', 'meta_value' );
$q->set( 'meta_key', 'my_key' );

何か考えているのはなぜ?

4
Sarah Neuber

最終的に、すべてのメタクエリは_get_meta_sqlを介して実行されます。

次の条件付きステートメントは、メタクエリに対して実行されます。

if ( empty( $meta_key ) && empty( $meta_value ) )
    continue;

ここには、私たちができることの概要を示すチケットがあります。
http://core.trac.wordpress.org/ticket/16735

ただし、できることは、意図的にクエリにmeta_valueを渡して、!=(等しくない)比較を使用することです。技術的には、正しい投稿を取得できます.

$q->set( 'meta_key', 'my_key' );
$q->set( 'meta_value', 'WPSE_RULES!' );
$q->set( 'meta_compare', '!=' );
$q->set( 'orderby', 'meta_value' );

ただし、もう1つ問題があります。これらは以前とは逆の方法です。

$q->set( 'order','title' );
$q->set( 'orderby', 'DESC');
  • orderは、結果を並べる方向を設定します。有効な値は、ascまたはdesc(大文字または小文字)です。

  • orderbyは、結果の順序を設定します。日付、タイトル、メタ値など。

meta_queryパラメータを使用して、メタに基づいて投稿をクエリする新しいメソッドが実際にあることは言及しませんでしたが、それでも、上記の問題と古いメタパラメータを回避することはできません(でとにかくmeta_queryに変換されます。いくつかの例へのリンクを提供します。

http://scribu.net/wordpress/advanced-metadata-queries.html

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

6
t31os

あなたが投稿してからほぼ1年が経ったので、あなたはおそらく解決策を得ました。私は数時間前に同じ問題を抱えていましたが、数字を使用していることが判明するまで、meta_value_numの代わりにmeta_valueを使用していました。

1
Razvan Dvl

サーバス・サラ。これはあなたのenvato-shopテーマの1つだと思いますか?すでに次のようなクエリを印刷しようとしましたか(戻る前):echo '<pre>'; print_r($q); echo '</pre>';

これをテーマfunctions.phpに追加していると思いますか?

$q->set( 'oderby', 'DESC' );は動作しますが、$q->set( 'oderby', 'meta_value' );は動作しませんか?スペースで区切られた2つの基本的なorderbyパラメーターを使用して、デフォルトの動作がすべて機能するかどうかを確認してください。はいの場合、スペルミスが発生する可能性があります。 「my_key」以外の値は「meta_key」に対して機能しますか?そうでない場合は、「meta_value」パラメーターが欠落している可能性があります。これについてはわかりませんが、これを見てください: http://codex.wordpress.org/Function_Reference/WP_Query#Parameters またはそれ以上コアファイル内の関数を直接確認します。

0
kaiser