KBoard 移行プラグインを使用して GNUBOARD 掲示板の投稿 WordPress Kboard掲示板に移行した記事 WordPress 検索機能で検索できない問題で数日間苦労しました。最初はKBoard(KBoard)独自の検索プログラムをカスタマイズし、統合検索が可能であるという話を聞き、シャベルを頑張って検索が可能にしました。しかし、 エレメンプロの検索結果テンプレートで実装された検索ページで KBoard 投稿が検索されない問題が発生しました。
KBoard 文章がエレメンタの検索システムで検索されるようにまた一生懸命作業してやっと成功することができました。しかし、投稿が多すぎて検索速度が遅すぎました。この問題をもう一度解決するのに時間がかかりました。
KBoard 投稿 WordPress 検索システムやエレメント検索機能、またはカスタムポストタイプをサポートする検索プラグインで検索できない場合は参考にしてください。
Kboardの投稿が検索されない問題(検索オプションの一括変更)
WordPress KBoard 掲示板から文を書くと WordPress 基本検索システムと検索プラグインで検索になります。
しかし、移行プラグインを使用して GNUBOARDまたはXE、ゼロボードなどから移行した場合 WordPress 検索機能で検索できない場合があります。
kboard_list_whereフィルタを使用して検索するようにカスタマイズする
この問題に対して、Kboardの関係者は kboard_list_where フィルターの使い方をご案内しています。
kboard_list_where フィルタを使用して無理やり検索できるようにすることはできますが、コードを作成するのは簡単ではありません。
私はこのフィルタを使ってやっと KBoard 投稿が検索されるようにしましたが、エレメンタ検索結果ページと連動しませんでした。
原因を特定する
何が起こったのでしょうが、問題を解決するには原因を特定することが重要です。症状に対していちいち対応してみると牛の後ろにぶつかるネズミ捕るように問題が解決することもありますが、一つを解決すると別の問題が発生することがあります。
新規文は検索になりますが、他のCMSの掲示板から移転した文は検索にならないことがおかしく、DBで既存文と新規文を比較してみました。両者には1つの違いがありました。新規に書かれた投稿は wp_kboard_board_content テーブル内の検索列の値は「1」でしたが、検索されていない投稿の場合は、検索列の値が「3」でした。
searchの値が3の場合、Kboardプラグインのファイルソースを確認してください。 deletePost() 関数が実行されるようになっていました。
if($post_id){
if($data['search'] == 3){
$this->deletePost($post_id);
}
else{
$this->updatePost($post_id, $data['member_uid']);
}
}
このため、search = 3の投稿は WordPress 基本検索システムでは検索されていないようです。 (注: 書き込み時にシークレットオプションをチェックすると、search 値が 2 に指定されるようです。)
単にDBでsearch = 3をsearch = 1に置き換えると、問題は解決しませんか?このように考えることができるでしょう。私もそう思いましたが、データベースで一括変更しても再検索されませんでした。ちなみに、次のSQLクエリを実行してsearch = 3の場合は、まとめて1に変更できます。
UPDATE wp_kboard_content
SET search = 1
WHERE search = 3;
そして、既存の記事を手動で更新すると検索になりましたが、DBで更新日を現在の日付に変更しながら更新しても同様に検索に反映されませんでした。
この問題を検索してみると、4月に Kboardフォーラムに同じ症状について質問をした方がいらっしゃいますね。
以前の投稿をkboardに一括転送しましたが、統合検索オプションが検索除外に入っていました。 (search='3')
統合検索をタイトルとコンテンツ検索にまとめて変更したいと思います。 (search='1')
DBでwp_kboard_board_contentのsearchを1に変更しましたが、すぐには適用されず、毎日書き直す必要があります。
もし一括更新などの機能があるのでしょうか?
KBoard 担当者の方は、ここに対してSQL文を使ってDBを修正してくださいという回答をしています。
phpMyAdminなどのMySQLクライアントツールでSQLクエリを使用して一括変更する場合、検索インデックスには含まれないようです。
記事を手動で更新すると、インデックスに追加されるように見え、記事を更新すると、どのメカニズムによって検索されるかが変わります。
これを知るために KBoard プラグインを分析する必要がありますが、簡単ではありません。これに関しては / WP-コンテンツ/plugins/kboard/class ディレクトリの下 KBContent.class.php ファイルを分析するとヒントが得られます。
いくつかのコードを作成してテストしましたが、投稿が多すぎて実行中に 504 Gateway Timeoutエラーが発生しました。サーバーリソースを十分に大きく増やしても、同じ症状が現れました。
最後に すべての掲示板の投稿に対してKboard独自の関数updateContent()関数を実行するようにコードを書くしました。実行は100個ずつ分けて進めるようにし、504 Gateway Timeoutエラーやメモリ制限サイズ超過による致命的なエラーが発生しないようにしました。
検索オプションを一括変更するコードは次のとおりです。
<?php
/*
Plugin Name: KBoard Update with KBContent
Description: Update all KBoard posts using KBContent class and set member_uid to 0.
Version: 2.2
Author: Your Name
*/
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly.
}
// Include KBoard classes if not already included
if (!class_exists('KBContent')) {
include_once WP_CONTENT_DIR . '/plugins/kboard/class/KBContent.class.php';
}
function kboard_update_posts_with_kbcontent($batch_size = 100) {
global $wpdb;
$table_name = $wpdb->prefix . 'kboard_board_content';
// Get the last processed ID
$last_processed_id = get_option('kboard_update_last_id', 0);
$start_time = time();
$time_limit = 300; // 5 minutes execution time limit
$updated_count = 0;
while (true) {
$posts = $wpdb->get_results($wpdb->prepare(
"SELECT * FROM $table_name WHERE uid > %d ORDER BY uid ASC LIMIT %d",
$last_processed_id,
$batch_size
));
if (empty($posts)) {
break; // No more posts to process
}
foreach ($posts as $post) {
$content = new KBContent();
$content->initWithUID($post->uid);
if ($content->uid) {
// Update the 'update' field, ensure 'search' is set to 1, and set 'member_uid' to 0
$data = array(
'update' => date('YmdHis', current_time('timestamp')),
'search' => '1',
'member_uid' => 0
);
$result = $content->updateContent($data);
if ($result !== false) {
$updated_count++;
echo "Updated KBoard post UID: {$content->uid}<br>";
} else {
echo "Failed to update KBoard post UID: {$content->uid}<br>";
}
} else {
echo "Skipped invalid KBoard post UID: {$post->uid}<br>";
}
$last_processed_id = $post->uid;
flush();
// Check if we're approaching the time limit
if (time() - $start_time > $time_limit) {
break 2; // Break both foreach and while loops
}
}
// Update the last processed ID
update_option('kboard_update_last_id', $last_processed_id);
wp_cache_flush();
$wpdb->queries = array();
}
echo "<br>Total updated posts in this session: {$updated_count}<br>";
echo "Last processed ID: {$last_processed_id}<br>";
// Check if we've processed all posts
$remaining_posts = $wpdb->get_var("SELECT COUNT(*) FROM $table_name WHERE uid > $last_processed_id");
if ($remaining_posts == 0) {
echo "All posts have been processed!<br>";
delete_option('kboard_update_last_id');
} else {
echo "There are still approximately {$remaining_posts} posts to process.<br>";
}
}
// Create a menu item in the admin panel
function kboard_update_menu() {
add_management_page(
'KBoard Update',
'KBoard Update',
'manage_options',
'kboard-update',
'kboard_update_page'
);
}
add_action('admin_menu', 'kboard_update_menu');
// Display the update page
function kboard_update_page() {
?>
<div class="wrap">
<h1>KBoard Update</h1>
<p>This will update all KBoard posts using the KBContent class and set member_uid to 0.</p>
<form method="post" action="">
<?php wp_nonce_field('kboard_update_action', 'kboard_update_nonce'); ?>
<input type="submit" name="update_kboard_posts" class="button button-primary" value="Start/Resume Updating KBoard Posts">
<input type="submit" name="reset_update_process" class="button button-secondary" value="Reset Update Process" onclick="return confirm('Are you sure you want to reset the update process? This will start over from the beginning.');">
</form>
<div id="update-results">
<?php
if (isset($_POST['update_kboard_posts']) && check_admin_referer('kboard_update_action', 'kboard_update_nonce')) {
kboard_update_posts_with_kbcontent();
}
if (isset($_POST['reset_update_process']) && check_admin_referer('kboard_update_action', 'kboard_update_nonce')) {
delete_option('kboard_update_last_id');
echo "Update process has been reset. You can now start from the beginning.";
}
?>
</div>
</div>
<?php
}
ここで考慮すべき事項があります。上記のコードでは、更新日を現在の日付に更新します。更新日を維持したい場合は、上記のコードを適切に変更してください。
コードを実行する前に必ず バックアップを確認してください。
検索が遅い問題
KBoard 投稿が検索されるように問題を修正しましたが、問題が完全に解決されたわけではありませんでした。通常の場合問題はありませんが、投稿数が16万個を超えるため、検索に時間がかかりやすい別の問題が発生しました。
コンテンツが多すぎて検索時にディレイが発生した場合、検索インデックスを作成すればすばやく検索が可能です。
Ajax Searchプラグインなどを含むいくつかの検索プラグインを使用しても、検索速度が向上しませんでした。
この場合、 Relevanssiというプラグインを使用すると、検索する投稿を索引付けして検索速度を劇的に向上させることができます。
このプラグインは、 Elementorと互換性がありませんでしたが、今は互換性が良くなるようです。エレメンタのテーマビルダーで作成した検索結果テンプレートを使用すると、検索時にディレイがひどかったのですが、このプラグインを使用すると検索速度が大幅に改善されました。
Elementor Proの Theme Builderを使用すると、検索結果ページを含むヘッダー、フッター、カテゴリーページなど、サイトのほとんどすべてのセクションをコーディング作業なしでエレメントビルダーにすることができます。
Relevanssi検索インデックスプラグインを使用すると、検索速度のためにデフォルトで3文字以上の検索が可能です。 高度なインデックス設定 (Advanced indexing settings)で最小単語長(Minimum word length)を2文字に設定することができます。
ブログ投稿や掲示板の投稿などが多すぎて検索が遅い場合は、このプラグインの使用を検討してください。
コメントを残す