«
»
WordPressПлагины

Как включить или отключить плагин WordPress на определенных страницах сайта?

Как включить или отключить плагин WordPress на определенных страницах сайта?

Когда я собирал сайт для моего плагина галереи Jusified Image Grid, я столкнулся с серьезной проблемой. Сайт начал накапливать много плагинов, просто чтобы продемонстрировать их совместимость на специальных демонстрационных страницах. Такие вещи, как плагины WooCommerce или Lightbox, загромождали не только мою админку, но и активную часть интерфейса, на всех страницах. Этот хаос повредил производительности, я мог сказать, даже не измеряя ее. Должен быть способ манипулировать списком активных плагинов, в частности, чтобы отключить плагин WordPress на определенных страницах. Или еще лучше, включайте их только там, где это необходимо. Следующий метод позволяет использовать множество плагинов для установки WordPress без существенного снижения производительности.

Концепция Must Use Plugins

Подход использует концепцию WordPress, которая называется Must Use Plugins. Когда вы посмотрите на WordPress loading sequenceзапущенными действиями, а не с загруженными файлами), вы поймете, почему. Это первое действие, которое запускается, поэтому Must Use Plugins загружается так рано, что вы можете направить остальную часть потока загрузки любым удобным вам способом, например, отключить плагин WordPress. В двух словах, Плагины Must Use – это отдельные файлы, живущие в WordPress.

Я буду называть это создание управления плагином отныне. Я покажу вам, как это работает, функция за функцией. Вы можете скачать полный плагин бесплатно в конце статьи. Однако я настоятельно рекомендую вам узнать или хотя бы понять, что здесь происходит, поскольку это не решение для автопилота. Он имеет возможность заблокировать любой плагин, в активированном или отключенном состоянии. Если вы не знаете, что происходит, это может привести к разочарованию.

Код для отключения плагина WordPress на определенных страницах

Итак, управление плагином начинается с минимального заголовка плагина, и это все, что нужно, чтобы сделать его плагином WordPress! (Как указано, когда я рекомендовал создавать плагины для добавления фрагментов.)

Первая функция, где вы можете изменить правила, а именно $enabling_rulesи $disabling_rulesмассивы. Ключи массива должны быть относительным путем к файлу каждого плагина в папке плагинов. Чаще всего это имя папки и имя файла плагина. Вы напишете правила для включения или отключения плагина WordPress на определенных страницах в виде значений массива для каждого плагина. Правилами страницы могут быть относительные URL на вашем сайте или нечеткие шаблоны регулярных выражений. Подробнее об этом позже.

Вы заметите WP Object Cacheраспространение по всему коду. Кэширование необходимо, потому что другие скрипты могут запрашивать список активных плагинов в любое время, несколько раз. И они делают. Не было бы смысла обрабатывать этот список десятки раз. Поэтому, когда Plugin Control манипулирует списком активных плагинов, он кэширует результаты. Это соответствует тому, как WordPress кэширует исходный список (который является опцией из базы данных с использованием ловушки).option_{$option}

