こんばんは!
T.R.Imaginationの北野です!
今日はTCDのWordPressテーマ「GENSEN」のカスタマイズのお話。
だいぶニッチな内容ですみません(汗
輸出ビジネススクールFLAG生向けのコンテンツサイトをWordPressで作成していまして、それに適用しているテーマがこの「GENSEN」です。
こんな要望が届きました。
「検索結果の表示を、人気順(閲覧数順)にして欲しい」
今年に入ってから配置替えで、FLAGの指導や運営からは外れているのですが、取り組んでみました!
変更する箇所は2箇所。
1つ目は、custom_search_results.php
20行目辺り
// sort
if (!empty($_REQUEST['sort']) && in_array($_REQUEST['sort'], array('date_asc', 'date_desc', 'views'))) {
$sort = $_REQUEST['sort'];
} else {
$sort = 'date_desc';
}
$sort_base_url = remove_query_arg('sort');
$sort_base_url = preg_replace('#/page/\d+#', '', $sort_base_url);
ここの、
$sort = ‘date_desc’;
を
$sort = ‘views’;
に変更。
もう1つは、functions.php
920行目辺り
// ソート処理 pre_get_posts
function sort_pre_get_posts( $wp_query ) {
// 管理画面は終了
if ( is_admin() ) return;
// メインクエリー・アーカイブ以外は終了
if ( ! $wp_query->is_main_query() && ! $wp_query->is_archive() ) return;
// ソート
if ( isset( $_REQUEST['sort'] ) ) {
//閲覧数順
if ( $_REQUEST['sort'] === 'views' ) {
$wp_query->set( 'meta_key', '_view_count' );
$wp_query->set( 'orderby', 'meta_value_num' );
$wp_query->set( 'order', 'DESC' );
// 日時昇順
} elseif ( $_REQUEST['sort'] === 'date_asc' ) {
$wp_query->set( 'orderby', 'date' );
$wp_query->set( 'order', 'ASC' );
}
} else {
// 日時降順
$wp_query->set( 'orderby', 'date' );
$wp_query->set( 'order', 'DESC' );
}
}
add_action( 'pre_get_posts', 'sort_pre_get_posts' );
ここの、ソートのプログラムを
// ソート
if ( isset( $_REQUEST['sort'] ) ) {
// 日時降順
if ( $_REQUEST['sort'] === 'date_desc' ) {
$wp_query->set( 'orderby', 'date' );
$wp_query->set( 'order', 'DESC' );
// 日時昇順
} elseif ( $_REQUEST['sort'] === 'date_asc' ) {
$wp_query->set( 'orderby', 'date' );
$wp_query->set( 'order', 'ASC' );
}
} else {
//閲覧数順
$wp_query->set( 'meta_key', '_view_count' );
$wp_query->set( 'orderby', 'meta_value_num' );
$wp_query->set( 'order', 'DESC' );
}
に書き換えてやると、最初に閲覧数順で表示されるようになります!
上記は、
テーマのファイルを直接編集する場合ですが、
実際には子テーマで実装しました。
子テーマの場合、functions.phpだけ
子テーマ→親テーマの順番で読み込まれるのでちょっと複雑。
親テーマでの処理を無効化してオーバーライド(上書き)してやる必要があります。
// ソート処理 pre_get_posts
function sort_pre_get_posts_child( $wp_query ) {
// 管理画面は終了
if ( is_admin() ) return;
// メインクエリー・アーカイブ以外は終了
if ( ! $wp_query->is_main_query() && ! $wp_query->is_archive() ) return;
// ソート
if ( isset( $_REQUEST['sort'] ) ) {
// 日時降順
if ( $_REQUEST['sort'] === 'date_desc' ) {
$wp_query->set( 'orderby', 'date' );
$wp_query->set( 'order', 'DESC' );
// 日時昇順
} elseif ( $_REQUEST['sort'] === 'date_asc' ) {
$wp_query->set( 'orderby', 'date' );
$wp_query->set( 'order', 'ASC' );
}
} else {
//閲覧数順
$wp_query->set( 'meta_key', '_view_count' );
$wp_query->set( 'orderby', 'meta_value_num' );
$wp_query->set( 'order', 'DESC' );
}
remove_action( 'pre_get_posts', 'sort_pre_get_posts' );
}
add_action( 'pre_get_posts', 'sort_pre_get_posts_child', 100 );
という感じで、
remove_actionで親テーマの処理を無効化して、
add_actionの優先順位をデフォルトの10より上の数値を指定してやれば
親テーマよりも後に読み込まれるので、
これで適用されることになります!
functionsフォルダの中のcustom_search.phpにもソートの記述がありましたが、そこは触らなくても実現できたので今回は触ってません。
まとめてみるとこれだけのことなのですが、
ここにたどり着くまでトライ&エラーで吾輩のCPUはオーバーヒートしそうでした(笑