【问题标题】:Wordpress - Order by author if different than "admin"Wordpress - 如果与“管理员”不同,则按作者排序
【发布时间】:2013-04-17 09:57:30
【问题描述】:

在“category.php”文件中,我需要以这种奇怪的方式对我的帖子进行排序:

  • 首先是作者与“admin”不同的所有帖子(按标题字母顺序)
  • 比“admin”的所有帖子(按字母顺序)

这是我用来查询的标准代码:

<?php global 
    $wp_query; 
    query_posts( 
        array_merge( 
            array('orderby' => 'title', 'order' => 'ASC'), 
            $wp_query->query
        )
    );
 ?>

知道如何在不嵌套两个查询的情况下完成它吗?

提前致谢!


编辑: 以下是一些尝试过的代码,正如 Sepster 在其答案的先前版本中所建议的那样。但是目前这段代码开始显示来自“admin”(而不是其他)的所有帖子,直到作者不同于“admin”的帖子出现。此时它会中断结果并跳转到下一页结果。

<?php 
    global $wp_query; 
    query_posts( 
      array_merge( 
         array('orderby' => 'title', 'order' => 'ASC'), 
         $wp_query->query 
      )
    );

    $adminPosts = false;
    for ($i=1; $i<=2; $i++) { 
      while ( $wp_query->have_posts() ) {
        $wp_query->the_post();
        $author = get_the_author();
        if ($author == 'admin' && $adminPosts == false) break;
        if ($author != 'admin' && $adminPosts == true) break;

        // ALL MY STUFF

      } // end while
      rewind_posts();
      $adminPosts=true;
   } // end FOR 
 ?>

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    更新:

    我终于想出了一个可行的解决方案,但公平地说,这确实是一项学术练习;是的,无需执行第二个循环就可以实现,但实际上,它非常复杂。

    总结起来就是解决办法

    1. 开发一个自定义 SQL 语句,该语句将按所需顺序返回行。

      这是因为在 SQL 中,按您需要的顺序获得结果的唯一方法是对两个子集进行 UNION。据我所知,使用“正常”的 WP 查询操作是无法做到这一点的。

    2. 执行此查询,并循环其结果而不是标准的“循环”。

      这是因为我们返回的是记录集,而不是 WP_Query 对象。

    3. 将“博客页面最多显示 X 个帖子”设置为 1。

      (在 /wp-admin/options-reading.php 上)

      一个常见的抱怨是使用自定义查询时分页中断(顺便说一下,您使用的 query_posts() 方法容易受到此问题的影响)。

      有很多关于如何正确执行此操作的教程,例如:

      其中第一个建议实施“偏移和手动分页”。

      我发现与自定义 SQL 语句相结合的最接近实现的是 https://wordpress.stackexchange.com/a/28717。我从这个答案中大量借用了(所以我建议你过去给它一个赞成票!)。

      但是,这种技术(以及其他更“标准”的自定义查询方法)存在一个已知行为,即 WP 在最终页面上生成 404(如果我理解正确,因为 WP 仍在使用自己的查询和关联的 max- page=posts-per-page/posts 计算以在 URL 中的页码和交付的内容之间进行映射)。
      请参阅http://wordpress.org/support/topic/explanation-and-workaround-for-error-404-on-category-pagination?replies=14 了解有关此问题的详细信息以及建议的解决方案(遗憾的是,这不适用于我们的自定义 SQL 方法)。

      针对此问题的一个已知“解决方法”是将每页的帖子数量减少到 1,例如 http://wordpress.org/support/topic/custom-post-type-pagination-404-on-last-page


    因此,假设您对每页 1 个帖子的全局设置感到满意(请记住,您需要在自定义查询中手动覆盖此设置),代码如下:

    functions.php:

    ...
    function get_users_posts_last($userDisplayName = 'Admin', $categoryName = '') {
        global $wpdb, $paged, $max_num_pages;
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $post_per_page = 5;
        $offset = ($paged - 1)*$post_per_page;
    
        $sql = "
            SELECT SQL_CALC_FOUND_ROWS q.* FROM
            (
                (
                    SELECT
                        p.* 
                    FROM 
                        {$wpdb->posts} p
                        INNER JOIN {$wpdb->users} u ON p.post_author = u.ID
                        LEFT JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
                        LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
                        LEFT JOIN {$wpdb->terms} t ON tt.term_id = t.term_id
    
                    WHERE 
                        tt.taxonomy = 'category'
                        AND p.post_status = 'publish'
                        AND p.post_type = 'post'
                        AND u.display_name != '{$userDisplayName}'
                        " . ( $categoryName != '' ? "AND t.name = '{$categoryName}'" : "" ) . "
                    ORDER BY 
                        p.post_title ASC
                )   
                UNION
                (
                    SELECT
                        p.* 
                    FROM 
                        {$wpdb->posts} p
                        INNER JOIN {$wpdb->users} u ON p.post_author = u.ID
                        LEFT JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id
                        LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
                        LEFT JOIN {$wpdb->terms} t ON tt.term_id = t.term_id
    
                    WHERE 
                        tt.taxonomy = 'category'
                        AND p.post_status = 'publish'
                        AND p.post_type = 'post'
                        AND u.display_name = '{$userDisplayName}'
                        " . ( $categoryName != '' ? "AND t.name = '{$categoryName}'" : "" ) . "
                    ORDER BY 
                        p.post_title ASC
                )
            ) q
            LIMIT {$offset}, {$post_per_page};  
        ";  
    
        $sql_result = $wpdb->get_results( $sql, OBJECT);
        $sql_posts_total = $wpdb->get_var( "SELECT FOUND_ROWS();" );
        $max_num_pages = ceil($sql_posts_total / $post_per_page);
        return $sql_result;
    }
    ...
    

    category.php:

    ...
    $postList = get_users_posts_last('admin'); // Note you can also pass a category name if necessary
    if($postList) {
        global $post;
    
        foreach( $postList as $key=>$post ) {
            setup_postdata($post);
    
            // Render the post here
            ?>
                <header class='entry-header'><h1 class='entry-title'><?php the_title(); ?></h1></header>
                <div class='entry-content'><?php the_content(); ?></div>
            <?php
        }
        // Render pagination here
        ?>
            <div class="navigation">
                <div class="previous panel"><?php previous_posts_link('&laquo; Previous page',$max_num_pages) ?></div>
                <div class="next panel"><?php next_posts_link('Next page &raquo;',$max_num_pages) ?></div>
            </div>
        <?php
    }
    ...
    

    或者,只需设置两个单独的查询;-)

    【讨论】:

    • 再次非常感谢!这对我来说很难,只是想把我以前做过的所有乱七八糟的东西都组装起来;)
    • @xdera 绝对是我的荣幸。谢谢你的接受。我很想知道,您是使用自定义查询,还是只实现两个循环?
    • 我正在尝试使用自定义查询,我也尝试了两个循环,但它似乎无法解决分页问题;)
    猜你喜欢
    • 2015-07-16
    • 2013-08-16
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多