使用Wordpress 2.6启用自定义字段搜索

我之前曾谈到过在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搜索。在开始工作之前,您可能需要调整此处涉及的代码。