質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

1回答

3164閲覧

自作のショートコードで出力したテーブルの内容がWordPressのサイト内検索でヒットしない

skm

総合スコア11

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2018/05/12 15:20

環境

wordpress 4.9.5

問題

投稿記事内ににテーブルを設置したく、これまでTeblePressというプラグインを使って作成していました。
ところが編集画面の使い勝手があまりよくなかったので、データの編集はwindowsマシン上でcsvをExcelで編集し、VBAでUTF-8で出力後にTablePressにアップする方法で運用していました。
ただ、それさえも面倒に感じるようになり、CSVをサーバーに上げてそのままテーブルタグを出力する自作のプラグインを作成しました。
ショートコードを登録し、記事中では[ショートコード CSVファイル名]の形式で出力されるようにして満足していたのも束の間、なんとサイト内検索に引っ掛かりません。
TablePressで作成されたテーブルのデータはしっかりとサイト内検索にヒットします。
独自ショートコードによるテーブルもCtrl+FでWebページを検索するとしっかり選択されます。

「WordPress サイト内検索 出ない」等のキーワードでググって原因を調べたのですが、検索フォームのaction属性に関するものばかりでした。
使用しているテーマではsearchform.phpを用意しておらずデフォルトのものが使われており、デフォルトではaction属性はhome_urlになっているはずです。
テーマを初期のものに戻したり、配布されている色々なテーマに変えたり試してみたのですが、いずれのテーマでもサイト内検索には引っ掛かりませんでした。

独自ショートコードでのテーブル出力はSplfileobjectでCSVファイルを読み込み、テンプレートとなるphpファイルをincludeしてHTMLタグを記述しています。
そのままだとショートコード部分の出力が記事の一番上に来てしまっていたので、テンプレートのinclude前後にob_Startとob_get_creanが書かれています。

独自ショートコードの関数の記述に問題があるのではないかと思っているのですが、解決方法がわかる方いらっしゃらないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なんとサイト内検索に引っ掛かりません。

WordPressの検索は特定のテーブル内のデータに対して行われるため、DB内にも無いデータは検索にかかりません。

投稿2018/05/12 15:27

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skm

2018/05/12 15:34

回答ありがとうございます。 記事中のショートコードで埋め込んだHTMLは自動的に記事本文としてデータベースに登録されず、独自ショートコードを登録した際は、それをデータベースに登録する処理も必要になる、ということでしょうか?
kei344

2018/05/12 15:37

ショートコードは表示する際に書き換わる物なので、そもそもDBに入れて使うようなことはしません。
kei344

2018/05/12 15:40

ページが呼び出されたときに、本文内にあるショートコードを置き換え(ショートコードに登録している関数で中身を置き換え)て表示されます。
skm

2018/05/12 15:53

すみません、語弊がありました。 ショートコードそのものをデータベースに登録しようと考えたのではなく、ショートコードが置き替えられた文字列を、という意味でした。 kei344さんからのヒントを元にまたさらに調べたのですが、フィルターフックという機能?で検索対象をいじっていけば望むような結果が得られそうな気がするのですが、合っていますか? TablePress等の独自ショートコードを用いるプラグインでは 1.記事本文に独自ショートコードが書かれているかを調べて 2.存在する場合にのみapply_filtersでショートコードを展開した本文を取得して 3.改めてショートコード展開済の本文に対してフォームに入力された文字列で検索をかける という処理をしているのでしょうか? スマートな解決方法があればアドバイスが欲しいです。
kei344

2018/05/12 16:08

> ショートコードそのものをデータベースに登録しようと考えたのではなく、ショートコードが置き替えられた文字列を、という意味でした。 それはショートコードを使って行う処理ではないですね。保存時にフックかけて置き換えるとかすればできなくは無いと思いますが。(さっと説明できるレベルの物ではありません) > という処理をしているのでしょうか? 違います。コードを確認していませんが、データは多分カスタムフィールドに入っているはずです。 > スマートな解決方法があればアドバイスが欲しいです。 記事構成や運用方法によりますが、WP REST API でVBAから直接 書き込めばよいかと思います。 【WP REST API v2 Documentation】 https://ja.wp-api.org/
kei344

2018/05/12 16:11

