仅当使用快捷码时才将脚本入队,并使用WP插件样板

时间:2017-03-10 作者:bluantinoo

我正在使用WordPress Plugin Boilerplate by DevinVinson.

一切正常,除了一件事:

我试图仅当页面中存在短代码时才将脚本和css排队。

在里面define_public_hooks 函数中,我向加载程序添加了一个调用,以注册脚本,而不是将其排队:

private function define_public_hooks() {
    // ...
    $this->loader->add_action( \'wp_register_script\', $plugin_public, \'register_styles\' );
    $this->loader->add_action( \'wp_register_script\', $plugin_public, \'register_scripts\' );
    // ...
}
然后在class-my-plugin-public.php 文件I创建了两个公共函数register_styles()register_scripts(). 在这些函数中,我只是注册脚本和样式,而不是将它们排队。这是一些基本的东西,比如:

public function register_scripts() {    
    wp_register_script( $this->plugin_name . \'_google_maps_api\', \'//maps.googleapis.com/maps/api/js?key=\'. $gmap_key .\'&v=3&libraries=places\', array( \'jquery\' ), \'3\', true );
}
然后我想将它们放入shortcode返回函数中,但它们根本没有注册。

我和wp_script_is( $this->plugin_name . \'_google_maps_api\', \'registered\' ), 它回来了false.

如果我做同样的东西enqueue 而不是register 一切正常。

知道为什么吗?

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

不起作用的原因:

您需要使用wp_enqueue_scripts 行动挂钩。你用过wp_register_script 但是,作为动作挂钩,没有名为wp_register_script 在WordPress核心中。

如果这只是一个愚蠢的错误,那么你已经有了答案。如果您需要有关该主题的更多信息,请继续阅读:

将回调函数附加到wp_enqueue_scripts action hook 并不意味着您的脚本和样式将被排队,它只是意味着您想在何时执行它callback function.

原始注册和排队由以下功能完成:wp_register_script(), wp_register_style, wp_enqueue_script(), wp_enqueue_style() 等等,不是任何人hook.

请注意函数和挂钩的作用之间的区别:

Afunction 在调用时执行一些代码以完成预定义的任务。

示例:这些都是WordPress的核心功能:wp_register_script(), wp_register_style, wp_enqueue_script(), wp_enqueue_style().

  • Ahook 仅附加callable 函数(稍后执行)在预定义的代码执行点执行。

    示例:这是WordPress核心(动作)挂钩:wp_enqueue_scripts - 请注意s (复数)结尾。

    Double check: wp_enqueue_script() 是一个函数,并且wp_enqueue_scripts 是一个动作钩。

    正确的代码:因此,正确的代码应该如下所示:

    private function define_public_hooks() {
        // ...
        $this->loader->add_action( \'wp_enqueue_scripts\', $plugin_public, \'register_styles\' );
        $this->loader->add_action( \'wp_enqueue_scripts\', $plugin_public, \'register_scripts\' );
        // ...
    }
    
    然后,

    public function register_scripts() {
        wp_register_script( $this->plugin_name . \'_google_maps_api\', \'//maps.googleapis.com/maps/api/js?key=\'. $gmap_key.\'&v=3&libraries=places\', array( \'jquery\' ), \'3\', true );
    }
    
    之后,您可以将脚本(样式)从快捷码处理程序函数中排队:

    public function your_shortcode_handler( $atts ) {
        // shortcode related CODE
        wp_enqueue_script( $this->plugin_name . \'_google_maps_api\' );
        // more shortcode related CODE
    }
    
    使用此代码,您的脚本/样式从your_shortcode_handler 只有当特定URL中存在短代码时,才会将函数添加到您的站点。

    进一步阅读:

    This answer 对排队脚本进行了有趣的讨论;仅当存在短代码时才显示样式。

  • SO网友:nibnut

    所以问题是add_action 调用需要是一个WordPress操作名。。。因此,永远不会调用“wp\\u register\\u script”,而不是wp操作。

    我建议您只需将注册调用添加到插件的enqueue\\u scripts函数中,无需对define\\u public\\u挂钩大惊小怪,也无需创建新的register\\u scripts函数。只需使用现有的enqueue\\u scripts功能,即可在此处添加注册:

    public function enqueue_scripts() {
        wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . \'js/plugin-name-public.js\', array( \'jquery\' ), $this->version, false );
    
        // NOTICE this is a *registration* only:
        wp_register_script( $this->plugin_name.\'_google_maps_api\', \'//maps.googleapis.com/maps/api/js?key=\'. $gmap_key.\'&v=3&libraries=places\', array( \'jquery\' ), \'3\', true ); 
    }
    
    然后,当您编写短代码时,应该注册脚本,准备进入队列。

    希望这有帮助!

    相关推荐

    Namespaced shortcode?

    我正在改造一个旧的WP站点,该站点有许多自定义的短代码,显然由于代码当前的组织方式,这些短代码在性能方面付出了代价。当然,我可以修复优化不好的代码,使用十几个短代码,并且一天就可以完成,但我想知道如何更好地组织它们。根据WordPress\'documentation, 建议将它们放在插件中并在上初始化init. 我们可以通过这样“命名”它们来减少这个钩子中的负载吗?[com.company shortcode attr=\"attr\" prop=\"prop\"] 有人尝试过这样的解决方案吗