Удалить действие из внешнего класса

8

Я пытаюсь сделать что-то похожее на этот вопрос здесь: remove_action или remove_filter с внешними классами?

Я пытаюсь удалить

<!-- This site is optimized with the Yoast WordPress SEO plugin v1.0.3 - http;//yoast.com/wordpress/seo/ -->

сообщение от плагина.

И прежде чем кричать на меня о том, что это может быть неэтично, автор говорит, что здесь можно делать: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-Yoast-сообщение-в-страничных заголовки? ответы = 29 # пост-2503475

Я нашел класс, который добавляет комментарий здесь: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

В основном у WPSEO_Frontendкласса есть функция с именем, debug_markerкоторая затем вызывается функцией с именем, headкоторая затем добавляется wp_headв__Construct

Я новичок в занятиях, но я нашел способ полностью удалить голову, выполнив

global $wpseo_front;    
remove_action( 'wp_head', array($wpseo_front,'head'), 1, 1 );

но я только хочу удалить debug_markerчасть из этого. Я пытался это, но это не работает remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Как я уже сказал, я новичок в занятиях, поэтому любая помощь будет отличной.

Брук.
источник

Ответы:

5

Простой способ добиться этого (но без подхода класса) - это отфильтровать выходные данные wp_headловушки действий, используя буферизацию выходных данных .

В вашей темы header.php, обернуть wp_head()вызов ob_start($cb)и ob_end_flush();функции , такие как:

ob_start('ad_filter_wp_head_output');
wp_head();
ob_end_flush();

Теперь в functions.phpфайле темы объявите свою функцию обратного вызова вывода ( ad_filter_wp_head_outputв этом случае):

function ad_filter_wp_head_output($output) {
    if (defined('WPSEO_VERSION')) {
        $output = str_ireplace('<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - http://yoast.com/wordpress/seo/ -->', '', $output);
        $output = str_ireplace('<!-- / Yoast WordPress SEO plugin. -->', '', $output);
    }
    return $output;
}

Если вы хотите сделать все , что через functions.phpбез редактирования header.phpфайла, вы можете подключить к get_headerи wp_headдействиям крючков для определения выходного буферную сессии:

add_action('get_header', 'ad_ob_start');
add_action('wp_head', 'ad_ob_end_flush', 100);
function ad_ob_start() {
    ob_start('ad_filter_wp_head_output');
}
function ad_ob_end_flush() {
    ob_end_flush();
}
function ad_filter_wp_head_output($output) {
    if (defined('WPSEO_VERSION')) {
        $output = str_ireplace('<!-- This site is optimized with the Yoast WordPress SEO plugin v' . WPSEO_VERSION . ' - http://yoast.com/wordpress/seo/ -->', '', $output);
        $output = str_ireplace('<!-- / Yoast WordPress SEO plugin. -->', '', $output);
    }
    return $output;
}
Ахмад М
источник
Я пошел с методом ловушки, чтобы мне не пришлось редактировать header.php. Спасибо.
Брук.
4

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

// we get the instance of the class
$instance = WPSEO_Frontend::get_instance();
/* then we remove the function
    You can remove also others functions, BUT remember that when you remove an action or a filter, arguments MUST MATCH with the add_action
    In our case, we had :
    add_action( 'wpseo_head', array( $this, 'debug_marker' ), 2 );

    so we do : 
    remove_action( 'wpseo_head', array( $this, 'debug_marker' ), 2 );
    */
    remove_action( 'wpseo_head', array( $instance, 'debug_marker' ), 2 );
Майк Лекомт
источник
Это лучший ответ
sMyles
Если вы не можете получить доступ к объекту класса, вы можете использовать my, remove_class_actionчтобы удалить действие / фильтр gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles
3

Я не думаю, что вы сможете сделать это, используя remove_action. Аргумент функции in вам remove_actionне поможет, так как debug_marker()функция не была той функцией, которая использовалась в add_action()вызове.

