カタカナとひらがなの区別検索、人気順ソート WordPress

WordPressの標準の検索フォームから「バス」で検索すると、パスタの「パス」、ひらがなの「ばす」「はす」でもヒットすることに気づいて改善を試みた。

ひらがなとカタカナは区別したい。

乗り物のバスを検索しているのに、パスタの記事が出てきては混乱する。

そうすると、最初は検索結果で332件ヒットしていたのが、179件に減ってスッキリした。

Custom Post Order プラグインを使うと検索結果の順番がおかしくなる

最初は検索結果の表示順もおかしかった。

最初の方の記事に、「バス」の語句が全く含まれていない。

検索語句の重要度と無関係な順番に検索結果が表示されていた。

 

それで、検索した時に、どういうSQL Query が発生しているのかLog を取って調べてみた。

 130 Query     SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND (((wp_posts.post_title LIKE '%バス%') OR (wp_posts.post_excerpt LIKE '%バス%') OR (wp_posts.post_content LIKE '%バス%')))  AND (wp_posts.post_password = '')  AND wp_posts.post_type IN ('post', 'page', 'attachment') AND (wp_posts.post_status = 'publish')  ORDER BY wp_posts.post_title LIKE '%バス%' DESC, wp_posts.post_date DESC LIMIT 0, 18
 130 Query     SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND (((wp_posts.post_title LIKE '%バス%') OR (wp_posts.post_excerpt LIKE '%バス%') OR (wp_posts.post_content LIKE '%バス%')))  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.menu_order ASC LIMIT 0, 18

これをフォーマットして見やすくする。

SELECT SQL_CALC_FOUND_ROWS
  wp_posts.ID
FROM
  wp_posts
WHERE
  1 = 1 AND(
    (
      (wp_posts.post_title LIKE '%バス%') OR(
        wp_posts.post_excerpt LIKE '%バス%'
      ) OR(
        wp_posts.post_content LIKE '%バス%'
      )
    )
  ) AND(wp_posts.post_password = '') AND wp_posts.post_type IN('post',
  'page',
  'attachment') AND(wp_posts.post_status = 'publish')
ORDER BY
  wp_posts.post_title LIKE '%バス%' DESC,
  wp_posts.post_date DESC
LIMIT 0, 18


SELECT SQL_CALC_FOUND_ROWS
  wp_posts.ID
FROM
  wp_posts
WHERE
  1 = 1 AND(
    (
      (wp_posts.post_title LIKE '%バス%') OR(
        wp_posts.post_excerpt LIKE '%バス%'
      ) OR(
        wp_posts.post_content LIKE '%バス%'
      )
    )
  ) AND wp_posts.post_type = 'post' AND(
    wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private'
  )
ORDER BY
  wp_posts.menu_order ASC
LIMIT 0, 18

このように2回、同じような検索要求が発生している。

2回目が、Intuitive Custom Post Order プラグインから発生しているQuery ではないか。

これがなければ、

ORDER BY
  wp_posts.post_title LIKE '%バス%' DESC,
  wp_posts.post_date DESC

のように、タイトルに検索語が含まれている、重要度の高い順に表示されるはずである。

それで、Intuitive Custom Post Order を、

プラグインロードフィルターの設定で、アドミン頁のみで有効にし、その他の記事の頁、検索結果の頁では無効にした。

すると、そのような順番で表示されるようになった。

Intuitive Custom Post Order はカテゴリーの表示順番を変更するために導入したのだが、弊害が大きいようだ。

ひらがなとカタカナの区別検索

データーベースの照合順序 COLLATE、キャラクターセットが、utf8mb4_unicode_ci になっているのを、utf8mb4_general_ci で検索するように指定すればよかった。

functions.php に次を追加する。

//ひらがな・カタカナ区別検索
function change_search_char( $where, $obj ) {
if ( $obj->is_search ) {
    $where = str_replace(".post_title", ".post_title COLLATE utf8mb4_general_ci", $where );
    $where = str_replace(".post_content", ".post_content COLLATE utf8mb4_general_ci", $where );
}
return $where;
}
add_filter( 'posts_where', 'change_search_char', 10, 2 );

人気順に並び替え機能追加

アクセス数の多い順に記事を並び替える機能も追加した。

