Wordpress将脚本无法处理?

时间:2017-11-22 21:41:29

标签: php wordpress

我目前正在使用Foobox lightbox(免费)插件,显然无论是否使用插件文件都会在每个页面上加载。但是我想改变它,但我似乎找不到任何句柄来使脚本出列。

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

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中):

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' );
     }
}

还尝试了以下内容,这只是foobox文件的直接副本:

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(部分被移除的地方:

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');

1 个答案:

答案 0 :(得分:2)

您尝试执行此操作的方式的问题源于Wordpress中发生事件的顺序。

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

解决方案是将您的代码添加为mu-plugin。这些是在普通插件之前加载的,因此您可以在此处使用option (option name)过滤器来更改要加载的插件。

选项过滤器将数组传递给包含为该选项设置的值的函数,因此在这种情况下,您希望挂钩option_active_plugins

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

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

我的功能检查您是否在wp-admin,然后有2个条件。第一个禁用指定页面上的正常活动插件,第二个启用指定页面上正常禁用的插件。

<?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;
}
?>

安装只需更改值以适应,粘贴到文件并上传到mu-plugins文件夹

修改

wp_head类的构造函数中,您的内联js似乎已添加到Foobox_Free。你可以尝试将它添加到你的functions.php:

add_action( 'wp_head', 'remove_dynamic_js' );
function remove_dynamic_js(){
    $foo = Foobox_Free::getInstance();
    remove_action('wp_head', array($foo, 'inline_dynamic_js'));
}

或者如果那不起作用那么可能是这样的:

add_action( 'wp_head', 'remove_dynamic_js' );
function remove_dynamic_js(){
    remove_action('wp_head', array('Foobox_Free', 'inline_dynamic_js'));
}

操作被添加到私有函数中,所以我不知道其中任何一个是否真的有用。试一试。如果不是我的第一个答案,因为它会阻止插件在指定的页面上加载。

<强>更新

好吧,我很接近......这是删除脚本的代码,由插件作者提供。

$foobox = Foobox_Free::get_instance();
remove_action('foobox-free_inline_scripts', array($foobox, 'inline_dynamic_js'));