最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

post meta - Why can my filter query SOME metadata but not other metadata?

programmeradmin2浏览0评论

I'm stumped by what seems like a simple task: I want to randomly select a post that fits certain criteria (metadata set by a specific plugin) and then return that random post to the plugin in question. This plugin has a filter that appears perfect for the task, and if I hardcode the post ID all works well.

What's odd is I can't seem to pull the posts I need using WP_Query. I know the metadata is there, I can see it in phpmyadmin. I can query other metadata, just not the metadata set by this plugin.

How can I troubleshoot / further investigate this odd situation? I can't think of any reason why only SOME metadata could be accessed by WP_Query.

Just for reference, here's the code from my filter / 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 );

Edit for the purpose of clarifying the question: I see that the metadata exists in the db but a post query always comes up empty.

I'm stumped by what seems like a simple task: I want to randomly select a post that fits certain criteria (metadata set by a specific plugin) and then return that random post to the plugin in question. This plugin has a filter that appears perfect for the task, and if I hardcode the post ID all works well.

What's odd is I can't seem to pull the posts I need using WP_Query. I know the metadata is there, I can see it in phpmyadmin. I can query other metadata, just not the metadata set by this plugin.

How can I troubleshoot / further investigate this odd situation? I can't think of any reason why only SOME metadata could be accessed by WP_Query.

Just for reference, here's the code from my filter / 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 );

Edit for the purpose of clarifying the question: I see that the metadata exists in the db but a post query always comes up empty.

Share Improve this question edited Oct 17, 2019 at 20:05 jamesfacts asked Oct 17, 2019 at 16:30 jamesfactsjamesfacts 17711 bronze badges 10
  • So you want to fetch posts via their post meta values, and randomly select one of the posts retrieved? Keep in mind that ordering things randomly is extremely slow/expensive, and querying things via their post meta values is also very expensive, though not as much as random ordering. Usually when people want a random post, they don't really mean truly random and mean something else, e.g. show a different post each time I refresh the page, but distribute the selection evenly – Tom J Nowell Commented Oct 17, 2019 at 16:48
  • Yes, that's exactly right, I'd like to select one of the (2-3 possible) posts with a certain meta value. It's true, the WP_Query is slightly blunt tool for the job but for now I would be happy just successfully retrieving the right posts from the db. – jamesfacts Commented Oct 17, 2019 at 16:53
  • Regarding the troubleshooting, try inspecting the SQL query - echo $box_query->request; - is it good? You can also copy the SQL and run it via phpMyAdmin and see if you're getting the expected results that you wanted. – Sally CJ Commented Oct 17, 2019 at 17:12
  • The query isn't the issue, the query does nothing random because it's not told to, if it produced the desired results with the given options that would be a bug. Instead, where does boxzilla_options come from? Given that Boxzilla is a 3rd party premium plugin, have you contacted their support? This Q might be saveable if it's just about grabbing a random post from a query, but if any knowledge at all about boxzilla is required then the Q has to be closed as off topic, and right now there are no boxzilla docs that document this. Can you confirm that the key is exactly boxzilla_options? – Tom J Nowell Commented Oct 17, 2019 at 17:19
  • 1 @SallyCJ you are 100% correct—the post type turns out to be a custom post type, which I did not anticipate. That was the issue I had all along! – jamesfacts Commented Oct 18, 2019 at 21:55
 |  Show 5 more comments

1 Answer 1

Reset to default 0

Your query should work as is. To test this, I created 4 posts, and then using WP CLI, ran:

wp post meta add 10 boxzilla_options "testingtesting123"

Where post 10 is a post with the title test. 3 other posts existed that did not have the post meta.

To test that the post meta key/value pair did indeed exist, I ran this code:

wp> get_post_meta( 10 );
=> array(2) {
  ["_edit_lock"]=>
  array(1) {
    [0]=>
    string(12) "1571337707:1"
  }
  ["boxzilla_options"]=>
  array(1) {
    [0]=>
    string(17) "testingtesting123"
  }
}

I then opened wp shell and ran this code:

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 );

The resulting $posts array contained the desired post with 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...

Thus, the problem is likely the Boxzilla plugin, which means that further help on WPSE is not possible. You should contact Boxzilla support

发布评论

评论列表(0)

  1. 暂无评论