首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有句柄的Wordpress去队列脚本?

没有句柄的Wordpress去队列脚本?
EN

Stack Overflow用户
提问于 2017-11-22 21:41:28
回答 1查看 1.8K关注 0票数 0

我目前正在使用Foobox (免费)插件,显然插件的文件被加载到每个页面上,不管是否使用它。不过,我想要更改它,但是我似乎找不到任何句柄来对脚本进行排队列。

看起来脚本是由下面的代码调用的,至少对我来说,它没有显示任何句柄。我尝试使用remove_action(...)来“反击”它们,以及wp_dequeue_script()中的各种输入,试图直接针对这些文件--例如,wp_dequeue_script('foobox.free.min.js')

代码语言:javascript
复制
class Foobox_Free extends Foo_Plugin_Base_v2_1 {

        const JS                   = 'foobox.free.min.js';
        const CSS                  = 'foobox.free.min.css';
        const CSS_NOIE7            = 'foobox.noie7.min.css';
        const FOOBOX_URL           = 'http://fooplugins.com/plugins/foobox/?utm_source=fooboxfreeplugin&utm_medium=fooboxfreeprolink&utm_campaign=foobox_free_pro_tab';
        const BECOME_AFFILIATE_URL = 'http://fooplugins.com/affiliate-program/';

        private static $instance;

        public static function get_instance() {
            if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Foobox_Free ) ) {
                self::$instance = new Foobox_Free();
            }
            return self::$instance;
        }

        /**
         * Initialize the plugin by setting localization, filters, and administration functions.
         */
        private function __construct() {
            //init FooPluginBase
            $this->init( FOOBOXFREE_FILE, FOOBOXFREE_SLUG, FOOBOX_BASE_VERSION, 'FooBox FREE' );

            if (is_admin()) {

                add_action('admin_head', array($this, 'admin_inline_content'));
                add_action('foobox-free-settings_custom_type_render', array($this, 'custom_admin_settings_render'));
                new FooBox_Free_Settings();

                add_action( FOOBOX_ACTION_ADMIN_MENU_RENDER_GETTING_STARTED, array( $this, 'render_page_getting_started' ) );
                add_action( FOOBOX_ACTION_ADMIN_MENU_RENDER_SETTINGS, array( $this, 'render_page_settings' ) );

                add_action( 'admin_notices', array( $this, 'admin_notice_foogallery_lightboxes' ) );
                add_action( 'wp_ajax_foobox_foogallery_lightboxes_ignore_notice', array( $this, 'admin_notice_foogallery_lightboxes_ignore' ) );
                add_action( 'wp_ajax_foobox_foogallery_lightboxes_update', array( $this, 'admin_notice_foogallery_lightboxes_update' ) );
                add_action( 'admin_print_scripts', array( $this, 'admin_notice_foogallery_lightboxes_inline_js' ), 999 );

                add_filter( 'foobox-free-has_settings_page', '__return_false' );

            } else {

                // Render JS to the front-end pages
                add_action('wp_enqueue_scripts', array($this, 'frontend_print_scripts'), 20);
                add_action('foobox-free_inline_scripts', array($this, 'inline_dynamic_js'));

                // Render CSS to the front-end pages
                add_action('wp_enqueue_scripts', array($this, 'frontend_print_styles'));

                if ( $this->is_option_checked('disable_others') ) {
                    add_action('wp_footer', array($this, 'disable_other_lightboxes'), 200);
                }
            }
        }

如果可能的话,我如何在不直接编辑插件文件的情况下排排这些脚本(和样式)?

编辑

下面我添加了我尝试删除脚本的操作(全部添加到functions.php中):

代码语言:javascript
复制
add_action( 'wp_enqueue_scripts', 'remove_foobox_scripts', 100 );

function remove_foobox_scripts() {
   if ( !is_page('my-page') ) {

       wp_deregister_script( 'foobox.free.min.js' );
       wp_dequeue_script( 'foobox.free.min.js' );
     }
}

