WordPress TCDテーマ「GENSEN」の検索結果をデフォルトで閲覧数順に変更する方法

こんばんは!
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はオーバーヒートしそうでした(笑