为什么我的筛选器可以查询某些元数据,但不能查询其他元数据?

时间:2019-10-17 作者:jamesfacts

我被一项看似简单的任务难住了:我想随机选择一篇符合特定标准(特定插件设置的元数据)的帖子,然后将该随机帖子返回到相关插件。这个插件有一个过滤器,看起来非常适合这个任务,如果我硬编码了post-ID,那么一切都很好。

奇怪的是,我似乎无法使用我需要的帖子WP_Query. 我知道元数据在那里,我可以在phpmyadmin中看到它。我可以查询其他元数据,但不能查询这个插件设置的元数据。

我如何解决/进一步调查这种奇怪的情况?我想不出为什么WP_Query.

仅供参考,以下是我的筛选/查询代码。

function boxzilla_randomize( $load, $box_id ) {

  $box_args = [
      \'post_status\' => \'publish\',
    \'meta_query\' => [
      [
        \'key\' => \'boxzilla_options\',
        \'compare\' => \'EXISTS\'
      ]
    ]
  ];

  $box_query = new \\WP_Query( $box_args );

  if ( $box_query->has_posts() ) {
    write_log("hey, I got one");
  }

  // return $box_id;
}

add_filter( \'boxzilla_load_box\', __NAMESPACE__.\'\\\\boxzilla_randomize\', 10, 2 );
编辑以澄清问题:我看到数据库中存在元数据,但post查询总是空的。

Empty results querying db

Meta key visible in phpmyadmin

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您的查询应按原样工作。为了测试这一点,我创建了4篇文章,然后使用WP CLI运行:

wp post meta add 10 boxzilla_options "testingtesting123"
其中,第10篇文章是带有标题测试的文章。还有3个帖子没有帖子元。

为了测试post-meta键/值对是否确实存在,我运行了以下代码:

wp> get_post_meta( 10 );
=> array(2) {
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1571337707:1"
  }
  ["boxzilla_options"]=>
  array(1) {
    [0]=>
    string(17) "testingtesting123"
  }
}
然后我打开wp shell 并运行以下代码:

wp> $args = [\'post_status\' => \'publish\', \'meta_query\' => [[\'key\' => \'boxzilla_options\',\'compare\' => \'EXISTS\']] ];
=> array(2) {
  ["post_status"]=>
  string(7) "publish"
  ["meta_query"]=>
  array(1) {
    [0]=>
    array(2) {
      ["key"]=>
      string(16) "boxzilla_options"
      ["compare"]=>
      string(6) "EXISTS"
    }
  }
}
wp> $posts = get_posts( $args );
由此产生的$posts 数组包含ID为10的所需帖子:

wp> $posts = get_posts( $args );
=> array(1) {
  [0]=>
  object(WP_Post)#1903 (24) {
    ["ID"]=>
    int(10)
    ["post_author"]=>
    string(1) "1"
    ["post_date"]=>
    string(19) "2019-10-17 18:44:10"
    ["post_date_gmt"]=>
etc...
因此,问题很可能是Boxzilla插件,这意味着不可能在WPSE上提供进一步的帮助。You should contact Boxzilla support