<?php /* Plugin Name: Let's WP Plugin Control Description: Enable or Disable a WordPress Plugin on Specific Pages */ /** * Controls the rules by which plugins are manipulated * * @param array $plugins List of active plugins * @return array Modified list of active plugins */ function lwp_plugin_control($plugins) { $lwp_controlled_plugins = wp_cache_get('lwp_controlled_plugins', 'plugins'); if ($lwp_controlled_plugins !== false) { return $lwp_controlled_plugins; } wp_cache_set('lwp_original_plugins', $plugins, 'plugins'); // Enable plugins on certain URLs $enabling_rules = array( 'some-gallery/some-gallery.php' => array( '/gallery/' ) ); // Disable plugins on certain URLs $disabling_rules = array( 'some-lightbox/some-lightbox.php' => array( '/contact/$', '/wp-admin/post.php' ) ); // Run enables $plugins = array_unique( array_merge($plugins, lwp_plugins_affected_by($enabling_rules)) ); // Run disables $plugins = array_diff($plugins, lwp_plugins_affected_by($disabling_rules)); wp_cache_set('lwp_controlled_plugins', $plugins, 'plugins'); return $plugins; } add_filter('option_active_plugins', 'lwp_plugin_control');

Соответствие текущего URL правилам

Продолжая суть этого плагина, здесь происходит вся магия. Эта функция универсальна в том смысле, что ее не волнует включение или отключение. Он просто сопоставляет текущую страницу с вашими правилами и возвращает соответствующие плагины. Во-первых, он пытается сделать точное совпадение на текущем пути. Затем он прибегает к сопоставлению регулярных выражений, чтобы найти частичные совпадения. Вы можете заблокировать это поведение, используя привязки регулярных выражений, например, $чтобы отметить конец URL. В коде передача пустого массива в полезен для получения текущего пути в WordPress.add_query_arg()

/** * Scan for affected plugins to manipulate * * @param array $rules Plugin files paired with URL rules * @return array Affected plugins by their dir + file name */ function lwp_plugins_affected_by($rules) { $affected = array(); $current_path = add_query_arg(array()); foreach ($rules as $plugin => $paths) { // If any of the paths match the current path $matches = array_filter( $paths, function ($path) use ($current_path) { return ( $path === $current_path || preg_match('%'.$path.'%', $current_path) ); } ); if (empty($matches)) { continue; } $affected[] = $plugin; add_filter('plugin_action_links_'.$plugin, 'lwp_add_action_links'); } return $affected; }

Пометка затронутых плагинов в списке

Любопытные уже заметили, что я использую крюк. Это необязательно, и вы увидите его результат только при манипулировании плагинами в панели администратора или на панели инструментов. Обычно безопасно отключить плагин WordPress, который является ресурсоемким в некоторых частях администрировании сайта. Когда я захожу до плагинов с принудительным отключением или с принудительным включением даже в списке плагинов, я предпочитаю увидеть подсказку о них. Индикация отображается в виде красного сообщения вместо кнопки активации или деактивации. В любом случае они не будут работать, поэтому я заменяю их сообщением из Plugin Control.plugin_action_links_{$…}

Обратите внимание, что если вы внесете изменения в список плагинов вручную, включенное или отключенное состояние ваших управляемых плагинов будет запечатлено системой сразу после сохранения. Даже если вы переключаете незатронутые плагины. Это означает, что вы не можете слишком долго сохранять «изначально включенные» или «изначально отключенные» состояния. К счастью, Plugin Control не заботится об исходном состоянии ваших плагинов, поскольку он все еще может включать или отключать плагины WordPress.

/** * Show a red message if a plugin is affected by the MU plugin * It explains why it's not possible to change it by hand * * @param array $links Links in the plugin row, like "Activate" * @return array Changed links to show in the plugin row */ function lwp_add_action_links($links) { unset($links['activate'], $links['deactivate']); array_unshift($links, '<span style="color:red;">Controlled by MU!</span>'); return $links; }

Помехи от сторонних плагинов

Следующее совершенно необязательно. Даже на небольшой экспериментальной установке я столкнулся с плагином, который не использует лучшие практики и вызывает конфликты. По какой-то странной причине этот плагин (который не должен называться) сохранил список активных плагинов во внешнем интерфейсе. Это автоматически сохранило список управляемых плагинов, который задумал Plugin Control. Следующая часть кода обнаруживает несущественные изменения, такие как изменение порядка в списке активных плагинов, и предотвращает их сохранение с помощью фильтра. Это не влияет на ручное переключение плагинов на экране плагинов.pre_update_option_{$option_name}

/** * Prevent saving controlled plugin states by 3rd party plugins * * @param array $new_value New list of active plugins * @param array $old_value Old list of active plugins * @return array New list of active plugins */ function lwp_prevent_saving_plugins($new_value, $old_value) { $lwp_controlled_plugins = wp_cache_get('lwp_controlled_plugins', 'plugins'); $lwp_original_plugins = wp_cache_get('lwp_original_plugins', 'plugins'); sort($old_value); sort($new_value); sort($lwp_controlled_plugins); if (($new_value === $old_value) && ($old_value === $lwp_controlled_plugins)) { return $lwp_original_plugins; } return $new_value; } add_filter( 'pre_update_option_active_plugins', 'lwp_prevent_saving_plugins', 10, 2 );

Скачать плагин Control Must Use Plugin

Даже если вы решили пропустить большую часть этой статьи, вам все равно нужно внести изменения в правила. Для управления плагином необходимо знать, чтобы включить или отключить плагин WordPress. Ваши плагины и ваши страницы будут отличаться, это означает, что это не будет работать из коробки. Это мощный инструмент, и поскольку вы читаете эту статью, необходимость использовать что-то подобное уже возникла. Тем не менее, это зависит от вас, как вы используете это. Вы можете проверить производительность ваших результатов. Для меня часто достаточно знать, что ненужные плагины находятся в состоянии покоя. Это дает мне душевное спокойствие и освобождает некоторые потраченные впустую циклы процессора. 

Почему я широко использую это даже на страницах администратора? Потому что независимо от того, сколько плагинов кэширования и CDN я добавляю на сайт, они приносят пользу только тем посетителям, которые не вошли в систему. Для меня управление сайтом все еще может быть обходом. Этот плагин тоже поможет вам, но вы должны научится его правилам!

Обновление! : добавлена pluginsгруппа к вызовам функции кэширования, это помогает при использовании плагина W3TC.

Источник записи: https://letswp.io

Связанные записи
WordPressВсе для functions.phpВсе для разработки плагиновПлагиныШорткоды

Как добавить Автоматическое оглавление в WordPress

WordPressЗащита от вирусовПлагины

Как очистить взломанный сайт WordPress с помощью плагина Wordfence

WordPressWordPress - АдминкаВсе для wp-config.php

Что такое электронные ключи в WordPress? Как использовать и генерировать электронные ключи для wp-config.php

WordPressЗащита от вирусовПлагины

Взломанные сайты WordPress защищаются злоумышленниками (Мнение специалиста WordFence | Взлом плагина File Manager )