为什么我的 WP_Query 找不到任何结果?
我有一个我写的插件,它适用于除一个之外的所有功能。不太有效的是当我在 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个回复
-
正如你提到的
你是对的。 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、在特定页面上运行您的查询并以管理员登录访问该页面。您将在管理栏上看到查询监视器选项卡。
3、单击它打开并选择 Hooks and Actions。
4、在 hooks 列中搜索 (ctrl + f) 以查找“pre_get_posts”。这是在 pre_get_posts 仅用于更改查询的条件下。
5、找到实例后,您可以检查函数的名称。在这种情况下:alter_query() 和位置 wp-content/themes/storefront/functions.php:113
获得函数名称后,您可以删除并添加如上所示的操作。 remove_action('pre_get_posts', 'alter_query');
3年前 我来评论