是否可以使用WP_QUERY对帖子的父级字段进行选择?

时间:2019-04-06 作者:Sean

我想使用WP_Query 用于在管理页面上显示,我想包括分页参数。

我有两个限制:

我只想检索已发布帖子的修订,即其父项(帖子ID在post_parent 字段-包含publish 在its中post_status 领域

我想忽略发布帖子时自动生成的修订,即post_date 与父级的匹配。

通常,在获取帖子数组后,我只需过滤掉这些修订,但我想在带有分页的管理列表表中显示这些元素,所以我想使用WP_Query\'s对此表示支持。

在SQL中,我会使用这样的内部联接来获取父帖子:

SELECT * FROM {$wpdb->posts} AS posts
INNER JOIN {$wpdb->posts} AS parent_posts
ON posts.post_parent = parent_posts.ID
WHERE posts.post_type = \'revision\'
AND parent_posts.post_status = \'publish\'
AND posts.post_date <> parent_posts.post_date
是否可以使用WP_Query?

1 个回复
SO网友:nmr

您应该使用posts_joinposts_where 用于修改JOIN和WHERE子句的筛选器。

add_filter( \'posts_join\' , \'se333659_posts_join\', 20, 2 );
add_filter( \'posts_where\' , \'se333659_posts_where\', 20, 2 );

function se333659_posts_join( $join, $query )
{
    global $wpdb;

    if ( isset($query->query_vars[\'_rev_of_publ\']) &&
        $query->query_vars[\'_rev_of_publ\'] == \'1\' )
    {
        $join .= " LEFT JOIN {$wpdb->posts} AS rev_p ON ({$wpdb->posts}.post_parent = rev_p.ID) ";
    }
    return $join;
}

function se333659_posts_where( $where, $query )
{
    global $wpdb;

    if ( isset($query->query_vars[\'_rev_of_publ\']) &&
        $query->query_vars[\'_rev_of_publ\'] == \'1\' )
    {
        $where .= \' AND rev_p.post_status = \\\'publish\\\' AND \'.$wpdb->posts.\'.post_date <> rev_p.post_date \';
    }
    return $where;
}
如何使用:在通过_rev_of_publ 参数(名称可以更改)为WP_Query.

$args = [
    \'post_type\'     => \'revision\',
    \'post_status\'   => \'any\',     // default value is \'publish\'
    \'_rev_of_publ\'  => 1,
];
$my_query = new WP_Query( $args );
Here 您将找到有关使用WP_Query.

相关推荐

数据库连接太多-上限为MySQL

我们运营着一个流量很大的博客,拥有约500名实时用户和10000篇帖子。我们在VPS上由self托管-16gb,4核,单独的mysql DB服务器-4gb,2核;两个SSD。托管服务器没有问题,但数据库服务器有时连接不足,尽管我们有超过312个最大连接上限。我们没有任何杂散插件,最长执行时间约为5分钟。任何人都不知道是什么导致了这个问题。More insights:我们可以关联的是,当我们的博客作者(最多10个)在我们的办公室工作时,在单一IP和缓慢中断的网络连接下,这个问题碰巧更频繁。发布高峰时间的问题