Intuitive Custom Post Order ver.2.1.0 をリリースしました。
WordPress > Intuitive Custom Post Order / WordPress Plugins
主に以下2点の問題点がフィックスされています。
2. ユーザ指定のクエリの優先
バックエンド処理の高速化
いままでは admin_init のフックしてリフレッシュ処理を走らせていました。
リフレッシュ処理とは、並び替えが有効になっている全オブジェクト(投稿タイプ)の menu_order を再構築する処理のことを指します。
admin_init にフックしているため、管理画面のどのページに遷移してもこの処理が走ることになり、レコード数が増えれば増えるほど、処理がバカ重くなっていました。最悪の場合サーバエラーになる。。
この致命的な問題を改善しました。
line 180
$result = $wpdb->get_results( "SELECT count(*) as cnt, max(menu_order) as max, min(menu_order) as min FROM $wpdb->posts WHERE post_type = '".$object."' AND post_status IN ('publish', 'pending', 'draft', 'private', 'future')" ); if ( count( $result ) > 0 && $result[0]->cnt == $result[0]->max && $result[0]->min != 0 ) { continue; }
menu_order の最大値とレコード数が一致して、かつ、最小値が 0 じゃない時はリフレッシュ処理がスキップされます。
つまり、リフレッシュ処理が走るのは、新規に記事が投稿された時、記事が削除された時、そのオブジェクトだけ、に限定され、バックエンドの処理を劇的に改善しました。
ユーザ指定のクエリの優先
ディフォルトの並び順は orderby=date, order=DESC となりますが、有効化されたオブジェクトは orderby=menu_order, order=ASC に自動的に並び変えられます。
ただし、特にサブクエリを生成する時、テンプレート側で明示的に orderby と order パラメーターを指定したい場合があります。
その場合は、ユーザ指定のクエリを優先する仕様にしました。
いままでもそうしてたつもりなのですが、多くの方からのレポートをまとめたところ、パラメーターの指定方法に問題があった、というか、すべての指定方法に対応していなかった、といえます。
メインクエリを改変する時、サブクエリを生成する時、ユーザ指定のパラメーター指定方法には2種類の記述があります。
/* 配列型 */ $args = array( 'orderby' => 'date', 'order' => 'DESC', ); /* 連結型 */ $args = 'orderby=date&order=DESC';
いままでは配列型のみサポートしていましたが、今回のアップデートにより、連結型でも正常に動作するようにしました。
クエリの発行方法は、以下4パターンで検証済みとなります。
/* default main query */ <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endwhile; endif; ?> /* query_posts */ <?php query_posts( $args ); ?> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endwhile; endif; ?> /* WP_Query */ <?php $query = new WP_Query( $args ) ?> <?php while ( $query->have_posts() ) : $query->the_post(); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endwhile; wp_reset_postdata(); ?> /* get_posts */ <?php $hoges = get_posts( $args ); ?> <?php foreach( $hoges as $post ) : setup_postdata( $post ); ?> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <?php endforeach; wp_reset_postdata(); ?>
その他のバグフィックス
メディアファイルの並び順への影響
管理画面のメディアファイル( post_type=attachment )の並び順がおかしくなる不具合がありました。
これは menu_order がすべて 0 のオブジェクトに対して order=ASC のみが効いていたことで、タイトルをキーに昇順表示されてしまうのが原因でした。
改修し、メディアファイルの並び順には一切影響しなくしました。
マルチサイトでの Warning 対応
マルチサイトで新規サイトを作成した場合、初回だけ Warning 警告が表示されていました。
動作には影響しませんが、警告が表示されないように改修しました。
初回有効化オブジェクトの並び順の整合性
すでに存在するオブジェクトに対して、初回に並び替えを有効化すると、それまでの並び順がおかしくなる不具合がありました。
これは menu_order がすべて 0 のオブジェクトに対して order=ASC のみが効いていたことで、タイトルをキーに昇順表示されてしまうのが原因でした。
これも改修し、初回に有効化されたオブジェクトの場合、ディフォルトの orderby=post_date, order=DESC に従って menu_order を振り分ける処理にしました。