web-dev-qa-db-ja.com

アポストロフィを変数に入れたget_page_by_title

私はいくつかの投稿を照会するショートコードを作成するのに問題があります。これが私のコードの基本です。

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の投稿)、それは壊れていて、そのカスタム投稿タイプの最後の投稿が何であれ、それだけで照会します。

では、投稿タイトルのアポストロフィをどのように使用すればよいのでしょうか。

1
Malachi Draven

タイトルHello world!@#$%^*(),.;:\は機能しますが、' " < > &文字を含む入力したタイトルは機能しません。これは、$content変数で HTMLエンティティ がエスケープされているため、Mal's PostがMal&#8217;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');

他のコードは以前と同じように機能します。

2
Greg36

おそらくそこで起こっているエスケープ問題があります。ショートコードに渡す前に、sanitize_title_for_query()sanitize_title()、さらにはesc_html()を使ってタイトルをエスケープするようにしてください。

$content   = sanitize_title_for_query( $content );
$equipment = get_page_by_title( $content, OBJECT, 'equipment' );

データのエスケープに関するより多くの情報は ここ にあります。

1
Jack Johansson