【问题标题】:WordPress - Getting Posts by User Role, combining two queries into oneWordPress - 按用户角色获取帖子,将两个查询合二为一
【发布时间】:2023-04-11 11:16:01
【问题描述】:

我正在构建一个网站,其中某些用户将是“高级”用户,而某些用户将是非高级用户。这两个角色都可以发帖,但在我们的帖子查询中,我们希望首先返回所有“高级”用户发布的帖子,CSS 类为“高级”,然后返回所有非高级帖子。

我需要以保留分页的方式这样做。

我有以下查询,可用于按用户角色返回帖子:

<?php $premiums = get_users( array( 'role' => 's2member_level1, administrator' ) );
$premium_ids = array();
foreach( $premiums as $premium )
$premium_ids[] = $premium->ID;
$posts = new WP_Query( array( 'author' => implode( ',', $premium_ids ), 'post_type' => 'classifieds', 'paged' => get_query_var('paged') ) );
if ( $posts->have_posts() ) : while ( $posts->have_posts() ) : $posts->the_post(); 

// The post title, content, etc, encase in a PREMIUM css class

endwhile; 
endif; 
wp_reset_postdata(); ?>

上面指定的两个角色是我们的“高级”角色,所以他们的所有帖子都应该首先返回。非高级角色使用 WordPress 中提供的“订阅者”角色。

对于非高级帖子,我打算进行第二次查询,根据需要更换角色,但我意识到这会破坏分页,或者至少阻止分页以传统方式工作。

因此,很明显我需要在一个查询中包含所有内容。

通过阅读以下帖子,我知道可以将两个查询合并为一个,但我不确定这是否是最好的方法。

https://wordpress.org/support/topic/multiple-queries-compiling-into-one-loop

因此,我在这里发布问题,看看是否有人知道一种方法来查询我们的高级用户,返回他们的帖子,然后查询非高级用户并返回他们的帖子,所有这些都在一个带有“高级”的查询中" 高级职位的课程和非高级职位的“非高级”课程。

我觉得这更像是一个 PHP 问题,而不是 WordPress 问题,所以我将此问题标记为 PHP 第一,WordPress 第二。

希望有人能提供帮助。

谢谢

【问题讨论】:

    标签: php mysql wordpress pagination


    【解决方案1】:

    由于似乎没有人对此有任何解决方案,我不得不使用曾经/不理想的 jQuery 来解决它。

    我找不到任何类型的 PHP 解决方案,或者任何可以让循环首先输出高级帖子的解决方案,所以我使用 jQuery 的解决方案如下,我只想说它不是理想的解决方案。

    事实上,如果我对此进行投票作为答案,我可能会投反对票。我只是想分享它以防它对任何人有帮助。

    我的解决方案是在每个返回的帖子中查询用户角色,然后将其用作 var 为所有“高级”帖子分配一个唯一的类。然后我使用 jQuery 将所有高级帖子移到顶部,到一个空的 div 中。

    空的 div 在循环之前:

    <div class="all-premium-posts"></div>
    

    然后在循环中:

            if(have_posts()): while(have_posts()):the_post();
    
            $user_id = $author_id;
            $user = new WP_User( $user_id );
            if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
                foreach ( $user->roles as $role )
                    if($role == 's2member_level1') { 
                        $premium_post = 'premium-post';
                    }
            }
    

    然后在循环中的每个帖子上:

    <div class="post <?php echo $premium_post;?>">
    

    然后是 jQuery:

    jQuery('.premium-post').prependTo('.all-premium-posts');
    

    这样做的严重缺点是我必须在一页上返回所有帖子。

    如果返回数百个帖子,将导致巨大的数据库查询和页面加载时间。

    它对我们有用,因为我们每 30 天自动修剪一次帖子,所以每个类别的帖子/每页的帖子对我们来说最多不应该超过 20-30,因此在这种情况下这是一个可行/可用的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      相关资源
      最近更新 更多