我找不到一个解决方案来查找可以混合在帖子标题、描述和/或一个或多个元中的多个关键字,所以我自己添加了搜索功能。
您只需在函数中添加以下代码。php,每当您在标准的WP\\u Query()函数中使用\'s\'参数并希望它也在一个或多个元字段中搜索时,只需添加一个\'s_meta_keys\'
参数,该参数是要在其中搜索的元键的数组:
/************************************************************************\\
|** **|
|** Allow WP_Query() search function to look for multiple keywords **|
|** in metas in addition to post_title and post_content **|
|** **|
|** By rAthus @ Arkanite **|
|** Created: 2020-08-18 **|
|** Updated: 2020-08-19 **|
|** **|
|** Just use the usual \'s\' argument and add a \'s_meta_keys\' argument **|
|** containing an array of the meta(s) key you want to search in :) **|
|** **|
|** Example : **|
|** **|
|** $args = array( **|
|** \'numberposts\' => -1, **|
|** \'post_type\' => \'post\', **|
|** \'s\' => $MY_SEARCH_STRING, **|
|** \'s_meta_keys\' => array(\'META_KEY_1\',\'META_KEY_2\'); **|
|** \'orderby\' => \'date\', **|
|** \'order\' => \'DESC\', **|
|** ); **|
|** $posts = new WP_Query($args); **|
|** **|
\\************************************************************************/
add_action(\'pre_get_posts\', \'my_search_query\'); // add the special search fonction on each get_posts query (this includes WP_Query())
function my_search_query($query) {
if ($query->is_search() and $query->query_vars and $query->query_vars[\'s\'] and $query->query_vars[\'s_meta_keys\']) { // if we are searching using the \'s\' argument and added a \'s_meta_keys\' argument
global $wpdb;
$search = $query->query_vars[\'s\']; // get the search string
$ids = array(); // initiate array of martching post ids per searched keyword
foreach (explode(\' \',$search) as $term) { // explode keywords and look for matching results for each
$term = trim($term); // remove unnecessary spaces
if (!empty($term)) { // check the the keyword is not empty
$query_posts = $wpdb->prepare("SELECT * FROM {$wpdb->posts} WHERE post_status=\'publish\' AND ((post_title LIKE \'%%%s%%\') OR (post_content LIKE \'%%%s%%\'))", $term, $term); // search in title and content like the normal function does
$ids_posts = [];
$results = $wpdb->get_results($query_posts);
if ($wpdb->last_error)
die($wpdb->last_error);
foreach ($results as $result)
$ids_posts[] = $result->ID; // gather matching post ids
$query_meta = [];
foreach($query->query_vars[\'s_meta_keys\'] as $meta_key) // now construct a search query the search in each desired meta key
$query_meta[] = $wpdb->prepare("meta_key=\'%s\' AND meta_value LIKE \'%%%s%%\'", $meta_key, $term);
$query_metas = $wpdb->prepare("SELECT * FROM {$wpdb->postmeta} WHERE ((".implode(\') OR (\',$query_meta)."))");
$ids_metas = [];
$results = $wpdb->get_results($query_metas);
if ($wpdb->last_error)
die($wpdb->last_error);
foreach ($results as $result)
$ids_metas[] = $result->post_id; // gather matching post ids
$merged = array_merge($ids_posts,$ids_metas); // merge the title, content and meta ids resulting from both queries
$unique = array_unique($merged); // remove duplicates
if (!$unique)
$unique = array(0); // if no result, add a "0" id otherwise all posts wil lbe returned
$ids[] = $unique; // add array of matching ids into the main array
}
}
if (count($ids)>1)
$intersected = call_user_func_array(\'array_intersect\',$ids); // if several keywords keep only ids that are found in all keywords\' matching arrays
else
$intersected = $ids[0]; // otherwise keep the single matching ids array
$unique = array_unique($intersected); // remove duplicates
if (!$unique)
$unique = array(0); // if no result, add a "0" id otherwise all posts wil lbe returned
unset($query->query_vars[\'s\']); // unset normal search query
$query->set(\'post__in\',$unique); // add a filter by post id instead
}
}
示例使用:
$search= "kewords to search";
$args = array(
\'numberposts\' => -1,
\'post_type\' => \'post\',
\'s\' => $search,
\'s_meta_keys\' => array(\'short_desc\',\'tags\');
\'orderby\' => \'date\',
\'order\' => \'DESC\',
);
$posts = new WP_Query($args);
此示例将查找关键字;kewords to search“要搜索的关键字”;在帖子标题、描述和元键“short\\u desc”和“tags”中。
关键字可以在一个或多个文件中找到,按任何顺序,它将返回在任何指定字段中包含所有关键字的任何帖子。
如果希望所有搜索查询都包含这些元键,则可以强制搜索包含在功能中的元键列表,并删除额外的agrument:)
希望这将帮助任何人谁面临同样的问题,我做了!