В Yoast есть что-то похожее add_action( "wp_head", "head" )на его код. Таким образом, вы можете удалить функцию «head», но debug_markerона не была явно добавлена ​​как действие.

Вы могли бы

  1. Отредактируйте исходный файл Yoast и удалите строку комментария отладки.
  2. Расширьте WPSEO_Frontendкласс и перегрузите debug_markerфункцию для возврата "". TBH, я не уверен, как это будет работать с точки зрения загрузки плагина WP, но может стоить исследовать.
Стив Кларидж
источник
Спасибо, я действительно не хочу редактировать файл. Мне было бы интересно узнать, как расширить класс, но это немного из моих знаний.
Брук.
Стив, я пробовал решение 2, прежде чем наткнуться на твой пост. Хотя у меня были проблемы с завершением этого. Я разместил свой прогресс в качестве ответа на этой странице. wordpress.stackexchange.com/a/209800/84030 Ваша помощь будет признательна, если у вас есть идея, как я могу решить эту проблему.
Адриен Бе
2

Поиск этой темы после работы над тем же решением, что и упомянутоеSteve Claridge , то есть:

Расширьте WPSEO_Frontendкласс и перегрузите debug_markerфункцию для возврата ""

Я подробно описал шаги ниже, хотя я застреваю на последнем шаге.


Создать плагин настройки

Как упоминалось в этой статье WP Tavern , «самый простой способ сделать это - создать функциональный плагин, который будет работать вместе с ним».

Итак, я приступил к созданию своего первого плагина после этой статьи от ElegantTheme .

Расширить соответствующий класс.

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

//get the base class
if(!class_exists('WPSEO_Frontend')) {
    require_once $_SERVER['DOCUMENT_ROOT'] . '/wp-content/plugins/wordpress-seo/frontend/class-frontend.php';
}

/**
 * Class Definition
 */
class WPSEO_Frontend_GUP extends WPSEO_Frontend{

    /**
     * 
     * OVERRIDES function from YOAST SEO
     * 
     * Outputs or returns the debug marker, which is also used for title replacement when force rewrite is active.
     *
     * @param bool $echo Whether or not to echo the debug marker.
     *
     * @return string
     */
    public function debug_marker( $echo = true ) {
        return '';
    }

}
Адриен Бе
источник
1
О, спасибо, что указал на это! Yoast WordPress Seo имеет множество действий и фильтров, которые позволяют нам вносить только частичные изменения в его классы, а подход с расширением классов может помочь мне избавиться от некоторых вещей в определенных контекстах.
Адриано Монекки
1

Я обнаружил, что вы можете удалить действие debug_marker в functions.php. Плагин Yoast выполняется в действии wp_head. Я просто взял ловушку действия, которая следует сразу после этого, а именно wp_enqueue_scripts, и там я подключил функцию, которая удалила вывод debug_marker. Для этого вам также нужно передать объект плагина. Также номер приоритета должен совпадать с номером, установленным внутри плагина.

function remove_debugmarker(){
global $wpseo_front;
remove_action( 'wpseo_head', array($wpseo_front, 'debug_marker') , 2 );
}
add_action('wp_enqueue_scripts','remove_debugmarker');

Однако это не удаляет

<!-- / Yoast WordPress SEO plugin. -->

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

Ожье Шелвис
источник
1

Чтобы добавить к ответу Ахмада, вы можете просто удалить все html-комментарии с одинаковым количеством кода, так как Yoast не единственный плагин, который делает это.

   <?php
   function remove_html_comments_buffer_callback($buffer) {
        $buffer = preg_replace('/<!--[^\[\>\<](.|\s)*?-->/', '', $buffer);
        return $buffer;
    }
    function remove_html_comments_buffer_start() {
        ob_start("remove_html_comments_buffer_callback");
    }
    function remove_html_comments_buffer_end() {
        ob_end_flush();
    }
    add_action('template_redirect', 'remove_html_comments_buffer_start', -1);
    add_action('get_header', 'remove_html_comments_buffer_start'); 
    add_action('wp_footer', 'remove_html_comments_buffer_end', 999);