WP-PostViews プラグインをインストールしていると、記事毎にアクセス数が記録されている。記事に「views」という metaデータが付加される。

functions.php に次を追加する。

//人気順に並べ替え 
function add_meta_query_vars( $public_query_vars ) {
    $public_query_vars[] = 'meta_key'; //カスタムフィールドのキー
    $public_query_vars[] = 'meta_value'; //カスタムフィールドの値(文字列)
    return $public_query_vars;
}
add_filter( 'query_vars', 'add_meta_query_vars' );

 

ページングには、WP-PageNavi プラグインを使用する。インストールして有効化する。

検索結果が表示されるテンプレート(search.php など)に、次を追加する。

 

<section id="pager_wrap">
  <div class="wp_pagenavi_dir"><?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?></div>
  <div class="wp_pagesort_dir">
    <ul>
        <li><a href="<?php echo add_query_arg( array('orderby' => 'date', 'order' => 'ASC'), preg_replace('/&.*/', '', get_pagenum_link(1)) ); ?>">古順</a></li>
        <li><a href="<?php echo add_query_arg( array('orderby' => 'date', 'order' => 'DESC'), preg_replace('/&.*/', '', get_pagenum_link(1)) ); ?>">新順</a></li>
		<li><a href="<?php echo add_query_arg( array('meta_key' => 'views', 'orderby' => 'meta_value_num', 'order' => 'DESC'), preg_replace('/&.*/', '', get_pagenum_link(1)) ); ?>">閲覧多順</a></li>
        <li><a href="<?php echo add_query_arg( array('meta_key' => 'views', 'orderby' => 'meta_value_num', 'order' => 'ASC'), preg_replace('/&.*/', '', get_pagenum_link(1)) ); ?>">閲覧少順</a></li>
    </ul>
  </div>
</section>

get_pagenum_link(1)

は、並び順を変える時に、最初のページに戻ることを意味する。

 

CSSは次のように style.css に追加する。

#pager_wrap {
	overflow: hidden;
	max-width: 800px;
	margin: 20px auto;
	clear: both;
}

@media only screen and (max-width: 767px) {
	#pager_wrap {
		text-align: center;
	}
}

@media only screen and (max-width: 767px) {
	.wp_pagenavi_dir {
		margin-bottom: 10px;
	}
}

@media only screen and (min-width: 768px) {
	.wp_pagenavi_dir {
		float: left;
	}
	.wp-pagenavi a,
	.wp-pagenavi span {
		text-decoration: none;
		border: none;
		padding: 3px 9px;
		margin: 0 2px;
		background: lawngreen;
		color: #006400;
		display: inline-block;
		font-size: 14px;
		border-radius: 40%;
	}
	.wp-pagenavi a:hover {
		text-decoration: none;
		background: #006400;
		color: white;
	}
	.wp-pagenavi span.current {
		background: #006400;
		color: #fff;
	}
}

@media only screen and (max-width: 767px) {
	.wp_pagesort_dir {
		display: inline-block;
	}
}

@media only screen and (min-width: 768px) {
	.wp_pagesort_dir {
		float: right;
		border-radius: 20%;
	}
}

.wp_pagesort_dir ul {
	overflow: hidden;
}

.wp_pagesort_dir li {
	float: left;
	margin: 0 5px 0 0;
}

.wp_pagesort_dir a {
	display: inline-block;
	background: lawngreen;
	border: none #006400;
	padding: 2px 9px;
	font-size: 14px;
	border-radius: 20%;
}

.wp_pagesort_dir a:hover {
	background: #006400;
	color: white;
}

 

すると、このように表示される。

 

検索語句をハイライト表示する

検索結果のページで、検索したキーワードをハイライト表示するには、Highlight Search Terms プラグインを利用する。

インストールするだけで蛍光黄色で表示されるようになる。

独自のCSSで色を変更することもできる。

