web-dev-qa-db-ja.com

投稿を属性 'order'でソートする

表示された投稿を属性 "order"でソートする方法

Functions.phpに投稿用の「属性」を追加しました

function wpzen_add_attributes_to_post() {
    add_post_type_support('post', 'page-attributes');
}
add_action('init', 'wpzen_add_attributes_to_post');
function wpzen_change_post_order($query) {
    if($query->is_main_query()) {
        $query->set('orderby', 'menu_order');
    }
}
add_action('pre_get_posts', 'wpzen_change_post_order');

コードは投稿の概要を表示します。

<?php
        $show_posts = '12';
        $cat_name = 'Products';
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $my_query = new WP_query('category_name=' . $cat_name . '&showposts=' . $show_posts . '&paged=' . $paged );

        global $wp_query;
        $wp_query->in_the_loop = true;

        while ($my_query->have_posts()) : $my_query->the_post();
        $do_not_duplicate = $post->ID;?>

    <a href="<?php echo get_permalink(); ?>">
        <h2><?php the_title(); ?></h2>
    </a>
    <?php the_content( $more_link_text , $strip_teaser ); ?>

<?php endwhile; ?>

属性 "order"(昇順または降順)に従って投稿を並べ替える方法。

4
Lech

まあ、私はそれがこのように機能しないのではないかと思います。その理由を説明しましょう….

あなたのwpzen_change_post_order関数で、$query->is_main_query()かどうかをチェックします。正確に言うと、与えられたクエリが現在のページのメインクエリ - 現在のページのデフォルト投稿を表示するためにWPによって生成されたクエリである場合、これはチェックします。

そのため、あなたがあなた自身のWP_Queryオブジェクトを作成した場合、この条件は偽になり、あなたの関数はorderbyパラメータを設定しません。

それをどう変えるか?

それを修正する方法があります。まず、wpzen_change_post_orderからif文を削除します。しかし、それからあなたは注意してそこにいくつかの他のチェックを追加するべきです、それであなたはあなたが本当に欲しいクエリーだけを修正することを確信するでしょう。 (特にチェックすべきです、if ( ! is_admin() )

2つ目の方法は、はるかに簡単なことです。orderbyパラメータをWP_Queryに直接追加します。したがって、投稿を表示するコードは次のようになります。

<?php
        $show_posts = '12';
        $cat_name = 'Products';
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

        $my_query = new WP_Query( array(  // <- It's better to use array
           'category_name' => $cat_name,
           'posts_per_page' => $show_posts,  // <- showposts is deprecated for long time, so use posts_per_page instead
           'paged' => $paged,
           'orderby' => 'menu_order'
        ) );

        global $wp_query;  // <- I'm not sure what do you want to accomplish with these 2 lines
        $wp_query->in_the_loop = true;

        while ($my_query->have_posts()) : $my_query->the_post();
        $do_not_duplicate = $post->ID;?>

    <a href="<?php echo get_permalink(); ?>">
        <h2><?php the_title(); ?></h2>
    </a>
    <?php the_content( $more_link_text , $strip_teaser ); ?>

<?php endwhile; ?>
2