web-dev-qa-db-ja.com

WP_Query()のカスタムクエリ引数パラメータを登録する

私は、各投稿(製品)の技術仕様の表を独自のデータベース表に格納できるプラグインを書きました。サイトの検索機能のために、私はWP_Query()に渡される配列にカスタムパラメータを追加したいです。 WP_Query()が検索を実行するとすぐにプラグインによって処理されるように、このカスタムパラメータをどこに登録すればよいかわかりません。

WP_Query()によって見つけられた投稿を与えられた仕様に一致する特定のセットに制限するために私がプラグインで使用できるフックはありますか?それとも、SQLを使用してクエリ全体を構築する必要がありますか?

次の例を参照してください。 "standard"パラメータの隣にカスタムパラメータ_specがあり、その値はプラグインによって何らかの方法で解析されます。

<?php

new WP_Query(
    array(

        's' => 'some keyword', //keyword criterion
        'category' => 'some category', //taxonomy criterion

        '_spec' => 'year_min=1980;year_max=2010', //custom criterion to be handled by the plugin

    )
);

?>
6
Andre

さらに調査した後、私は解決策を考え出しました。次のWP_Queryがあるとします。

<?php

new WP_Query(
    array(

        's' => 'some keyword', //keyword criterion
        'category' => 'some category', //taxonomy criterion

        '_spec' => 'some value', //custom criterion to be handled by the plugin

    )
);

?>

pre_get_postsposts_whereと組み合わせて使用​​して、カスタムパラメータを処理できます。

<?php

add_action( 'pre_get_posts', 'my_pre_get_posts' ); //hook into the query before it is executed

$custom_where_string = ''; //used to save the generated where string between filter functions

function my_pre_get_posts( $query )
{
    global $custom_where_string;

    //if the custom parameter is used
    if(isset($query->query_vars['_spec'])){

        //here you can parse the contents of $query->query_vars['_spec'] to modify the query
        //even the first WHERE starts with AND, because WP adds a "WHERE 1=1" in front of every WHERE section
        $custom_where_string = 'AND ...';

        //only if the custom parameter is used, hook into the generation of the query
        add_filter('posts_where', 'my_posts_where'));
    }
}

function my_posts_where( $where )
{
    global $custom_where_string;

    //append our custom where expression(s)
    $where .= $custom_where_string;

    //clean up to avoid unexpected things on other queries
    remove_filter('posts_where', 'my_posts_where'));
    $custom_where_string = '';

    return $where;
}


?>

シモンズ:SQLクエリの他の部分を操作するための http://codex.wordpress.org/Class_Reference/WP_Query#Filters を見てください(例:JOIN)。

6
Andre