> フィルターフックという機能?で検索対象をいじっていけば望むような結果が得られそうな気がするのですが、合っていますか? これに回答していなかったですね、合っていません。DB外にあるCSVを検索対照にはできません。
skm

2018/05/12 16:40

ご紹介いただいたWP REST APIの使い方について調べてみましたが・・・ ちんぷんかんぷんでしたorz まだwordpress始めて2か月足らずのド初心者ですので、今回私がやりたいことに対して学習コストが高すぎる気がするのでこの方法は諦めます。 記事内に[mytable filepath=hoge.csv]というショートコードが書かれていて、そのショートコードがcsvファイルを読み込んでテーブルタグに置き換えているだけのものなのですが、検索に関する関数やフックにフィルターをかけるだけでは無理なのでしょうか?
kei344

2018/05/12 16:46

◆ 保存時 記事内にショートコードを書く ↓ DBに保存(ショートコード文字列そのまま) ◆ 表示時 DBから記事を取得 ↓ 取得された文字列から、ショートコード文字列を置き換え(PHPで処理) ↓ 表示 ◆ 検索時 DBの中の記事がある場所から検索キーワードをDBの機能(SQL)で探す。(DBで処理) ⇒ 当然ショートコードは展開されないし、ファイルとして置いてあるCSVはここでの処理には使われない
kei344

2018/05/12 16:47

> 検索に関する関数やフックにフィルターをかけるだけでは無理なのでしょうか? 無理です。
kei344

2018/05/12 16:50

検索対象にしたい文字列は、DBに入っている必要があります。WordPressで一般的にはカスタムフィールドを利用することが多いです。(カスタムフィールドはデフォルトでは検索対象外なのでフィルタ/フックを使うことになります)
skm

2018/05/12 17:20

すごくわかりやすい説明ありがとうございました。 wordpressの検索の仕組みが、全投稿をforeachとかで回してキーワードを探しているようなものと考えてました。 SQLで検索されているから、DBに入れないことには難しいわけですね・・・。 >>それはショートコードを使って行う処理ではないですね。保存時にフックかけて置き換えるとかすればできなくは無いと思いますが。(さっと説明できるレベルの物ではありません) 回答いただいたこちらのコメント、理解が遅くなってしまいましたが「記事の保存時にショートコードを展開してカスタムフィールド等DBに保存する」等の方法を示していたのですね。 やることは 1.save_post等のフックを使ってショートコード展開後の本文をDBに格納 2.posts_search等のフィルターでSQL文を加工してカスタムフィールドを検索対象にする という手順でしょうか? 頑張ってみます。
kei344

2018/05/12 17:36

> やることは そんな感じです。 「ショートコード展開後の本文」を「本文」に入れてしまえば「posts_search等のフィルター」での処理が不要になります。
skm

2018/05/12 17:54

ありがとうございます。 kei344様のおかげで仕組みを理解することができました。 同時に私がやろうとしていることは結構難しい内容なんだな、と改めて気づきました。 製作中のサイトには記事が数百あり、いくつかのcsvファイルをデータベース代わりにして記事内では記事タイトルをもとにショートコードを使ってcsvファイル内の条件に合う行を抽出することでcsvファイルひとつを編集するだけで全ての記事の内容が置き換わるようにしていました。 ここで新たに発生する問題に気づきまして・・・ショートコード展開後の文字列をカスタムフィールド等DBに格納することで検索対象にすることができたとしても、save_postフックで処理をしていたらcsvファイルの更新時に全ての記事を開いて更新、とやらなければいけないですねorz csvをDBにインポートすれば記事ではDBから表示できて、検索もフィルターをかければDBの文字列にヒットしますが、肝心な記事との関連付けがどうなるのかわからなくなってきました。 自分ではすごく単純なことをやろうとしているつもりだったのですが、すごく複雑な気がしてきました。 もう完全にスレッドの趣旨とも違う問題になってしまったので、とりあえず解決済にします。 長々とお付き合いいただき、本当にありがとうございましたm(__)m
skm

2018/05/12 18:02

ぱっと思いついたのがプラグイン側の処理でcsvをアップした際にcsvからデータを取得しているすべての記事に更新をかける、って方法でしたが、無駄に重たい処理になりそうですよね。 根本的に作り方を間違えた感があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問