[标题]内嵌的快捷代码不处理

时间:2013-09-08 作者:Sisir

wordpress中的字幕目前不支持嵌套的短代码(v3.6). 所以,如果我写

[caption]<img src=""> I love my [city][/caption]
城市应该被处理,但它没有。How do I fix this?

门票:#24990

3 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

有一个hook inside the caption shortcode 那会让你劫持整件事。以下大部分内容是从Core复制的img_caption_shortcode 作用

function nested_img_caption_shortcode($nada, $attr, $content = null) {

  extract(
    shortcode_atts(
      array(
      \'id\'    => \'\',
      \'align\' => \'alignnone\',
      \'width\' => \'\',
      \'caption\' => \'\'
      ), 
      $attr, 
      \'caption\'
    )
  );

  $caption = do_shortcode($caption); // process nested shortcodes

  if ( 1 > (int) $width || empty($caption) )
          return $content;

  if ( $id ) $id = \'id="\' . esc_attr($id) . \'" \';

  return \'<div \' . $id . \'class="wp-caption \' . esc_attr($align) . \'" style="width: \' . (10 + (int) $width) . \'px">\'
  . do_shortcode( $content ) . \'<p class="wp-caption-text">\' . $caption . \'</p></div>\';
}
add_filter(\'img_caption_shortcode\', \'nested_img_caption_shortcode\', 1, 3);

SO网友:jerclarke

WP的最新版本确实改善了字幕参数的可过滤性,因此我认为这个新答案将具有最小的占用空间和最安全的操作。

我们需要做的是直接过滤$atts[\'caption\'] 在期间shortcode_atts() 对于[caption] 短代码。我们可以用shortcode_atts_caption 仅影响标题短代码的筛选器。

作为奖励,我添加了一个注释掉的行,它将在运行之前测试特定短代码的标题do_shortcode(). 如果您只想在标题中启用特定的短代码(我使用它只启用Shortcode Shortcode). 但要小心:do_shortcode() 将处理所有短代码,而不仅仅是您测试的短代码。

/**
 * Filter Caption shortcode attributes to enable the [shortcode] shortcode inside caption text
 * 
 * WP doesn\'t run do_shortcode on the \'caption\' text value parsed out of [caption], which means
 * the [shortcode] shortcode doesn\'t work. 
 * 
 * @param array $out atts array as determined by WP to be returned after filtering
 * @param array $pairs 
 * @param array $atts
 * @return filtered $out atts
 */
 function wpse_113416_filter_shortcode_atts_caption($out, $pairs, $atts) {
    // OPTIONAL: Look for a specific shortcode before running do_shortcode
    // if (has_shortcode($out[\'caption\'], \'shortcode_to_look_for\')) 
        $out[\'caption\'] = do_shortcode($out[\'caption\']);

    return $out;
}
add_filter(\'shortcode_atts_caption\', \'wpse_113416_filter_shortcode_atts_caption\', 10, 3);

SO网友:Sisir

使用最新功能has_shortcode() 于介绍v3.6

add_filter( \'the_content\', \'process_wp_caption_shortcodes\' ); // hook it late

    function process_wp_caption_shortcodes( $content ){
        if( !function_exists    ( \'has_shortcode\' ) )   // no luck for user using older versions :)
            return $content;

        if( has_shortcode( get_the_content(), \'caption\' ) ){ // check with raw content
            // caption exists on the current post
            $content = do_shortcode( $content );
        }

        return $content;
    }
此解决方案可用于任何未实现嵌套短代码支持的第三方快照代码。

欢迎任何更好的解决方案

结束

相关推荐

如何覆盖Shortcodes.php核心文件?

我想覆盖/更新核心短代码。php文件。构建一个数组并向其他函数发送不同的数据,但我的问题是如何在不编辑核心文件的情况下做到这一点?是否有覆盖核心文件和/或函数的最佳做法?