如果设置了参数,则不会解释快捷代码

时间:2018-04-27 作者:Contact OGO

我的插件实现了一个关于wp最佳实践的短代码,但出现了一个奇怪的行为。首先,shortcode在测试站点上工作得很好,但在生产环境中却不工作,插件代码完全相同,但环境略有不同。在生产站点上,问题如下:如果我向shorcode添加一个参数,那么shortcode似乎根本不会被解释和解析。因此,将此添加到我的帖子正文中:

[my_shortcode_tag category=who]
[my_shortcode_tag category="who"]
[my_shortcode_tag category=\'who\']
[my_shortcode_tag category=]
结果在前端具有相同的显示,不会解析和解释shortocde。只要我再添加一个没有参数的,如下所示:

[my_shortcode_tag category=who]
[my_shortcode_tag category="who"]
[my_shortcode_tag category=\'who\']
[my_shortcode_tag category=]
[my_shortcode_tag]
所有短代码开始工作!。。。每个人都被解释,显示正确。

以下是快捷码功能代码:

function my_shortcode_tag($atts = [], $content = null, $tag = \'\')
    {
        // normalize attribute keys, lowercase
        $atts = array_change_key_case((array)$atts, CASE_LOWER);

        // override default attributes with user attributes
        $sc_atts = shortcode_atts([
            \'height\' => \'400px\',
            \'category\' => \'all\'
        ], $atts, $tag);

        $result = \'nothing\';

        $category = $sc_atts[\'category\'];
        $height = \'height="\' . $sc_atts[\'height\'] . \'"\';
        DOFF_Utils::getLogger()->info("doff_show_office_stats_fn");

        // here some code to change result, based on $category and $height values
        $result .= \'[gfchartsreports gf_form_id="9" type="total" maxentries="10000" custom_search_criteria=\\\'{"status":"active","field_filters":{"0":{"key":"24","value":"user:dental_office_id"}}}\\\']\';
        $result .= \' \' . __(\'questionnaires envoyés\');
        $result .= \'<br/>\';
        $result .= \'[gfchartsreports gf_form_id="8" type="total" maxentries="10000" custom_search_criteria=\\\'{"status":"active","field_filters":{"0":{"key":"295","value":"user:dental_office_id"}}}\\\']\';


        return do_shortcode($result);
    }
知道这里有什么问题吗?

2 个回复
SO网友:Mark Kaplun

问题中没有足够的代码来指出问题所在,但我会将您尝试执行的操作称为“可疑”。的用法do_shortcode 应该被限制在极端情况下,当它是不可能的,或非常困难的,做任何其他事情,因为使用它是使用的邪恶相当于使用eval.

您应该做的是找出shorcodes调用的实际API,然后直接调用API。即使您不关心性能的提高,调试东西也会容易得多。

SO网友:cjbj

让我们看看这里发生了什么。WordPress评估帖子内容(或启用了短代码的小部件文本字段),它本质上是一个字符串。让我们命名这个字符串$the_content. 它调用do_shortcode 查找和评估中的任何短代码$the_content. 它会找到您的短代码并调用my_shortcode_tag 具有属性$atts, 空的$content (因为它是一个自动关闭的短代码)和$tag 其中包含短代码的名称(大概是my_shortcode_tag).

现在,开始组装一个字符串,名为$result. 不幸的是,这部分代码不完整,因此很难说出$result 看起来像。总之,通常一个短代码只会返回一个html字符串,然后将其插入$the_content. 但是,您需要解析$result 再次通过shortcode evaluator(return do_shortcode($result) 代替习惯return $result).

这就是事情变得有趣的地方。正如您可以从的源代码中看到的do_shortcode 它会检查$result 对于所有已知的短代码,并对其进行评估。如果$result 包含子字符串[my_shortcode_tag 您将进入一个无限循环,这取决于您的服务器设置何时以及如何终止进程。此外,您可能会无意中从内部调用另一个短代码$result, 这可能会产生一些非常奇怪的结果。

结束

相关推荐

Shortcode produces blank page

我在使用的主题中添加了短代码,但当我尝试在页面中使用它们时,它会给我一个空白页面。我看到了一个解决这个问题的方法remove_filter(\"the_content\", \"wpautop\"); 但我不确定这是否有效。如果会,请让我知道,请让我知道该代码放在哪里。否则,如何解决此问题。如果您需要查看我正在尝试添加哪些短代码,请告诉我,我将随它们一起发布一个文件。提前谢谢。EDIT 下面是我用来添加短代码的函数:function facebook($atts) { extract(sh