web-dev-qa-db-ja.com

カテゴリに基づいて投稿を並べ替える

Stackexchangeの皆さん、こんにちは。

日付順に並べ替えられたループ内のカテゴリに基づいて投稿に優先順位を付ける方法を見つけようとしています。すべての投稿はそれぞれの日付の下にまとめられています。日付ラベルは、次のように同じ日付の投稿の上に1回表示されます。

日付

  • 投稿1
  • 投稿2
  • 投稿3

それ以前の日付

  • 投稿4
  • 投稿5

私は結果が達成しようとしています、そこではポストがある所定のカテゴリーに属するならば(私は1つのカテゴリーを使うだけでしょう)、そのような日付の下で他のものの上に移動されます:

日付

  • 投稿3(特別カテゴリ)
  • 投稿1
  • 投稿2

それ以前の日付

私はこのトピックに関してしばらく研究をしてきました、そしてこれが可能でさえあるかどうかわからない。いくつかのクエリ機能は似たような目的に役立つように見えますが、私は確信が持てず、日付のソートのために理解するのが難しくなります。複数のループが必要ですか、それともそのようなものが必要ですか。

私のループ: http://Pastebin.com/Pp0rA5j7

ループとソートメカニズムは、一般的には次のようになっています(完全なコードについてはペーストビン):

<?php $w_h = $w_d = $last = 0; ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

    <?php
    if ( date('Yz') == get_the_time('Yz') ) {
        if (!$w_d++) echo '<h6>Today</h6>';
    } elseif ( date('Yz')-1 == get_the_time('Yz') ) {
        if (!$w_h++) echo '<h6>Yesterday</h6>';
    } else {
        echo the_date('', '<h3>', '</h3>');
    }; ?>

// post content

    <?php endwhile; ?>
    <?php endif; ?>
                     <?php else : ?>

サンプルサイト: http://goldenred.web44.net (ポストテスト6を2月下のカテゴリ "test"より上に移動したい) 2013年3月)

もっと経験を積んだ人が助けになるか、少なくとも私を一般的な方向に向けることができたら、私は非常に感謝します。すべてのコメントは大歓迎です。

4
user27104

WP_Queryのオプションを調べて、カスタマイズの点でより柔軟なより効率的なものにするために現在の日付ソートシステムを廃止するほうが簡単かどうかを考え始めましたか?個人的には、私はすべてすぐに使えるソリューションを求めています。私は自分のインデックスにあるコードにこだわっていません。主な目的は、日付でグループ化された投稿、およびグループ内での優先順位付け(2つのレベル)という記述された機能のみを達成することです。他のすべては私によって変わることができました。この機能はクライアント用ではなく、私の個人用Webサイト用です。私は本当にその機能が必要です。とにかく、十分に議論して、これが私が見つけたコードです:

$args = array('posts_per_page' => -1, 'orderby' => 'date' );

$myQuery = new WP_Query($args);

$date = '';

if ( $myQuery->have_posts() ) : while ( $myQuery->have_posts() ) : $myQuery->the_post();

if ( $date != get_the_date() ) {
    echo $date;
    echo '<hr />';
    $date = get_the_date();
}

the_title(); // or whatever you want here.
echo '<br />';

endwhile; endif;
wp_reset_postdata();

このようなものが私が説明したもののためのより良い基盤になるでしょうか?

1
user27104

それは悪い考えかもしれませんが、それだけです。

投稿をすぐに印刷しないで、さまざまな変数にまとめてください。1つはカテゴリ "test"用、もう1つは残りです。

<?php
$w_h = $w_d = $last = 0;
// init variables to concatenate content later
$primary_posts = $secondary_posts = '';
// empty array to fill later
$category_names = array();
if (have_posts()) :
    while (have_posts()) :
        the_post();
        if ( date('Yz') == get_the_time('Yz') ) {
            if (!$w_d++) echo '<h6>Today</h6>';
        } elseif ( date('Yz')-1 == get_the_time('Yz') ) {
            if (!$w_h++) echo '<h6>Yesterday</h6>';
        } else {
            echo the_date('', '<h3>', '</h3>');
        };
        // get post categories
        $category_objects = get_the_category();
        foreach($category_objects as $category_object) {
            $category_names[] = $category_object->name;
        }
        // if posts belongs to category 'test'
        if( in_array('test', $category_names) ) {
            $primary_posts .= '<div class="post">Post of category "test"';
            // title, categories and excerpt goes here
            $primary_posts .= '</div><!-- .post -->';
        }
        else {
            $secondary_posts .= '<div class="post">Post of category other than "test"';
             // title, categories and excerpt goes here
            $secondary_posts .= '</div><!-- .post -->';
       }

    endwhile;
    // output all posts of category "test"
    echo $primary_posts;
    // output all posts of category other than "test"
    echo $secondary_posts;
endif;
1
Max Yudin