如何让我的快捷代码从插件中加载脚本和样式?

时间:2020-11-27 作者:Mähnenwolf

这听起来像是一个愚蠢的问题,但我一直在寻找答案,却什么也找不到。我确实找到了一些东西,我试过了,但没有成功,或者很模糊。

Content

<我的问题我试了什么怎么办
  • 修复了我的问题,我正在构建一个插件,您可以在其中使用短代码。我添加了短代码并构建了我的标记。在博客帖子中输出短代码非常有效。当我在标记中包含样式和脚本时,它也可以工作。现在我想把它们分开,分别放在各自的文件中
    我有一个文件夹,用于存放所有与短代码相关的函数和文件,因此我不需要离开该文件夹即可获取我的styles.css 或我的scripts.js.
    我尝试通过各种尝试链接到它们,但似乎没有任何效果。

    我使用basic<link><script> 标记以链接到标记内的文件,显然不起作用。

    在我初始化短代码的文件中:

    add_action( "wp_enqueue_scripts", "registerScriptsStyles" );
    
    public function registerScriptsStyles() {
        wp_register_script( \'iw_ShortcodeScript\', plugins_url("ShortcodeScript.js", __FILE__ ), "", "1.0.1", true );
        wp_register_style( \'iw_ShortcodeStyle\', plugins_url("ShortcodeStyle.css", __FILE__ ), "", "1.0.1" );
        wp_enqueue_script( \'iw_ShortcodeScript\' );
        wp_enqueue_style( \'iw_ShortcodeStyle\' );
      }
    
    不起作用。所以我试过了

    add_action( "init", "registerScriptsStyles" );
    add_action( "wp_qneueue_scripts", "enqueueScriptsStyles" );
    
    public function registerScriptsStyles() {
        wp_register_script( \'iw_ShortcodeScript\', plugins_url("ShortcodeScript.js", __FILE__ ), "", "1.0.1", true );
        wp_register_style( \'iw_ShortcodeStyle\', plugins_url("ShortcodeStyle.css", __FILE__ ), "", "1.0.1" );
      }
    
      
      public function enqueueScriptsStyles() {
        wp_enqueue_script( \'iw_ShortcodeScript\' );
        wp_enqueue_style( \'iw_ShortcodeStyle\' );
      }
    
    也不起作用。

    我在某个地方读到,我需要将它们排在我想要的页面中,所以我尝试将它们排在短代码的标记中,这也不起作用。

    接下来,我尝试将它们放入需要我的短代码的函数中。

    add_shortcode(  "Info_Wheel", array(  $this,  "layout"  )  );
    
    public  function  layout()  {
        wp_enqueue_script(  \'iw_ShortcodeScript\'  );
        wp_enqueue_style(  \'iw_ShortcodeStyle\'  );
        require  $this->iw_plugin_path .  "/Blocks/Pages/ShortcodeAPI/ShortcodeLayout.php";
    }
    
    也不起作用。

    怎么办

    同样,短代码可以工作并显示出来,唯一的问题是没有加载样式和脚本。下面是我在编辑器中为短代码API编写的当前代码
    如果有人能帮我,那就太好了。

    <?php
    
    namespace Blocks\\Pages\\ShortcodeAPI;
    use Blocks\\Base\\Controller;
    
    class  Shortcode  extends  Controller  {
        public  function  register()  {
            add_action(  "init",  "registerScriptsStyles"  );
            // add_action( "wp_qneueue_scripts", "enqueueScriptsStyles" );
            add_shortcode(  "Info_Wheel", array(  $this,  "layout"  )  );
        }
    
        public  function  layout()  {
            wp_enqueue_script(  \'iw_ShortcodeScript\'  );
            wp_enqueue_style(  \'iw_ShortcodeStyle\'  );
            require  $this->iw_plugin_path .  "/Blocks/Pages/ShortcodeAPI/ShortcodeLayout.php";
        }
    
        public  function  registerScriptsStyles()  {
            wp_register_script(  \'iw_ShortcodeScript\', plugins_url("ShortcodeScript.js",  __FILE__  ),  "",  "1.0.1",  true  );
            wp_register_style(  \'iw_ShortcodeStyle\', plugins_url("ShortcodeStyle.css",  __FILE__  ),  "",  "1.0.1"  );
        }
        
        public  function  enqueueScriptsStyles()  {
            wp_enqueue_script(  \'iw_ShortcodeScript\'  );
            wp_enqueue_style(  \'iw_ShortcodeStyle\'  );
        }
    }
    

    已修复

    这是我为修复此问题所做的,就像在回答的评论中已经建议的那样。还有一件事,直到不久前才有人注意到,我在钩子里输入错误了。你仍然可以在上面看到它
    所有代码都在我的短代码中。php文件。

     class Shortcode extends Controller {
    
      public function register() {
        add_action( "wp_enqueue_scripts", array($this, "registerScriptsStyles" ) );
        add_action( "wp_enqueue_scripts", array($this, "enqueueScriptsStyles" ) );
        add_shortcode( "Info_Wheel", array( $this, "layout" ) );
      }
    
      public function layout() : string {
        ob_start();
        require $this->iw_plugin_path . "/Blocks/Pages/ShortcodeAPI/ShortcodeLayout.php";
        return ob_get_clean();
      }
    
      public function registerScriptsStyles() {
        wp_register_script( \'iw_ShortcodeScript\', plugins_url( "/Blocks/Pages/ShortcodeAPI/ShortcodeScript.js", $this->iw_plugin_path . "Info-Wheel.php"), array(), "1.0.1", true);
        wp_register_style( \'iw_ShortcodeStyle\', plugins_url( "/Blocks/Pages/ShortcodeAPI/ShortcodeStyle.css", $this->iw_plugin_path . "Info-Wheel.php"), array(), "1.0.1");
      }
    
      public function enqueueScriptsStyles() {
        wp_enqueue_script( \'iw_ShortcodeScript\' );
        wp_enqueue_style( \'iw_ShortcodeStyle\' );
      }
     }
    

  • 1 个回复
    SO网友:Tom J Nowell

    plugins_url 希望第二个参数是主插件文件,这就是为什么__FILE__ 在示例中使用,假设代码在该文件中,but yours is not.

    要修复此问题,您需要检索__FILE__ 在主插件文件中,存储它,并将其传递给shortcode对象,以便在中使用plugins_url

    There is also another major problem you\'re unaware of

    短代码以字符串形式返回其内容,但您已经直接输出了内容。这打破了很多东西,因为现在短代码是在处理时输出的,而不是在显示时输出的。

    这打破了很多东西:

    嵌套短码依赖于呈现内容的任何代码或the_content 过滤一些REST API端点,甚至可能是RSS源和一些插件网站地图,插件和主题做了很多事情,插件/主题正在这样做的一个典型标志是,无论内容放在哪里,短代码都出现在内容之前,或者短代码出现的顺序错误。

    您可以通过使用输出缓冲区捕获输出并将其分配给变量来解决此问题。

    我建议更改函数签名,以包含字符串返回类型。这样做意味着,如果您的短代码构建不正确(并且您的短代码is构建错误):

    public function layout() : string {
    

    相关推荐

    Image Shortcode from ACF ID

    我想创建一个快捷码,用于显示ACF自定义字段中的图像,该字段当前的返回格式设置为Image ID. 短代码需要接受post\\u id,以便从特定页面获取字段。因此,短代码是:[acf_featured_item post_id=\"88\"] 我知道有一个可用的ACF快捷码,但已经有另一个位置依赖于ID的返回格式。因此我无法更改此位置。我当前的代码是:function acf_featured_item_shortcode( $atts ) { // Attributes $a