検索条件としてtax_queryとmeta_queryを含めることができるように、pre_get_posts
を介して検索クエリオブジェクトにカスタムクエリ変数を追加することで検索機能を拡張します。クエリvar s
が空の場合を除いて、Wordpressはアーカイブページにリダイレクトします。これは、他のクエリvar(tax_query&meta_query)に基づいて投稿を検索したいので理想的ではありません。多分それはis_search
ブール値を設定することと関係があると思います。そこで私は手動でそれをtrue
に設定しようとしましたが、それはオーバーライドされてfalse
に戻りました。それが常に真になり、そのためにクエリvar s
が空であってもWordpressが検索ページに留まるように強制する方法はありますか?それとも私はこれを間違った方法でやっていますか?これが私のクラスです。
class Custom_Query {
private $_get;
private static $_instance;
public function __construct() {
$this->_get = $_GET;
add_filter( 'pre_get_posts', array( $this, 'pre_get_posts' ), 9999 );
add_filter( 'wp', array( $this, 'remove_product_query' ) );
}
/**
* Hook into pre_get_posts to do the main product query
*
* @access public
* @param mixed $q query object
* @return void
*/
function pre_get_posts( $q ) {
// We only want to affect the main query
if ( !$q->is_main_query() || is_admin() )
return;
$meta_query[] = $this->date_meta_query();
$q->set( 'meta_query', $meta_query );
$tax_query[] = $this->category_tax_query();
$q->set( 'tax_query', $tax_query );
$q->set( 'is_search', true );
}
/**
* Returns date meta query
*
* @return array $meta_query
*/
function date_meta_query() {
$meta_query = array();
$compare = '=';
$value = $this->to_date( $this->_get['ptp_date'] );
if ( isset( $this->_get['ptp_date_start'] ) && isset( $this->_get['ptp_date_end'] ) ) {
$compare = 'BETWEEN';
$value = array( $this->to_date( $this->_get['ptp_date_start'] ), $this->to_date( $this->_get['ptp_date_end'] ) );
}
$meta_query = array(
'key' => '_event_date',
'value' => $value,
'compare' => $compare
);
return $meta_query;
}
/**
* Returns category taxonomy query
*
* @return array $tax_query
*/
function category_tax_query() {
$tax_query = array();
$terms = array( (int) $this->_get['ptp_term_id'] );
$operator = 'IN';
$tax_query = array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => $terms,
'operator' => $operator
);
return $tax_query;
}
/**
* Converts date string into supported DATE format
*
* @param $date
* @return string $date
*/
function to_date( $date ) {
return date( 'Y-m-d H:i:s', strtotime( $date ) );
}
/**
* Remove the query
*
* @access public
* @return void
*/
function remove_product_query() {
remove_filter( 'pre_get_posts', array( $this, 'pre_get_posts' ) );
}
}
あなたがそれを必要とするとき、あなたはWordPressにsearch.phpテンプレートをロードさせることができます:
add_filter( 'template_include', 'get_search_template' );
の代わりに
$q->set( 'is_search', true );
私がしたこと:
add_action( 'parse_query', 'search_even_empty' );
function search_even_empty($query)
{
if( isset($_GET['s']) ):
$query->is_search = true;
endif;
}