我目前正在使用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');
答案 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'));