web-dev-qa-db-ja.com

ポストクエリに変数を追加する

データベースを2回ヒットせずにワードプレスクエリにカスタム変数を追加する方法を教えてください。以下の例では、メタフィルターをいくつか追加したいと思います。このコードはすべてうまくいきますが、実行するためにquery_posts()を実行しています。デフォルトで実行される前にクエリに追加できるようにしたいので、dbを2回クエリする必要はありません。

これが実行される前に$ wp_query-> queryを修正したら私の変更がクエリに追加されることを望みました。出力は変更されず、クエリは正常に変更されています。何か案は?ありがとう。

add_action('pre_get_posts', 'my_custom_query'); 
function my_custom_query(){

if(isset($_SESSION['size']) && $_SESSION['size'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_size', 'value' => $_SESSION['size'] );
}

if(isset($_SESSION['gender']) && $_SESSION['gender'] != 'all'){
    $cfilter[] = array( 'key' => 'cc_gender', 'value' => $_SESSION['gender'] );
}


$extraArgs = array(
    'orderby' => 'post-title',
    'paged' => get_query_var('paged')
);


if(!empty($cfilter)){ $extraArgs['meta_query'] = $cfilter; }

global $wp_query;
$wp_query->query = array_merge( $wp_query->query, $extraArgs );

}

1
patnz

Toschoが言ったように、あなたはpre_get_postsフックでクエリを修正することができます。そのフックはクエリオブジェクトを引数として渡すので、グローバル変数を読む必要はありません。

add_action( 'pre_get_posts', 'wpse12692_pre_get_posts' ); 
function wpse12692_pre_get_posts( &$wp_query )
{
    if( isset( $_SESSION['size'] ) && $_SESSION['size'] != 'all' )
    {
        $wp_query->query_vars['meta_query'] = array(
            'key' => 'cc_size',
            'value' => $_SESSION['size'],
        );
    }

    if( isset( $_SESSION['gender'] ) && $_SESSION['gender'] != 'all' )
    {
        $wp_query->query_vars['meta_query'] = array(
            'key' => 'cc_gender',
            'value' => $_SESSION['gender'],
        );
    }

    $wp_query->query_vars['orderby'] = 'post-title';
    // The next line is redundant, get_query_vars reads it from the global $wp_query object
    $wp_query->query_vars['paged'] = get_query_var('paged');
}

あなたの問い合わせはセッション変数に依存しているようです。これにより、ページへのリンクを他の人に転送するのが難しくなります。あなたはこれをURLに入れてそこから読むことを考えましたか?追加の書き換え規則を作成することによってそれを行うことができます。

2
Jan Fabry

アクション'pre_get_posts'にフックします。
例:

add_action( 'pre_get_posts', 'no_sticky_on_front' );

function no_sticky_on_front()
{
    is_front_page() and $GLOBALS['wp_query']->query_vars['ignore_sticky_posts'] = TRUE;
}
3
fuxia