Брайан Уиллис
источник
1
+1 за общий подход. Удаление Yoast SEO-комментария может занять некоторое время, и только после того, как вы установите другой плагин, появится еще один.
Адриен Бе
Да, я ненавижу, когда плагины делают это. Yoast, revslider, общий кеш w3 и большинство других плагинов кеша / минификации, и множество других это делают.
Брайан Уиллис
1

Я наткнулся на фрагмент, который удаляет все комментарии Yoast WordPress SEO из внешнего интерфейса. Он также изменяет подход буферизации вывода, который используют ответы @ bryan-willis и @ ahmad-m.

Просто поместите фрагмент в свою тему functions.phpили пользовательский php-файл плагина / темы.

Я оставлю это здесь в качестве ссылки - кредит переходит к автору сниппета

/**
 * Yoast WordPress SEO Plugin - Remove All Yoast HTML Comments
 * See at: https://gist.github.com/paulcollett/4c81c4f6eb85334ba076
**/
if (defined('WPSEO_VERSION')){
  add_action('get_header',function (){ ob_start(function ($o){
  return preg_replace('/\n?<.*?yoast.*?>/mi','',$o); }); });
  add_action('wp_head',function (){ ob_end_flush(); }, 999);
}
Адриано Монеччи
источник
0

Это модифицированная версия @ ahmad-m Answer , применяя фильтры, вы можете сделать несколько изменений содержимого в заголовке html.

function header_str_replace_start(){
    ob_start('header_str_replace_output');
}
function header_str_replace_output($output){
    return apply_filters('header_str_replace', $output);
}
function header_str_replace_finish(){
    ob_end_flush();
}
add_action('get_header', 'header_str_replace_start',-1);
add_action('wp_head', 'header_str_replace_finish', 999);


add_filter( 'header_str_replace', 'remove_yeost_seo_comments' ) ;
add_filter( 'header_str_replace', 'remove_white_space');


function remove_yeost_seo_comments($output) {
    $output = str_ireplace('<!-- / Yoast SEO plugin. -->', '', $output);
    return $output;
}


function remove_white_space($content){
     return trim(preg_replace('/\s+/', ' ', $content));
}
TarranJones
источник
0

Нашел похожее решение, для functions.phpкоторого не используется жестко заданный приоритет, 2но динамически считывается и используется приоритет от Yoast add_action().

// disable 'This site is optimized with the Yoast SEO ...'
if ( class_exists( 'WPSEO_Frontend') && method_exists( 'WPSEO_Frontend', 'get_instance' ) ) {
    $wpseo_front = WPSEO_Frontend::get_instance();
    if ( $wpseo_dbg_prio = has_action( 'wpseo_head', array( $wpseo_front, 'debug_mark' ) ) ) {
        remove_action( 'wpseo_head', array( $wpseo_front, 'debug_mark'), $wpseo_dbg_prio );
    }
}
Ov3rfly
источник
-3

Смотрите функцию flush_cache в wordpress-seo / frontend / class-frontend.php

Найти эту строку кода

$content = str_replace( $this->debug_marker( false ), $this->debug_marker( false ) . "\n" . '<title>' . $title . '</title>', $content );

Заменить

$content = str_replace( $this->debug_marker( false ), '<title>' . $title . '</title>', $content );

Спасибо создателю этого замечательного плагина.

Wakanina
источник
Никогда не меняйте файл в какой-либо теме, плагине или ядре, если вы не автор. Также, пожалуйста, не используйте этот сайт в рекламных целях.
Питер Гусен
Извините, я не занимаюсь продвижением. Я просто предоставляю другое решение. Возможно, не самый лучший.
Ваканина
сделайте пожертвование, это продвижение по службе, вы либо прямо, либо косвенно извлекаете выгоду из этого финансирования
Питер Гусен