web-dev-qa-db-ja.com

ショートコードのコンテンツを検索してパラメータを取得する

内容的には[book id="1"] [book id="14" page="243"]のように複数のショートコードを持つことができます

そのショートコードのコンテンツを検索してそのパラメータを取得するためのヘルプ方法はありますか? WP_Queryを呼び出して最後にカスタム投稿タイプのタイトルを追加できるように、IDを取得する必要があります。

function filter_books( $content ) {

// get all shortcodes IDs and other parameters if they exists
...

return $content;
}
add_filter( 'the_content', 'filter_books', 15 );

次のコードを使用してみましたが、var_dump($ matches)が空で、うまくいく場合は、パラメータを取得する方法がわからない( - ショートコードフィルタリング - コンテンツの修正 - リスト内のすべての投稿の修正

  $shortcode = 'book';
  preg_match('/\['.$shortcode.'\]/s', $content, $matches);
1
Marko

これは私のために働いています

  $shortcode = 'book';
  $pattern = get_shortcode_regex();

  // if shortcode 'book' exists
  if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
    && array_key_exists( 2, $matches )
    && in_array( $shortcode, $matches[2] ) )  {
   $shortcode_atts = array_keys($matches[2], $shortcode);

 // if shortcode has attributes
 if (!empty($shortcode_atts)) {
  foreach($shortcode_atts as $att) {
    preg_match('/id="(\d+)"/', $matches[3][$att], $book_id);

    // fill the id into main array
    $book_ids[] = $book_id[1];
  }
}
...
0
Marko

これを実現するには、実際にはもっと簡単な方法があります。コンテンツがWPによって解析されると、コンテンツ内で見つかったショートコードが実行されます。 WP 4.7以降では、ショートコードがその内容に置き換えられると、 do_shortcode_tag がトリガーされます。これは、見つかった属性に基づいてショートコード出力にコンテンツを追加するのに非常に便利です。

add_filter( 'do_shortcode_tag','add_my_script',10,3);
function enqueue_my_script($output, $tag, $attr){
  if('aShortcode' != $tag){ //make sure it is the right shortcode
    return $output;
  }
  if(!isset($attr['id'])){ //you can even check for specific attributes
    return $output;
  }
  $output.='<script> ... </script>';
  return $output;
}

あるいは、ページのフッターに何かを入れる必要がある場合は、上記の関数内の wp_footer アクション、または 無名関数のいずれかにフックすることができます。 またはファイル内の別の機能を起動するため。

0
Aurovrata