我之前曾谈到过在Wordpress中启用自定义字段搜索,但是涉及更改主要的Wordpress文件,这是一个很大的禁忌。
那么有没有其他选择呢?好吧,是的,否则我不会费心写这篇文章!要启用自定义字段(也称为Wordpress元数据)搜索,您需要设置两件事。
首先,您需要创建一个(或两个)自定义字段,并将其添加到许多帖子中。
接下来,您需要一个自定义搜索表单,该表单的字段名称设置为输入框的名称。您甚至不需要Wordpress用作默认值的normal s输入框。
打开您的模板functions.php文件,并添加以下三行代码。
add_filter('posts_join','search_metadata_join'); add_filter('posts_where','search_metadata'); add_filter('posts_groupby','search_meta_groupby');
这将在运行时向Wordpress添加三个回调过滤器。posts_join将把元表添加到我们的查询中,以便我们可以使用它。posts_where将是构建所有where子句的主要功能。最后,posts_groupby将停止出现同一词条的多个帖子。现在我们要做的就是包括我们需要的查询,以启用自定义字段搜索。我将按照上面显示的顺序执行每个回调函数。
function search_metadata_join($join) { global $wp_query, $wpdb, $wp_version; // 添加检查较旧的版本 if($wp_version >= '2.3'){ $join .= " LEFT JOIN $wpdb->postmeta AS m ON ($wpdb->posts.ID = m.post_id) "; }else{ $join .= "LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id "; } return $join; }
该search_metadata()函数有一个名为$metaVars的数组变量。它包含要搜索的自定义字段名称的数组。检查数组中的每个项目以查看其是否具有值,如果存在,则将其包含在称为子句的字符串中。该功能设置为允许任何自定义字段为true,这就是我想要的功能。
function search_metadata($where) { global $wp_query, $wpdb, $wp_version; $metaVars = array('custom1','custom2'); $where .= ' AND ('; foreach($metaVars as $metaValue=>$metaKey){ if(!empty($_GET[$metaKey])){ if($wp_version >= '2.3'){ $clause .= " OR (m.meta_key = '".$metaKey."' ANDm.meta_valueLIKE '%".$wpdb->escape($_GET[$metaKey]) . "%') "; }else{ $clause .= " OR (meta_key = '".$metaKey."' AND meta_value LIKE '%" . $wpdb->escape($_GET[$metaKey]) . "%') "; } } } $where .= substr($clause,3).') '; return $where; }
最后,这是search_meta_groupby()函数。我从wordpress.org网站上取了下来,并稍作修改。
function search_meta_groupby( $groupby ){ global $wpdb; // 我们需要按帖子ID分组 $mygroupby = "{$wpdb->posts}.ID"; if( preg_match( "/$mygroupby/", $groupby )) { // 我们需要的分组已经在那里 return $groupby; } if( !strlen(trim($groupby))) { // groupby为空,请使用我们的 return $mygroupby; } // 不是空的,追加我们的 return $groupby . ", " . $mygroupby; }
所有这些旨在使您开始创建自定义字段Wordpress搜索。在开始工作之前,您可能需要调整此处涉及的代码。