我目前正在使用Foobox (免费)插件,显然插件的文件被加载到每个页面上,不管是否使用它。不过,我想要更改它,但是我似乎找不到任何句柄来对脚本进行排队列。
看起来脚本是由下面的代码调用的,至少对我来说,它没有显示任何句柄。我尝试使用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' );
}
}也尝试了下面的方法,它只是从页脚框文件中直接复制出来的:
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');发布于 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中,然后有两个条件。第一个在指定的页面上禁用一个正常活动的插件,第二个在指定的页面上启用正常禁用的插件。
<?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中:
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'));https://stackoverflow.com/questions/47444280
复制相似问题