私はいくつかの投稿を照会するショートコードを作成するのに問題があります。これが私のコードの基本です。
function shortcode_equipment($atts, $content = null) {
$equipment = get_page_by_title($content, OBJECT, 'equipment');
$loop = new WP_Query( array(
'posts_per_page' => 1,
'post_type' => 'equipment',
'page_id' => $equipment->ID
) );
while( $loop->have_posts() ) { $loop->the_post();
*misc code*
wp_reset_postdata();
return $string;
}
}
add_shortcode( 'item', 'shortcode_equipment' );
今、通常、これは私の投稿の99%に問題なく機能します。 [item]タイトルの中に書かれているもの[/ item]のショートコードで投稿を照会し、それに応じてカスタムツールチップ/ホバー効果を表示します。
ただし、私の投稿のタイトルにアポストロフィが含まれている場合(例:Malの投稿)、それは壊れていて、そのカスタム投稿タイプの最後の投稿が何であれ、それだけで照会します。
では、投稿タイトルのアポストロフィをどのように使用すればよいのでしょうか。
タイトルHello world!@#$%^*(),.;:\
は機能しますが、' " < > &
文字を含む入力したタイトルは機能しません。これは、$content
変数で HTMLエンティティ がエスケープされているため、Mal's PostがMal’s Post
になるためです。
これを回避するには、 sanitize_title
関数を get_page_by_path
とともに使用します。
function shortcode_equipment($atts, $content = null) {
$path = sanitize_title($content);
$equipment = get_page_by_path( $path, OBJECT, 'equipment');
他のコードは以前と同じように機能します。
おそらくそこで起こっているエスケープ問題があります。ショートコードに渡す前に、sanitize_title_for_query()
、sanitize_title()
、さらにはesc_html()
を使ってタイトルをエスケープするようにしてください。
$content = sanitize_title_for_query( $content );
$equipment = get_page_by_title( $content, OBJECT, 'equipment' );
データのエスケープに関するより多くの情報は ここ にあります。