【问题标题】:Disable specific plugin on Wordpress frontpage/homepage only仅在 Wordpress 头版/主页上禁用特定插件
【发布时间】:2016-07-03 04:38:49
【问题描述】:

我正在尝试禁用 Wordpress 主页上的插件,以使其更轻松。我只希望在显示首页时禁用它。

我在 wp-content/mu-plugins/ 中得到了这个工作代码 它在除指定的 /subpage/ 之外的所有页面上禁用一个插件 这很好,但这并不是我所追求的。

如何更改此代码以仅在查看首页时禁用插件?

代码如下:

add_filter( 'option_active_plugins', 'lg_disable_plugin' );
function lg_disable_plugin($plugins){

    if(strpos($_SERVER['REQUEST_URI'], '/subpage/') === FALSE AND strpos($_SERVER['REQUEST_URI'], '/wp-admin/') === FALSE) {

        $key = array_search( 'was-this-helpful-pro/was-this-helpful-pro.php' , $plugins );

        if ( false !== $key ) {
            unset( $plugins[$key] );
        }
    }

    return $plugins;
}

我还发现了另一个适用于其他页面的代码.... 但它是同一个故事,我不知道如何使它适用于首页,只适用于子页面**

$listener_term = '/subpage/';
$current_url   = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . '';

// listener for the thin load
if ( strstr( $current_url, $listener_term ) ) {
 add_filter( 'option_active_plugins', 'api_request_disable_plugin' );
}
function api_request_disable_plugin( $plugins ) {
 $plugins_not_needed = array(
 'backupwordpress/backupwordpress.php',
 'wordfence/wordfence.php',
 'contact-form-7-to-database-extension/contact-form-7-db.php',
 'contact-form-7/wp-contact-form-7.php',
 'wp-piwik/wp-piwik.php',
 'simple-responsive-slider/simple-responsive-slider.php',
 'google-sitemap-plugin/google-sitemap-plugin.php',
 'category-page-icons/menu-compouser.php',
 'easy-fancybox/easy-fancybox.php',
 'business-owner-switch/business-owner-switch.php',
 'wordpress-seo/wp-seo.php'
 );

 foreach ( $plugins_not_needed as $plugin ) {
 $key = array_search( $plugin, $plugins );
 if ( false !== $key ) {
 unset( $plugins[ $key ] );
 }
 }

 return $plugins;
}

有什么想法吗?

我想我应该提一下:

  1. 第一个示例将禁用除 /subpage/ 之外的所有页面上的插件
  2. 第二个代码将禁用 /subpage/ 上列出的所有插件

无论我尝试什么,它们都不适用于首页/主页。

【问题讨论】:

  • 这类题要不要迁移到Wordpress.stackexchange上?

标签: php optimization wordpress


【解决方案1】:

我没有意识到您希望它出现在首页 - 代码 sn-p 表明您也希望它出现在其他页面上。

我之前建议您可以使用 is_home 或 is_front_page,但在我们这样做的阶段,它们还没有被加载 - 所以这里的替代方法是加载 REQUEST_URI 并查看它是否为空白。如果它是空白的,我们将假设我们在主页上 - 为了满足可能不在根目录的安装,我们将 URL 与站点的相对主页位置进行比较 - 为了增加安全性,我们将其封装在 htmlspecialcharacters 中(可能没有必要)。

也许可以尝试这样的事情(看,这可能不是最好的方法,但它确实对我有用):

add_filter( 'option_active_plugins', 'lg_disable_plugin' );
function lg_disable_plugin($plugins){
    if (htmlspecialchars(trim(wp_make_link_relative(get_site_url()),'/')) == htmlspecialchars(trim($_SERVER['REQUEST_URI'],'/'))) {
        $key = array_search( 'was-this-helpful-pro/was-this-helpful-pro.php' , $plugins );
        if ( false !== $key ) {
            unset( $plugins[$key] );
        }
    }

    return $plugins;
}

如果您想对多个插件执行此操作,可以将代码更改为以下内容:

    add_filter( 'option_active_plugins', 'lg_disable_plugin' );
    function lg_disable_plugin($plugins){
        if (htmlspecialchars(trim(wp_make_link_relative(get_site_url()),'/')) == htmlspecialchars(trim($_SERVER['REQUEST_URI'],'/'))) {
            $plugins_not_needed = array ('was-this-helpful-pro/was-this-helpful-pro.php',
           'pluginfolder/plugin-name.php');
            foreach ( $plugins_not_needed as $plugin ) {
                $key = array_search( $plugin, $plugins );
                if ( false !== $key ) {
                    unset( $plugins[ $key ] );
                }
            }
        }

        return $plugins;
    }

