Wordpress 挂钩显示最新的待处理帖子而不是已经发布的帖子

Wordpress hook to display latest pending posts instead of already published

我被困在一些我确信一定很简单但让我抓狂的事情上。我在工作中被迫使用 WordPress,但我对它的经验为零,而且到目前为止,我一直在努力了解它在挂钩和过滤器方面的运作方式。

我想要的很简单:
我正在使用 最新的 posts 块来显示用户编写的 posts。除了我正在处理的页面将是网站管理员的前端,管理员必须看到状态为 'pending' 的 post,而不是 'publish'。我在编辑器中找不到任何选项来更改它,所以我试图设置一个钩子来将查询从 'post_status' => 'publish' 更改为 'post_status' => 'pending',但它不起作用,我得到一个 'Oops! That page can’t be found.'

这是我在 functions.php:

中写的内容

    function name_of_the_function( $query ) {
        if( get_query_var('pagename') == 'name_of_the_page' && current_user_can('publish_posts') && $query->is_main_query() ) {
            $query->set( 'post_status', 'pending' );
            return $query;
        }
    }
    add_filter( 'pre_get_posts', 'name_of_the_function' );

如果我完全保留此功能但写 'publish' 而不是 'pending' 页面会正确显示最后发布的 posts,但是 'pending' 我得到我之前提到的消息。我尝试使用 add_action 而不是 add_filter 并得到了相同的结果。
我想补充一点,我确实有待处理的 post 正在等待,如果我在我的页面模板中写入以下内容,就会找到它们:


    $args = array (
        'cat'           => 5,
        'post_status'   => 'pending'
    
    );
    $query = new WP_Query( $args );
    while ( $query->have_posts() ) {
        $query->the_post();
        echo get_the_title();
    }



只是为了检查,直接在 wp-includes/latest-posts.php 文件中,我更改了:


    $args = array(
            'posts_per_page'   => $attributes['postsToShow'],
            'post_status'      => 'publish',
            'order'            => $attributes['order'],
            'orderby'          => $attributes['orderBy'],
            'suppress_filters' => false,
        );


至:

 

    $args = array(
            'posts_per_page'   => $attributes['postsToShow'],
            'post_status'      => 'pending',
            'order'            => $attributes['order'],
            'orderby'          => $attributes['orderBy'],
            'suppress_filters' => false,
        );


它可以工作并显示待处理的 posts 但我当然不能使用它,因为文件会在每次 WordPress 更新时被删除。
很抱歉 post 但我现在迷路了,不知道还能做什么,我已经查看了所有其他内部网,但找不到答案,我真的很感激任何帮助那个问题,提前致谢。

通过将 pre_get_posts$query->is_main_query() 结合使用,您可以将其应用于 WordPress 用于查找页面的查询(主查询)。您的代码需要更改为:

function name_of_the_function( $query ) {
    if ( is_admin() || $query->is_main_query() ) {
        return $query;
    }

    if( get_query_var('pagename') == 'name_of_the_page' && current_user_can('publish_posts') ) {
        $query->set( 'post_status', 'pending' );
    }

    return $query;
}
add_filter( 'pre_get_posts', 'name_of_the_function' );

所以基本上,不要 运行 在管理中的任何查询或作为主要查询的任何查询上使用此功能,而仅 运行 在具有特定能力的人的特定页面上使用此功能。