私は、各投稿(製品)の技術仕様の表を独自のデータベース表に格納できるプラグインを書きました。サイトの検索機能のために、私は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
)
);
?>
さらに調査した後、私は解決策を考え出しました。次の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_posts
をposts_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)。