解决这个问题的方法很少。。。
1。不要费心去使用Relevansi(或其他类似的插件)
你经常会听到使用许多插件是件坏事。这不完全是真的。只有当这些插件对资源的使用有很大影响时,这才是糟糕的。在这种情况下,相关性不会造成这种影响。
当然,插件还有另一个问题——你必须维护它们(更新等)。
2。使用posts\\u join和posts\\u where hooks这是解决问题的最简单方法。只需加入POST和POSTETA表,并添加WHERE子句,即可在适当的自定义字段中搜索您的值。
// Join with postmeta table
function mycf_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .= " LEFT JOIN {$wpdb->postmeta} mycfpm ON ({$wpdb->posts}.ID = mycfpm.post_id ";
}
return $join;
}
add_filter(\'posts_join\', \'mycf_search_join\' );
// Add where clauses
function mycf_search_where( $where ) {
global $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\\(\\s*".$wpdb->posts.".post_title\\s+LIKE\\s*(\\\'[^\\\']+\\\')\\s*\\)/",
"({$wpdb->posts}.post_title LIKE $1) OR (mycfpm.meta_value LIKE $1)", $where );
}
return $where;
}
add_filter( \'posts_where\', \'mycf_search_where\' );
// Prevent duplicates
function cf_search_distinct( $distinct ) {
global $wpdb;
if ( is_search() ) {
return \'DISTINCT\';
}
return $distinct;
}
add_filter( \'posts_distinct\', \'mycf_search_distinct\' );
这个解决方案唯一的问题是速度可能有点慢。尤其是如果您不想在所有自定义字段中搜索。
3。自定义CF索引也可以使用save_post
钩子创建类似索引的内容。保存帖子后,您将获得所有应可搜索的自定义字段,合并它们的值并另存为另一个自定义字段。
那么让我们假设CFs有一篇帖子:color=red
, location=europe
, name=john
所有这些都应该可以搜索。您可以获取这些值,用一些分隔符char/sequence(例如#)分隔它们,这样您就可以red#europe#john
) 并将此字符串另存为新CF(我们称之为\\u CF\\u search\\u string)。
function mycf_prepare_search_index_cf( $post_id ) {
if ( wp_is_post_revision( $post_id ) ) return;
$meta_keys = array(\'cf_key1\', \'cf_key2\', \'cf_key3\');
$search_string = \'\';
foreach ( $meta_keys as $k ) {
$search_string .= get_post_meta( $post_id, $k, true ) . \'#\';
}
update_post_meta( $post_id, \'_cf_search_string\', $search_string );
}
add_action( \'save_post\', \'mycf_prepare_search_index_cf\', 100, 1 );
然后可以使用2中的代码。只在这一个自定义字段中搜索,而不是全部字段,因此它将只添加一个联接,并且不会使DB查询期间要搜索的行相乘。