2

在“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 
 ?>
4

1 回答 1

0

更新:

我终于为此想出了一个可行的解决方案,但可以公平地说,这确实是学术界的练习;是的,它可以在不执行第二个循环的情况下执行,但实际上,它非常复杂。

总而言之,解决方案是

  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 中的页码和交付的内容之间进行映射)。
    有关问题的详细信息和建议的解决方案(不幸的是不会为我们的自定义 SQL 方法工作)。

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


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

函数.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;
}
...

类别.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
}
...

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

于 2013-04-17T10:05:19.193 回答