WordPressの投稿の並び順を変える方法、CocoonでIntuitive Custom Post Order(3.14バージョンに不具合有り)を利用する方法。

WordPrtessのカスタマイズCodeプログラミング Cocoon

投稿の並び順を変更する方法

WordPressの並び順を変える方法はいくつかあります。

まず、簡単なのは、プラグインを利用する方法。

そして、直接並び順を、プログラム記述する方法。一部の投稿並び替えプラグインを、さらに独自でカスタマイズも出来ます。

投稿の並び順をプラグインを使わずにプログラムで変更する

子テーマのファイル中にある、funciton.phpに以下を記述します。

並び替えはソートともいいます。

orderで昇順か降順かを指定する。

ASC : 昇順
DESC :降順

orderbyでソート順を何で並べ替えるかを指定

orderbyのパラメータキー
none順序なし
ID(大文字)投稿ID順
author作成者順
titleタイトル順
date日付順
modified更新日順
parent親ページID順
randランダム順
comment_countコメント数順

add_actionをつかった並び替え

子テーマの中の、funciton.phpに並び順を記述します。

add_actionで、メインクエリ作成前に、 sort_postdata(任意の関数名) を実行するように設定します。class-wp-query.phpget_posts 関数の先頭付近で実行されます。

//記事の表示順変更
function sortpost($query) {
    if(is_admin() || !$query->is_main_query()){
        return;
    }
    //ASC:昇順、DESC:降順
    $query->set('order', 'DESC');
    //orderbyで何順に並べ替えるか指定
    $query->set('orderby', 'modified');
}
add_action('pre_get_posts', 'sortpost');

テーマによって並び替えが出来ない理由。

以下は、テーマで使われている並び替えの例です。

//テーマ側でpre_get_postsフックでorderbyを指定している例
function po_pre_get_posts( $query ) { 
  $options = get_design_plus_option();
  // Modify post order of faq and clinic
  
  if ( is_admin() ) return;
  if ( $query->is_post_type_archive( 'service' ) || $query->is_post_type_archive( 'faq' )) { 
    // Change post order by menu_order and date
    $query->set( 'orderby', array( 'menu_order' => 'ASC', 'date' => 'DESC' ) );
    // Display all posts in archive pages
    if ( $query->is_main_query() ) {
      // Change posts number to display
      $query->set( 'posts_per_page', -1 );
    }
  }
}
add_action( 'pre_get_posts', 'po_pre_get_posts' );

この場合、既にadd_action(‘pre_get_posts’, 任意の関数名)が利用されています。テーマによってはadd_actionで変更できまないことがあります。

プラグイン「Intuitive Custom Post Order」

3.14バージョンに不具合がありました。

※2023年2月にセキュリティ面が更新された3.14バージョンがリリースされまいたが、並び替えができなくなる不具合がでているので、次の更新バージョンがでるまで3.14への更新は控えたほうがおすすめです。3.13バージョンは並び替えは問題ありません。

Intuitive Custom Post Orderを使う方法

代表的なプラグインは「Intuitive Custom Post Order」。

最新のWordPressにも互換性があるプラグインです。ただし、更新が数年前で、WordPressの最新でのテストが認証されていないため、表示ができなくなる可能性はあります。ただ、とても便利なのでこちらを使ってもいいと思います。このプラグインがやっっていることは、jsでListの順番を並び替えて、並び順をDBに登録しているだけなので、jsを書けば、自分でも実装出来る内容です。プラグインを無効化しても、DBに並び順が残るので呼び出すことができます。

実装は、とても簡単です。「設定」の「並び順」から画面を表示されたら、並び替えたい表示先のページ名にチェックをいれるだけです。

プラグインによる投稿記事の並び替え方法

WordPressの投稿一覧の並び順は「テーマ」依存

WordPressの、投稿一覧は、テーマによる投稿並び順が優先されます。紹介したプラグインの「Intuitive Custom Post Order」を有効化して設定しても、DBに登録はできても、投稿表示の際には、並び順がかわらないテーマがあります。テーマの複雑なフィルターフックを調べるよりは、一覧表示部分をPHPでプログラム記述して定義するほうが手っ取り早いです。

