搜索内容中的快捷代码并获取参数

时间:2016-07-17 作者:Marko

在内容中,我可以有多个短代码,如[book id="1"] [book id="14" page="243"]

是否有任何帮助方法可以让我搜索该短代码的内容并获取其参数?我需要获取ID,以便调用WP\\u Query并在末尾附加自定义帖子类型标题。

function filter_books( $content ) {

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

return $content;
}
add_filter( \'the_content\', \'filter_books\', 15 );
我尝试使用以下代码,但var\\u dump($matches)为空,如果它可以工作,我不确定如何获取参数(https://stackoverflow.com/questions/23205537/wordpress-shortcode-filtering-the-content-modifies-all-posts-in-a-list)

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

2 个回复
最合适的回答,由SO网友: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];
  }
}
...

SO网友:Aurovrata

实际上有一种更简单的方法来实现这一点。当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 上述功能中的操作anonymous function 或者启动文件中的另一个函数。

相关推荐

在WP_Query中,哪种元查询和POST_CONTENT混合的性能更好?

我需要WP_Query 对于以下职位:要么将“Posteta”的“answer”设置为“yes”,然后post_content;</或将“答案”设置为“否”,但仅在以下情况下post_content 为空</因此,在一个理想的世界中,性能不是问题,您可以查询Posteta和post_content, args看起来像这样:$args = array( \'relation\' => \'OR\', \'meta_query\' => array(