こいつの扱い方について↓
「ここにタイトルを入力」フィールドに入稿する”記事タイトル”とは?
テンプレートタグ the_title() で出力表示されるデータ
wp_postsテーブルの post_title フィールドに格納されるデータ
ですが、
この”記事タイトル”というのは、管理UI上のタイトル(管理タイトル)であって、フロントに表示するタイトル(表示タイトル)とは、必ずしもイコールにはならない!
という考え方。
タイトル、タイトル、どれもタイトル、、っていう、言葉のあやみたいなもの、かな。
理由その1: そのまま表示タイトルとして使うにはイマイチなことがある
表示タイトルに改行を入れたい場合、「ここにタイトルを入力」フィールドに改行タグを書けば、いちおう、そのように表示はできる。
が、管理UIの投稿記事一覧における管理タイトルとして極めて見通しが悪いのは明らか。
ていうか、そもそも編集者(Editor)以上の権限アカウントでしかタグ入力はできない。(それ以下の権限アカウントではエスケープされる)
つまり「ここにタイトルを入力」フィールドにタグは入稿できない。
もし表示タイトルに改行を入れたい場合は、カスタムフィールドを用意することになる。
理由その2: WP_Queryに記事タイトルパラメーターがない
タイトルの部分一致検索でサブクエリを発行しようとした時、WP_Queryクラスには記事タイトルパラメーターがないことに気づく。
Codex: 関数リファレンス/WP Query
一方、カスタムフィールドには LIKE 検索とか、かなり自由にパラメーターを指定することができる。
記事タイトルパラメーターはそもそもない。。
まぁ自前でSQLを発行すればいいんだけど、もろもろ考えるとAPIを使った方がいいし、APIに記事タイトルパラメーターが用意されてない意味も勘ぐってしまうよねぇ。
ちなみに、記事タイトルの部分一致検索のサブクエリを実装する方法はあって、それについては後述。
ということで
そして、フロントに出力する表示タイトルは、これとイコールにならないのであれば、別途カスタムフィールドとして用意すると良い。
おまけ – 記事タイトルの部分一致サブクエリ
記事タイトルの部分一致サブクエリを実装するには、posts_whereフィルターにフックすれば実装は可能。
> functions.php
function custom_search_title( $where, &$wp_query ) { global $wpdb; if ( $search_word = $wp_query->get( 'search_title' ) ) { $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( like_escape( $search_word ) ) . '%\''; } return $where; } add_filter( 'posts_where', 'custom_search_title', 10, 2 );
> テンプレート
$args = array( 'search_title' => $word, ); $wp_query = new WP_Query( $args );