也尝试了下面的方法,它只是从页脚框文件中直接复制出来的:

代码语言:javascript
复制
remove_action('wp_enqueue_scripts', array($this, 'frontend_print_scripts'), 20);
remove_action('foobox-free_inline_scripts', array($this, 'inline_dynamic_js'));

remove_action('wp_enqueue_scripts', array($this, 'frontend_print_styles'));

还尝试了以下操作,其中删除了array(部件:

代码语言:javascript
复制
remove_action('wp_enqueue_scripts','frontend_print_scripts', 20);
remove_action('foobox-free_inline_scripts', 'inline_dynamic_js');

remove_action('wp_enqueue_scripts', 'frontend_print_styles');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-23 17:13:22

你试图这样做的方式的问题来自于Wordpress中事情发生的顺序。

您依赖于条件标记(如is_page('my-page') )来确定是否加载插件。在Wordpress解析了当前查询的URL之后,这些条件标记才可用,此时,所有插件和主题都已经加载。即使您自己解析URL,而不是使用条件标记,您也无法确保代码在加载插件之前运行。

解决方案是将代码添加为木插件。这些插件是在普通插件之前加载的,因此您可以在这里使用选项(选项名)筛选器来更改您想要加载的插件。

选项过滤器将一个数组传递给您的函数,其中包含为该选项设置的值,因此在本例中,您希望挂起option_active_plugins

您可以通过运行print_r(get_option('active_plugins'));或查看wordpress安装的插件文件夹来找到要使用的值。

下面的示例是特定于您的问题,但您可以修改它,以制定一套更全面的规则,添加和删除多个插件在不同的页面上,基于许多条件。

我的函数检查您不在wp-admin中,然后有两个条件。第一个在指定的页面上禁用一个正常活动的插件,第二个在指定的页面上启用正常禁用的插件。

代码语言:javascript
复制
<?php
add_filter( 'option_active_plugins', 'add_or_remove_plugins' );
function add_or_remove_plugins( $plugins ) {
    if (strpos( $_SERVER['REQUEST_URI'], '/wp-admin/' ) !== 0) {  // Disable in admin pages or admin plugin settings stop working properly
        if (strpos( $_SERVER['REQUEST_URI'], '/remove-plugin-here/' ) === 0) {  // Conditonal tags still unavailable so you have to parse urls yourself
            $k = array_search( 'foobox-image-lightbox/foobox-free.php', $plugins );    // This will stop an active plugin from loading
            if( false !== $k ){
                unset( $plugins[$k] );
            }
        }
        if (strpos( $_SERVER['REQUEST_URI'], '/add-plugin-here/' ) === 0) {
            $plugins[] = 'foobox-image-lightbox/foobox-free.php';  // This will load the plugin along with all the active plugins
        }
    }
    return $plugins;
}
?>

要安装,只需将值更改为适合的值,将其粘贴到文件中并上载到文件夹中。

编辑

看起来,内联js是在wp_head类的构造函数期间添加到Foobox_Free中的。您可以尝试将其添加到functions.php中:

代码语言:javascript
复制
add_action( 'wp_head', 'remove_dynamic_js' );
function remove_dynamic_js(){
    $foo = Foobox_Free::getInstance();
    remove_action('wp_head', array($foo, 'inline_dynamic_js'));
}

或者如果不起作用的话,也许是这样:

代码语言:javascript
复制
add_action( 'wp_head', 'remove_dynamic_js' );
function remove_dynamic_js(){
    remove_action('wp_head', array('Foobox_Free', 'inline_dynamic_js'));
}

该操作是在一个私有函数中添加的,因此我不知道这两种操作是否真正有效。试试看。如果不是,我的第一个答案将因为它阻止插件加载在指定的页面上。

更新

我当时很接近..。下面是删除插件作者提供的脚本的代码。

代码语言:javascript
复制
$foobox = Foobox_Free::get_instance();
remove_action('foobox-free_inline_scripts', array($foobox, 'inline_dynamic_js'));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47444280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档