【讨论】:

  • 也许可以尝试 is_home() 而不是 is_front_page() - 您是否在阅读设置中将静态页面设置为首页?
  • 您确定要在模板中某处(页眉/或页面等)加载 wp_head() 吗?
  • 如果您正在更改查询,您可以尝试 wp_reset_query(); (在主页上或在您更改查询之后 - 在检查之前......我在这里在黑暗中飞行......不在函数中!
  • 你试过添加 echo is_home();作为第一行代码 - 好奇它是否输出 1。
  • 哈哈!我很傻。我应该重新阅读您的代码..让我调整我的答案。我看到了问题。
【解决方案2】:

您可以编写一个 mu-plugin,如果您没有它,请在“wp-content”文件夹中创建一个名为“mu-plugins”的文件夹,然后创建一个 PHP 文件,您可以在其中编写并尝试此代码:

if( !is_admin() && empty( $_POST ) ){
    $uri = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    $uriArr = explode( '?',$uri );
    $uri = $uriArr[0];
    $home_uri = str_replace( 'https://','',str_replace( 'http://','',home_url( '/' ) ) );
    if ( $uri === $home_uri ) {
        $paths = array(
            'plugin_folder1/plugin1.php'
            'plugin_folder2/plugin2.php'
        );
        global $paths;
        add_filter( 'option_active_plugins', 'my_option_active_plugins' );
    }
}

function my_option_active_plugins( $plugins ){
    global $paths;
    foreach( $paths as $path ){
        $k = array_search( $path, $plugins );
        if( false !== $k ){
            unset( $plugins[$k] );
        }
    }

    return $plugins;
}

只需将 "plugin_folder1/plugin1.php" ... 替换为您要停用的插件

另一种选择是安装免费插件 Freesoul Deactivate Plugins,您将能够轻松地为每个页面、帖子、自定义帖子和存档停用所需的插件。

【讨论】:

    【解决方案3】:

    这是我写的一个抽象,它允许你指定一个路由并传递一个插件列表。将插件打印到日志或屏幕上以获取它们的名称,然后将它们添加到数组中,它们将被过滤。

    要考虑的另一种方法是用白名单替换目标,因此您必须为每个路由定义更少的东西(如果您有很多插件)。

    /**
     * strpos() returns the start position of the substring if found, which 
     * if 0 will trigger false, so prepend something (in this case 'x') 
     * to offset it to return 1 (true).
     */
    add_filter( 'option_active_plugins', function( $plugins ){
    
        $needle = '/some-route/path';
        $haystack = 'x' . $_SERVER['REQUEST_URI']; // prepend something to string 
        if (strpos($haystack, $needle) !== false) {
            $targets = [
                'wecreativez-woo-cart-share-and-save/wecreativez-woo-cart-share-and-save.php',
                'what-the-file/what-the-file.php',
                'woo-address-book/woocommerce-address-book.php',
                'ubermenu/ubermenu.php',
                'flexible-checkout-fields-pro/flexible-checkout-fields-pro.php',
                'ewww-image-optimizer/ewww-image-optimizer.php',
                'svg-support/svg-support.php',
                'gravityforms/gravityforms.php',
                'all-in-one-seo-pack-pro/all_in_one_seo_pack.php',
                'js_composer/js_composer.php',
            ];
    
            echo "Before Filter: Active Plugins for ($needle):";
            echo '<pre>';
            print_r($plugins);
    
            foreach( $targets as $target ) {
                array_splice($plugins, array_search($target, $plugins), 1);
            }
    
            echo "After Filter: Active Plugins for ($needle):";
            print_r($plugins);
            die;
    
        }
    
        return $plugins;
    
    }, PHP_INT_MAX);
    

    这可以扩展为使用一组针(路线),其中包含一组要删除的插件以获得更多控制。

    类似:

    $needles = [
        '/route-1/' => [
            'gravityforms/gravityforms.php',
        ],
        '/shop/' => [
            'gravityforms/gravityforms.php',
            'ewww-image-optimizer/ewww-image-optimizer.php',
            'flexible-checkout-fields-pro/flexible-checkout-fields-pro.php',
        ],
        'search' [
            'ewww-image-optimizer/ewww-image-optimizer.php',
            'flexible-checkout-fields-pro/flexible-checkout-fields-pro.php',
        ],
    ];
    
    
    
    $haystack = 'x' . $_SERVER['REQUEST_URI']; // prepend something to string 
    
    foreach ($needles as $needle => $targets) {
    
        if (strpos($haystack, $needle) !== false) {
    
             foreach( $targets as $target ) {
                   array_splice($plugins, array_search($target, $plugins), 1);
             }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      相关资源
      最近更新 更多