允许在属性中使用快捷码

时间:2014-02-05 作者:peroyomas

我想为WP网站上的一些文章制作一个类似Wikipedia的信息框。我想最合乎逻辑的做法是使用一个自定义的快捷码,它返回一个类似于表的标记,具有固定的字段顺序,每个字段都有更多的自定义标记,以及一些用于显示或不显示字段(如果未设置字段)的条件,这在某种程度上模拟了如下情况:

 <!--MediaWiki markup-->
 {{infobox-cd
 |name=Abbey Road"
 |cover=[[File:laserdisc.jpg]]
 |artist=[[The Bombay Beach Boys]]
 |country={{flag id=mx}} Argentina<br />{{flag id=dk}} Vanuatu (post-production)
 |rating={{stars no=3}}
 |prev=[[The Wall]]
 |next=[[Born in the U.S.A.]]
 }}
然而,由于短代码在属性中有括号时被破坏,多年来我一直被阻止以更字面的方式使用它们。从理论上讲,它应该是可行的,但事实并非如此,因为短代码regex在短代码中第一次出现右括号(])时就停止了,所以在这里:

[foo bar="[baz /]"]content[/foo]
it“输出”:

[foo bar="[baz /]
我不知道如何才能让这个标记或其他具有相同目标的东西发挥作用。

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

很抱歉,短代码中仍然不允许使用括号,如中所示Shortcode API. 但是,可以使用封闭的短代码,这将允许使用括号。让我来演示一下:

短代码:[foo bar="No brackets here!"]...use [brackets] here[/foo]

您可以在functions.php 像这样:

add_shortcode( \'foo\', \'foo_shortcode\' );
function foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      \'bar\' => \'\',
    ), $atts )
  );
  return \'<p>\' . $bar . \' \' . $content . \'</p>\';
}
也可以将括号内的内容作为另一个快捷码执行:

短代码:[foo bar="No shortcodes here!"]...use [shortcodes] here[/foo]

add_shortcode( \'foo\', \'execute_foo_shortcode\' );
function execute_foo_shortcode( $atts, $content = null ) {
extract( shortcode_atts(
    array(
      \'bar\' => \'\',
    ), $atts )
  );
  return \'<p>\' . $bar . \' \' . do_shortcode($content) . \'</p>\';
}
但让我们保持简单。为什么不在短代码本身中添加括号呢?

短代码:[foo bar="shortcode"]

在你的functions.php

add_shortcode( \'foo\', \'build_foo_shortcode\' );
function build_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      \'bar\' => \'\',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    return \'<p>\' . do_shortcode( \'[\' . $bar . \']\' ) . \'</p>\';
  endif;
}
如果您想继续使用您的短代码,可以在括号中添加类似的内容,通过regex识别并替换它:

短代码:[foo bar="Use your ___shortcode___ here"]

在您的functions.php 您可以替换___shortcode___ 具有[shortcode] 然后再次通过do_shortcode()

add_shortcode( \'foo\', \'regex_foo_shortcode\' );
function regex_foo_shortcode( $atts ) {
  extract( shortcode_atts(
    array(
      \'bar\' => \'\',
    ), $atts )
  );

  if ( isset( $bar ) ) :
    $foo_bar = preg_replace_callback("/(.*)_{3}(.*)_{3}(.*)/", function($m) {
        return $m[1] . do_shortcode(\'[\' . $m[2] . \']\') . $m[3];
    }, $bar);
    return \'<p>\' . $foo_bar . \'</p>\';
  endif;
}
好吧,现在有点复杂了,不是吗?另一种方法(如果您不想通过短代码继续这样做)是自定义字段。Custom fields 默认情况下可用,可以通过Screen Options.

您可以使用the_meta() 或者通过get_post_meta() 函数可以在主题中轻松输出它们。此外,与短代码相比,它更容易处理输入和输出,并且没有人需要记住所有可用的短代码。

您还可以通过以下方式轻松生成高级自定义字段:the interface of a pluginbuild and style them on your own. 无论如何,您将在文本编辑器下方或旁边有很好的输入字段,没有任何限制(甚至文件上载、日期选择器…)。它看起来像这样:

enter image description here

结束

相关推荐

shortcode in a custom metabox

我正在尝试将插件中的短代码添加到我的自定义元数据库中。我已经读过,这不是我要做的事情,但在这种情况下,我确实需要它来工作。客户端可能不会添加视频,但可能会向其中添加图像,或者需要一些东西来确保它仍然可以用于标准内容。我遇到的问题是,它只输出这样的短代码-[youtube id=“vfGZZJnoJ0U”]我曾尝试向我的metabox中添加过滤器,但仍然显示了这一点。这是我的自定义metabox设置:add_action(\'add_meta_boxes\', \'testimonials_meta_box