Удалить/Отменить регистрацию или скрыть виджет, добавленный плагином


Я пытаюсь понять, как удалить виджеты wordpress, добавленные плагинами. Я знаю, что есть пара плагинов, которые делают это, напримерhttps://wordpress.org/plugins/wp-remove-widgets / и https://wordpress.org/plugins/post-lists-view-custom /, однако я бы предпочел не использовать отдельный плагин для чего-то, что кажется такой небольшой задачей.

В частности, я пытаюсь отменить регистрацию движка wordpress, работающего на виджете, который http://wpengine.com / загружается на страницу виджетов. Я поискал исходный код и обнаружил, что идентификатор виджета wpe_widget_powered_by

Однако это не работает...

function my_widgets_init() {
    unregister_widget( 'wpe_widget_powered_by' );
}
add_action('widgets_init', 'my_widgets_init');  

Пока единственное, что я смог эффективно сделать, это использовать комбинацию css/js, чтобы скрыть, а затем удалить виджет. Я использую css, чтобы скрыть его при загрузке страницы, а затем удалить с помощью jquery, чтобы не было пустого места, где должен находиться виджет.

function remove_wpe_powered_by_widget() {
?>
<style type="text/css">
    [id*="wpe_widget_powered_by"] {
display: none;
}
</style>
<script type="text/javascript">
    jQuery(document).ready(function($) {
    $("div[id$='wpe_widget_powered_by']").remove();
    });
</script>
<?php
}
add_action( 'admin_head', 'remove_wpe_powered_by_widget' );

Хотя вышесказанное работает, я знаю, что это не правильный способ делать вещи, и мне интересно, почему первая функция не работает. Кодекс предписывает сделать следующее.

<?php unregister_widget( $widget_class ) ?>

Возможно, я не понимаю, что такое $widget_class. Есть ли способ найти класс виджета без поиска в коде плагинов? Или у меня уже есть правильный класс, и он не работает по другой причине (возможно, поздний зацеп или что-то в этом роде).

Я просмотрел весь stackexchange и Интернет и смог найти только способы удалить виджеты по умолчанию, но никто не говорит вам, как удалить виджеты, добавленные плагинами. Извините, если я что-то упускаю, и это очевидный вопрос.

Author: Bryan Willis, 2014-06-04

2 answers

Не имея возможности увидеть код, используемый WPEngine для этого, это отчасти догадка.

Код, который вы должны удалить виджет, правильный, однако вы можете отменить его регистрацию только после его регистрации. Поэтому попробуйте отодвинуть свой обратный вызов дальше в очередь:

function wpse147602_deregister_widget() {
    unregister_widget( 'wpe_widget_powered_by' );
}
add_action( 'widgets_init', 'wpse147602_deregister_widget', 99999 );  

Есть ли способ найти класс виджетов без поиска в коде плагинов?

Нет.

... у меня уже есть правильный класс...?

Может быть. Виджеты являются дочерним классом php WP_Widget. Аргумент, передаваемый unregister_widget(), должен быть именем этого дочернего класса. Например, [Widget Class] ниже

class [Widget Class] extends WP_Widget{
 ...
}

Это то же самое утверждение, которое передается register_widget().

 2
Author: Stephen Harris, 2014-06-05 00:11:42

Спасибо Стивену за то, что помог мне разобраться в этом сегодня. Несмотря на то, что это что-то настолько маленькое, я абсолютно ненавижу, когда разработчики раздувают плагины с дерьмом, которое вам не нужно. Я был очень расстроен после WPEngine, сказав мне, что его нельзя удалить и что, если я действительно хочу его удалить, мне нужно найти функцию в папке MU-Plugins и удалить ее. Своего рода печальное известие от хостинговой компании "Wordpress" о том, что их решение заключается в удалении кода, когда это противоположно тому, как Wordpress был создан для работы.

В любом случае, мне удалось создать функцию отладки, которая печатает зарегистрированные виджеты. Вот оно:

function show_widget_classes() {
    global $wp_registered_widgets; 
    $widgets = array(); 
    if(is_array($wp_registered_widgets)){ 
        foreach($wp_registered_widgets as $widg){ 
            if(!empty($widg['callback'])){
                if(!empty($widg['callback'][0])){  
                    $class = get_class($widg['callback'][0]);
                    if(!array_key_exists($class, $widgets)){
                        $widgets[$class] = $widg['callback'][0]->name;
                    }
                }
            }
        }
    }
foreach($widgets as $widget_class  => $widget_title ){
        echo '<pre>'; print_r( $widget_class ); echo '</pre>';
    }
}
add_action( 'admin_notices', 'show_widget_classes' ); 

По иронии судьбы wpengine_powered_by оказался единственным, кто не появился. Сначала я подумал, что это конфликт с слишком ранней загрузкой виджета wpengine в папку mu-плагинов. Однако, перечитав ваш ответ об этом классе:

class [Widget Class] extends WP_Widget{
 ...
}

Я провел быстрый поиск grep в папке wpengine- общие плагины для расширяет WP_Widget:

grep -nr 'extends WP_Widget' /wpengine-common  

И Ничего! Поэтому, чтобы понять суть, я в конце концов просто поискал плагин и понял, что они использовали более старую функцию, которая регистрирует виджет, который содержит только слова в одном экземпляре. При использовании этого метода класс не используется.

Http://codex.wordpress.org/Function_Reference/wp_register_sidebar_widget

Итак, вместо этого:

unregister_widget

Вы бы использовали это:

wp_unregister_sidebar_widget

Вы также можете использовать:

Управление Wp_unregister_widget_control для функций, которые добавляют элементы управления с помощью wp_register_widget_control

Вот последняя функция, удаляющая виджет для всех, кого раздражает виджет "партнер" wpengines.

<?php
/**
* Plugin Name: Remove WpEngine Bloat
* Plugin URI: http://wordpress.stackexchange.com/questions/147602/
* Description: Remove the affiliate links widget from the Admin Widgets Page.
* Version: 1.0
* Author: Bryan WIllis
* Author URI: 
* License:
*/

function remove_unwanted_wpe_bloat_affiliate_widget_wpse_147602() {
// unregister the widget and its control
   wp_unregister_sidebar_widget('wpe_widget_powered_by');
}
add_action('widgets_init', 'remove_unwanted_wpe_bloat_affiliate_widget_wpse_147602', 1);

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

В качестве альтернативы, загрузите https://wordpress.org/plugins/post-lists-view-custom /, который позволяет удалять виджеты, однако у него были некоторые недостатки, а также добавляет много других вещей, если вы просто пытаетесь удалить виджеты.

 2
Author: Bryan Willis, 2014-06-06 05:06:48