投稿同士の類似度の計算を行うWordpressのプラグインです。
関連記事の提供や全文検索を可能にします。
Details
- PHP 5.6 以上
- WordPress 5.0 以上
- 設定画面
- 処理中
- 有効化前
- 通常の検索の場合「WordPress」と「あああああ」を含まないとヒットしません。
- 有効化後
- 検索語からスコアを計算し高い順に表示するため、完全一致しない場合でも検索結果を出すことが可能です。
- 関連記事の確認
- 投稿一覧から選択した記事の関連記事及び類似度のスコアを確認できます。
- 重要語の確認
- 投稿一覧から選択した記事の重要語を確認できます。
- 最新版をGitHubからダウンロード
release.zip - 「プラグインのアップロード」からインストール

- プラグインを有効化
- 左メニュー「WP Related Post JP」 > 「進捗」から「インデックス処理を有効化」を押下
投稿データのインデックス化が終わるまではキーワード検索に使用されません。
インデックスの進捗は管理画面から確認できます。
-
char filter
- shortcode
- WordPressのショートコードを展開
- code
- プログラムコードを除外
- comment
- HTMLコメントを除外
- html
- HTMLタグを除外
- reference
- 文字実体参照を除外
- kana
- カタカナや英数字を全角半角に統一
- shortcode
-
tokenizer
- bigram
- igo
-
token filter
- common
- 空白文字を除去
- wakati (tokenizer: igo)
- 数字のみや記号のみを除外など
- bigram (tokenizer: bigram)
- 記号を含むものを除外など
- max
- 単語字数制限
- common
https://en.wikipedia.org/wiki/Okapi_BM25
https://mieruca-ai.com/ai/tf-idf_okapi-bm25/
- キーワード検索でも使用するかどうか
- 投稿記事同士の類似度計算のためのプラグインですが、計算結果はキーワード検索でも利用することが可能です。
- キーワード検索でも有効にするにはこの設定をtrueにします。
- バイグラムトークナイザーを使用するかどうか
- true:
文字列を2文字ずつ取り出して文章を構成する単語として使用します。 - false:
Igoという形態素解析器を使用します。
ローカルで動作させるため利用制限等はありませんが処理速度等はサーバに依存します。
- true:
関連記事を取得するクエリを生成する前に以下のアクションを発行します。
do_action( 'related_post/on_related_post' );
このアクションが発行された後の一回のみ、WP_Queryはこのプラグインで算出された関連記事を返します。
例えば関連記事用のテンプレートを以下のように呼び出しているテーマの場合、
get_template_part('related-list');
functions.php 等に記述するコードは以下のようになります。
add_action( 'get_template_part_related-list', function () {
do_action( 'related_post/on_related_post' );
} );
このプラグインの functions.php にはあらかじめいくつかのテーマ用のコードが記述されているため、それらを使用している方は別途設定は必要ありません。
以下のコードを貼り付けると関連記事が表示されます。
<?php wp_related_posts()?>
デフォルトでは記事のタイトルと本文がインデックスの対象になっています。タイトルに重みづけがされています。
str_repeat( $post->post_title . ' ', 3 ) . $post->post_content;
あらかじめ「本文のみ」「タイトルのみ」「タイトルと本文とタグ」を対象とする設定が別途用意されており、以下のようなプログラムを functions.php などに記述することで変更することが可能です。
add_filter( 'related_post/extractor', function () {
return 'content'; // 本文のみ
// return 'title'; // タイトルのみ
// return 'title_content_tags'; // タイトルと本文とタグ
} );
さらに以下のようなプログラムを記述することで、カスタムフィールドなどを含め自由に対象を設定することが可能です。
add_filter( 'related_post/extractor', function () {
return false;
} );
add_filter( 'related_post/extractor_result', function ($d, $post) {
return $post->title . ' ' . get_post_meta($post->ID, 'custom_field_key', true);
} );
related_post/related_posts_content をフィルタすることで関連記事の表示を変更することが可能です。
例:
<?php
add_filter( 'related_post/related_posts_content', function (
/** @noinspection PhpUnusedParameterInspection */
$content, $control, $title, $post, $related_posts
) {
/** @var \Related_Post\Classes\Models\Control $control */
/** @var string $title */
/** @var array $related_posts */
ob_start();
?>
<style>
.related_posts_content {
margin: 10px;
padding: 10px;
border: #ccc 1px solid;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-ms-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
background: white;
}
.related_posts_content:hover {
-webkit-box-shadow: #ccc 0 0 16px;
-moz-box-shadow: #ccc 0 0 16px;
box-shadow: #ccc 0 0 16px;
background: #f0ffff;
}
.link-item {
letter-spacing: -1em;
}
.link-item .thumbnail {
display: inline-block;
width: 20%;
margin: 0;
vertical-align: middle;
}
.link-item .thumbnail img {
vertical-align: middle;
}
.link-item .title {
display: inline-block;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
width: 80%;
padding: 1em;
margin: 0;
font-weight: bold;
letter-spacing: normal;
}
</style>
<div class="related_posts">
<h3 class="related_posts_title">
<?php $control->h( $title ); ?>
</h3>
<div class="related_posts_wrap">
<?php foreach ( $related_posts as $related_post ): ?>
<?php /** @var WP_Post $related_post */ ?>
<div class="related_posts_content">
<?php $control->url( get_permalink( $related_post->ID ), <<< EOS
<div class="link-item">
<div class="thumbnail">
{$control->get_thumbnail( $related_post->ID )}
</div>
<div class="title">
{$related_post->post_title}
</div>
</div>
EOS
, false, false, [], true, false ); ?>
</div>
<?php endforeach; ?>
</div>
</div>
<?php
$view = ob_get_contents();
ob_end_clean();
return $view;
}, 10, 5 );







