为什么我的 WP_Query 找不到任何结果?

沃德普拉斯 发布于 3年前 分类:WordPress

我有一个我写的插件,它适用于除一个之外的所有功能。不太有效的是当我在 REST API 函数中执行 WP_Query 时,如下所示:

  $args = array(
    'post_type' => 'download',
    'post_status' => 'publish',
    'posts_per_page' => 100,
    'paged' => $request['id']
  );

  $posts = new WP_Query( $args );

它正确返回每个 post_type 类型的下载,除了一个永远不会包含在结果中的。如果我使用 get_post( 1256 ) 然后我得到以下信息:

{
    "ID": 1256,
    "post_author": "1",
    "post_date": "2021-06-17 09:57:06",
    "post_date_gmt": "2021-06-17 08:57:06",
    "post_content": "An example: hello world",
    "post_title": "My Ticket",
    "post_excerpt": "",
    "post_status": "publish",
    "comment_status": "closed",
    "ping_status": "closed",
    "post_password": "",
    "post_name": "my-ticket",
    "to_ping": "",
    "pinged": "",
    "post_modified": "2021-06-17 10:28:08",
    "post_modified_gmt": "2021-06-17 09:28:08",
    "post_content_filtered": "",
    "post_parent": 0,
    "guid": "https://www.example.com/my-ticket",
    "menu_order": 0,
    "post_type": "download",
    "post_mime_type": "",
    "comment_count": "0",
    "filter": "raw"
}

这看起来我的查询是正确的,应该返回这篇文章,即它是正确的下载 post_type,它 post_status状态是发布的。

我不明白为什么我的查询不起作用。我错过了什么,或者是否有其他过滤器会阻止它返回?

1个回复

  • ttt5

    正如你提到的

    你是对的。 AND wp_posts.ID NOT IN (1256) 在 SQL 中。如何正确查询我的数据?我无法关闭插件,我只想控制自己的数据。

    由于我没有插件代码,我将尝试解释如何绕过帖子 ID 的排除。

    让我们假设这是排除帖子的代码。

    add_action('pre_get_posts','alter_query');
    
    function alter_query($query) {
        $query-> set('post__not_in' ,array(33));
    }

    也可能有其他操作会触发此排除。

    如果您使用以下函数获取代码。

    function get_data() {
        $args = array(
            'post_type' => 'page',
            'post_status' => 'publish',
            'posts_per_page' => 100,
        );
    
        $posts = new WP_Query( $args );
    
        return $posts;
    }
    
    var_dump(get_data());

    那么你可以摆脱这样的排除。

    function get_data() {
        // Remove the removal action
        remove_action( 'pre_get_posts', 'alter_query' );
        $args = array(
            'post_type' => 'page',
            'post_status' => 'publish',
            'posts_per_page' => 100,
        );
    
        $posts = new WP_Query( $args );
    
        // Add the removal action back.
        add_action( 'pre_get_posts', 'alter_query' );
    
        return $posts;
    }

    这样您就不会真正更改插件的任何代码,只需在要运行代码时将其关闭即可。

    这只是一个示例,您希望根据自己的情况更改它。

    查找导致问题的操作代码。

    1、安装 Query Monitor 插件并激活它。

    2、在特定页面上运行您的查询并以管理员登录访问该页面。您将在管理栏上看到查询监视器选项卡。

    1631152803-2

    3、单击它打开并选择 Hooks and Actions。

    1631152823-3

    4、在 hooks 列中搜索 (ctrl + f) 以查找“pre_get_posts”。这是在 pre_get_posts 仅用于更改查询的条件下。

    1631152840-4

    5、找到实例后,您可以检查函数的名称。在这种情况下:alter_query() 和位置 wp-content/themes/storefront/functions.php:113

    获得函数名称后,您可以删除并添加如上所示的操作。 remove_action('pre_get_posts', 'alter_query');