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


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));
}

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 );
    }
}

-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 );

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


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

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

сделайте пожертвование, это продвижение по службе, вы либо прямо, либо косвенно извлекаете выгоду из этого финансирования
Питер Гусен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.