劫持WordPress快捷码属性

时间:2020-07-01 作者:Roger C

首先我要说的是,我不是wordpress或php专家,但经过一些初步研究,我觉得这应该是可能的。

我想在我的站点上调整插件的行为(不改变插件源文件),以便每次运行一个短代码时,其中一个属性都会被来自用户元数据的信息所替换。通过这种方式,用户可以自定义结果。

可以提取用户元数据,但不确定如何覆盖特定的短代码属性?

看见Use content custom filter for all shortcodes而且Filter specific shortcode output?而且Add attribute to existing Shortcode

1 个回复
SO网友:Tom J Nowell

您有多种选择,但我建议您不要这样做,您真正需要的是创建一个新的短代码来调用插件函数以实现您想要的功能(或使用提供过滤器的插件):

1。在帖子内容上搜索替换the_content 筛选,并在处理内容之前对其执行字符串搜索替换do_shortcodes. 请注意,您需要检查帖子是否有该短代码,找到短代码所在的位置,解析出值,然后交换它们。

这是一个更难的解决方案,并且会带来性能成本

2。上下文短代码包装器(context Shortcode Wrappers)

您可以构建一个围绕另一个短代码的短代码,然后执行解决方案1),但仅限于内部的短代码。这依赖于shortcodes第二个参数,该参数包含shortcode内的内容。这将比解决方案1更有用,同时仍然需要相同的工作。

它也会稍微快一点,但这只是因为它不必处理整个帖子内容,所以节省的成本很小。

3。取消注册短代码并重新注册同名包装,短代码映射到函数,因此取消注册短代码,创建同名新短代码,并将属性传递给函数。这样,您可以交换其中一些属性以覆盖它们。

例如,假设我们想要更改[toms_hello name="Tom"] 短代码:


add_shortcode( \'toms_hello\', \'toms_hello_shortcode\' );

function toms_hello_shortcode( $atts ) {
    return \'Hello \' . $atts[\'name\'];
}
让我们假设我希望名称始终为“QUOTE”;《无名氏》;不管发生什么name 说。我可以这样做:

remove_shortcode( \'toms_hello\' );
add_shortcode( \'toms_hello\', \'janedoe_toms_hello\' );

function janedoe_toms_hello( $atts ) {
    $atts[\'name\'] = \'Jane Doe\';
    return toms_hello_shortcode( $atts );
}
这将是最快、最兼容的解决方案。

4。将短代码复制到一个新名称下这是迄今为止最简单的方法,将短代码复制粘贴到一个新插件中,并给它一个新名称,然后进行所需的调整。请注意,您需要进行一些调整以使其工作,这完全取决于最初的实现方式。

一般来说,短代码并不是一种编程语言,它们只是在您需要将PHP生成的内容放在帖子中时进行替换的一种方式。如果您需要更高的复杂性,或者您正试图将动态数据转换为动态数据,那么您已经超越了短代码的用途,正在走向个人发展的死胡同。

相关推荐

What does this shortcode do?

function my_shortcode($atts, $content = null){ extract(shortcode_atts(array(\"type\" => \"warrning\"), $atts)); return \".$content.\"; } add_shortcode(\"warrning_dialog\", \"my_shortcode\"); 我知道它会创建短代码[warning\\u dialo