我有一个woocommerce电子商店网站。我的搜索仅在产品标题、简短描述和SKU字段中搜索。我还想在一些自定义字段中搜索(如“U barcode”和“U mpn”)。我想在产品页面上搜索,而不是在管理面板中搜索。
我有这个脚本,但当我在功能中使用它时。php我无法按产品标题或简短描述进行搜索。
function search_filter( $query ) {
$key_fields = array ( \'_barcode\', \'_mpn\', \'_sku\' );
$value_field = $query->query_vars[\'s\'];
$query->query_vars[\'s\'] = \'\';
if ( !is_admin() && $value_field != \'\' ) {
$filter_query = array( \'relation\' => \'OR\' );
foreach ( $key_fields as $one_field ) {
array_push ( $filter_query , array (
\'key\' => $one_field,
\'value\' => $value_field,
\'compare\' => \'LIKE\'
) );
}
$query->set( \'meta_query\' , $filter_query );
}
}
add_filter( \'pre_get_posts\' , \'search_filter\');
为什么使用此脚本时无法按产品标题或简短描述进行搜索?有什么想法吗?
非常感谢。
SO网友:Kyriakos
通常我会键入条形码或sku编号。所以我得到1个结果。当我不使用此脚本时,搜索结果大约需要2-3秒。这是我的脚本:
function cf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=\' LEFT JOIN \'.$wpdb->postmeta. \' ON \'. $wpdb->posts . \'.ID = \' . $wpdb->postmeta . \'.post_id \';
}
return $join;
}
add_filter(\'posts_join\', \'cf_search_join\');
function cf_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\\(\\s*".$wpdb->posts.".post_title\\s+LIKE\\s*(\\\'[^\\\']+\\\')\\s*\\)/",
"(".$wpdb->posts.".post_title LIKE $1 OR ".$wpdb->posts.".post_excerpt LIKE $1) OR (".$wpdb->postmeta. ".meta_value LIKE $1 AND ".$wpdb->postmeta. ".meta_key IN (\'_barcode\',\'_sku\') )", $where );
}
return $where;
}
add_filter(\'posts_where\', \'cf_search_where\');
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( \'posts_distinct\', \'cf_search_distinct\' );