WordPress:meta_query和数组

时间:2014-09-25 07:26:26

标签: php arrays database wordpress wp-query

所以,我有一个搜索表单,返回 wp_query 的自定义帖子。现在我需要找到包含自定义字段和特定值的帖子:假设我有多个名为 catagories[] 的复选框。因此,当我保存它们时,它在db中生成一个序列化数组。现在我需要在前端帖子中搜索,其中包含值11 。数组看起来像这样: a:3:{i:1;s:2:"11";i:2;s:2:"33";i:3;s:2:"33";} 。所以这就出现了问题,如何从这个序列化数组中检索信息以查找值为11的所有帖子。我的代码是:

$args = array(
         'post_type'=>'paibcresume',
         'posts_per_page' => 10,
         'paged' => $paged,
         'meta_query' => array(),
            'tax_query' => array(),
         'orderby' => 'date',
            'meta_key' => '',
         'order' => 'DESC'
      );


      // BASIC SEARCH FORM

      // Search by category
      // rbsercategories
      // rbwwcategoryhidden
      if (isset($_GET['rbsercategories']) && !empty($_GET['rbsercategories'])) {
         $args['meta_query'][] = array(
            'key'     => 'rbwwcategoryhidden',
            'value'   => $_GET['rbsercategories'],
            'compare' => 'IN'
         );
      }

      $the_query = new WP_Query( $args );
      while ($the_query->have_posts() ) : $the_query->the_post();

如果数据库中的值不是序列化数组,只是简单的字符串,但不能使用数组,那么此代码是有效的,所以我该怎么做?

1 个答案:

答案 0 :(得分:0)

好的,我没有找到通过序列化数组进行搜索的方法,但我找到了解决它的方法。

所以我没有更改管理员中的任何字段,而是添加了一个带循环的新字段。所以我有这个名为rbwwcategoryhidden[]的字段,它们创建了这个数组。我反序列化了该数组并为每个值创建了新字段:

$wwCategory = get_post_custom_values('rbwwcategoryhidden');

foreach($wwCategory as $wwCategoryValue){$wwCategoryUnser = unserialize($wwCategoryValue);}

$rbWwCatSearchCounter='0';

foreach($wwCategoryUnser as $catId){
  $rbWwCatSearchCounter++;
  echo '<input type="text" name="rbwwcatforsearch'.$rbWwCatSearchCounter.'" id="rbwwcatforsearch'.$rbWwCatSearchCounter.'" value="'.$catId.'">';
}

所以现在我有了新的字段,我个人限制了三个字段(用户只能查看三个复选框):rbwwcatforsearch1, rbwwcatforsearch2, rbwwcatforsearch3。我为该数组中的每个字段添加了值:11,33和33。

现在我刚刚更改了前端的meta_query代码,它看起来像是:

// Search by category
if (isset($_GET['rbsercategories']) && !empty($_GET['rbsercategories'])) {
  $args['meta_query'][] = array(
    'key'     => array('rbwwcatforsearch1','rbwwcatforsearch2','rbwwcatforsearch3'),
    'value'   => (isset($_GET['rbsercategories'])?$_GET['rbsercategories']:array()),
    'compare' => 'IN'
  );
}

它的效果非常完美:)