Intuitive Custom Post Orderをカスタマイズして使う。

Intuitive Custom Post Orderで、DBに登録された値は “menu_order”で設定することができます。

orderbyのパラメータキー
menu_orderIntuitive Custom Post Orderをつかった場合

Intuitive Custom Post Order」の説明に以下のようにあります。

説明

WordPressの設定メニューの「直感的なCPO」メニューからソート可能な項目を選択します。
直感的に、ドラッグ アンド ドロップで並べ替え可能な JavaScript を使用して、アイテム (投稿、ページ、カスタム投稿タイプ、カスタム分類法、サイト) を並べ替えます。
テーマでパラメーター ( orderby = menu_order, order = ASC ) を使用します。

自動変換されたパラメーター ( orderby および order ) をオーバーライドすることもできます。
注意: ‘get_posts()’ を使用してデフォルトの順序 ( orderby = date, order = DESC ) に再上書きする場合のみ、独自のカスタム パラメータ ‘orderby = default_date’ を使用する必要があります。

このプラグインはGitHub で公開されています。

https://wordpress.org/plugins/intuitive-custom-post-order/

テーマで優先された投稿一覧の並び順を変更する方法

WP_Queryで表示順をカスタマイズする方法

new WP_Query()で新たな並び順を、独自で設定しています。

new WP_Queryは、最後に wp_reset_postdata() 関数を必ず実行するようにしましょう。

//---------------------
//独自の投稿並び順
//---------------------
 $args = array(
      'orderby' => 'tile',//タイトル順
      'order' => 'desc'//降順
 );
 $the_query = new WP_Query($args);

//------------
//表示
//------------
while ( $the_query->have_posts() ) {
	$the_query->the_post();
	the_title();
	the_content();
}
 wp_cache_init();//キャッシュクリア
 wp_reset_postdata(); wp_reset_query();//postクリア、queryリセット 

上のプログラムだと、絞り込み条件がないので投稿記事をタイトル順に全部取得します。実際に使う場合は、カテゴリIDを指定して、以下のように使います。

子テーマの中に、カテゴリページ(categpry.php)を独自で作ります。HTMLをシンプルにすると以下のようなプログラムになります。

<?php

 $cat = get_the_category();//カテゴリデータ配列を取得
 $cat_ID = $cat[0]->cat_ID;//カテゴリIDを取得
 $category_count = $cat[0]->category_count;//カテゴリの投稿数

//---------------------
//独自の投稿並び順
//---------------------
 $args = array(
      //'category_name' =>”カテゴリのスタッグ”,
      'category__in' => $cat_ID,
      //'orderby' => 'tile',//タイトル順
      'orderby' => "menu_order", //Intuitive Custom Post Order:プラグインの並び順
       'order' => 'desc'//降順
 );
 $the_query = new WP_Query($args);

  if(  $the_query->have_posts() ): 
       while($the_query->have_posts() ): $the_query->the_post();
?>
         <!-- 一覧表示 HTML -->
         <a href="<?php echo esc_url(get_the_permalink()); ?>" alt="<?php the_title(); ?>" >
            <?php 
        //サムネ(アイキャッチ)画像
        if(has_post_thumbnail()): ?>
               <img src="<?php the_post_thumbnail_url(); ?>" alt="<?php get_the_title(); ?>">
            <?php 
         endif;//------ 
      ?>
           <h2><?php the_title(); ?></h2>
         </a>
<?php
     endwhile;
  endif;
   wp_cache_init();//キャッシュクリア
   wp_reset_postdata(); wp_reset_query();//postdataクリア、queryリセット 
 //end--------------
?>

こうすることによって、add_action(‘pre_get_posts’, 任意の関数名)を使わずに、並び順を自由にカスタマイズすることができます・

サイドのウィジェット・カテゴリの並び替え

add_filterをつかった並び替え

同じ要領で、ウィジェットの「カテゴリ」の表示順の並び替えができます。

//カテゴリーを投稿数順に変更する
function categories_order($cat_args) {
    $cat_args['orderby'] = 'count';
    $cat_args['order'] = 'DESC';
    return $cat_args;
}
add_filter('widget_categories_args', 'categories_order', 10);

タイトルとURLをコピーしました