如何在快捷代码中添加内联css/js

时间:2016-08-14 作者:iSaumya

我正在努力创建一个短码,根据情况动态更改该短码的css和js。现在的问题是我不知道如何使用add_action() 内部aadd_shortcode(). 让我给你们一个示例代码片段,以便你们更好地理解我:

add_shortcode(\'example\', function( $atts ) {
    //extracting the shortcode attributes
    extract( shortcode_atts( array(
        \'value1\' => null,
        \'value2\' => null, 
        \'value3\' => null
    ), $atts ) );

    //Now here I wll do my code for the shortcode
    // But the shortcode needs some js and css to work
    // so, I\'m trying like this

    //For the CSS
    add_action(\'wp_head\', function() {
        echo \'<style type="text/css">
            .class {
                background-color: \'. $value2 .\';
            }
        </style>\';
    });

    //For the JS
    add_action(\'wp_footer\', function() {
        echo \'<script type="text/javascript">
            var a = \'. $value3 .\'
        </script>\';
    });

});
现在很明显,它不起作用了,所以我希望你们中的任何人都能以正确的方式指导我如何做类似的事情。

如果可以的话,请帮忙,不要对问题投反对票。

2 个回复
SO网友:cjbj

不,那不行。当WordPress开始评估您内容中的短代码时,网站的负责人已经组装好了,因此您不能再向其添加操作。

查看execution order of hooks 为您提供如何执行此操作的线索。

首先,必须避免回显脚本。相当地wp_enqueue_script (与wp_enqueue_style) 是要避免脚本之间冲突的方法。由于脚本位于头部,因此您希望在wp_head 被调用。考虑到您需要从帖子中提取信息,您必须在WP知道此页面上的帖子之后进行连接。那个钩子是wp. 在这里,您必须预先评估帖子内容,以使用regex. 您的函数大致如下所示:

add_action (\'wp\', \'add_shortcode_script\');

function add_shortcode_script () {
  global $post;
  ... use regex to scan $post->$post_content for your shortcode
  ... and extract $value2 and $value3
  wp_enqueue_script (...vars based on $value2...);
  wp_enqueue_style (...vars based on $value3...);
}
如果短代码指示添加css/js文件,则需要上面的代码。在您的示例中,您只添加了一个片段,这可能会改变主css/js文件的行为。这意味着您应该使用wp_add_inline_scriptwp_add_inline_style. 代码的后一部分则变成:

  wp_enqueue_script (\'my_script\',\'http:/.../main.js\');
  wp_enqueue_style (\'my_style\',\'http:/.../main.css\');
  wp_add_inline_script (\'my_script\', $string_based_on_value2);
  wp_add_inline_style (\'my_style\', $string_based_on_value3);

SO网友:swissspidy

如果你仔细想想,wp_head 在解析您的短代码时已触发(帖子内容比<head> 页的)。所以这行不通。

(参见this question 用于WordPress加载过程)

您可以直接打印JS&;CSS(根据HTML规范不允许使用,但浏览器可以很好地理解)或将所有内容移动到页脚。

相关推荐

如何在另一个函数中使用插件的ShortCode属性值?

我有一个插件作为一个类,其中我使用一个shortcode属性来填充$outlet变量。然而,尽管sanitize_text_field($atts[\'outlet\']) 返回所需字符串,$this->outlet = sanitize_text_field($atts[\'outlet\']) 未更新的值$outlet. 如果我为类的$outlet 最初,它在example_callback(). 插件的所有其他功能都按预期工作。只是wp_news_shortcode() 未分配$attr 价值