Highlight Search Terms はJquery に依存していて、ヴァージョン1でしか動かない。Jquery 3では動かない。

 

 

 

 

  • またまたこのサイトのSSL証明書が期限切れになった。 Kusanagi の自動更新ができていない。 それで手動であれこれしてみても、こんなエラーが出る。# kusanagi update cert Challenge failed for domain makotoiwasaki.com Challenge failed for domain www.makotoiwasaki.com Attempting to renew cert (makotoiwasaki.com) from /etc/letsencrypt/renewal/makotoiwasaki.com.conf produced an unexpected error: Some challenges hav...
  • Google の Indexing API を使うと、新しい投稿記事を瞬時にGoogleの検索エンジンに登録できる。 WordPress のプラグインとしてインデックスAPIが利用できる。使い方は英語だが、この通り: ⏱️ Get Google To Index Your Website Instantly Using the Indexing API ⚡Take a look at how you can use Google's new indexing API & to get your website's pages and content crawled instantly instead of waiting for Google to...
  • Yoast SEO を停止して、Rank Math SEO プラグインを使ってみたらGoogle の検索結果に表示される記事抜粋スニペットの文字数が短過ぎに見えてびっくりした。#1 Yoast Alternative You Deserve - Rank Math SEO vs. Yoast SEORank Math SEO plugin for WordPress is hands down the best Yoast alternative WordPress plugin. And the best thing is, Rank Math is completely FREE!Rank Math
  • WP_CRON を停止して、Linux の crontab に移行する設定をこれまでに何度も試みたがうまくいかなかった。 毎日バックアップされるはずの、UpdraftPlus プラグインのクロンが動いていない。やっと成功した設定方法を記録しておく。wp-config.php に次の行を追加する。define('DISABLE_WP_CRON', true);/var/spool/cron  に、  httpd という名前のファイルを作成し、次の1行を追加する。 所有者を httpd.www など、httpd nginx サーバーの稼働ユーザー名と同じにする。nginx.conf に書いてある。root@s4:/v...
  • Kusanagi WordPress プラットフォームでは Fcache とBcache がある。 Fcache とはNginx ヱブサーバーのキャッシュ機能であり、Kusanagi の独自機能ではない。Nginx のアクセスログを眺めていると、  BYPASS MISS EXPIRED のみで、HITが殆どない。 トップ頁、アーカイブリストの頁ではHIT、 個別投稿頁では、BYPASS MISS EXPIRED ばかりでHITがない。Kusanagi fcache on とすると、fcache は有効になったかのように思えるが、本当にキャッシュが効いているのかどうかはログで確認しないとわからない。まず、Wordpressの編集画面にログインし...
  • HTTPD アクセスログの日本語化 Nginx,  Apache ヱブサーバーのアクセスログを見ると、日本語URLはエンコードされていて読めない。 そこで、デコードして表示させる。 ログのファイル名が ssl_access.log だとすると、tail -f ssl_access.log| perl -ne 'use URI::Escape; print uri_unescape($_);' tail -f access.log | php -R 'echo urldecode($argn)."\n";'で、日本語URlが読める状態で出力される。 Apacheのログをデコードする方法 - Life with ITプログラマ x ...
  • ヱブサイトの再構築中には、スタイルシート、style.css を頻繁に調整更新する。 CSSを追加、編集する度に再読み込みを繰り返して、変更の反映を確認していた。 これで編集者は反映を確認できるのだが、一般閲覧者はわざわざ再読み込みしたり、キャッシュを削除したりするはずはないので、変更が反映されていない崩れたデザインを見ているかもしれない。わざわざリロードしたりキャッシュを削除したりしなくても変更が確実に反映されるような設定方法を発見した。wp_enqueue_scripts で CSS、JS の読み込みを管理している場合には、次のようにfunctions.php に記述する。// 子テーマのstyle.cssを最後に読み込む add_acti...
  • 2679年8月25日

    頁カウンターの比較 WordPress

    WordPressで使える頁カウンターをいくつか同時に使ってカウントの仕方の違いを比べてみた。WP-PostViews    長期常用中 Post Views Counter  新規インストール Google Analytics Post Pageviews Pjaxblog の付属カウンター機能WP-PostViews は他のカウンターよりもカウントが多くなりがちなことに気づいた。一度のアクセスなのに2回カウントされることもあるようだ。ロボットクローラー Bots のリスト数も不十分に少ないような気がする。それで数が多くなりやすいのではないか。 それで Post Views Counter に乗り換えることにした。Post Views Cou...

WordPress カテゴリ人気記事 Views most

タグ関連記事

閲覧履歴