Видаліть дію із зовнішнього класу


8

Я намагаюся тут зробити щось подібне до цього питання: видалити запуск або delete_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-message-in-head-head? відповіді = 29 # post-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

Дякую за всю вашу допомогу, я нарешті вирішив її. Я створив function.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

Якщо ви не можете отримати доступ до об’єкта класу, ви можете скористатися моїм файломremove_class_action для видалення дії / фільтра gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles

3

Я не думаю, що ти зможеш це зробити, використовуючи remove_action. Аргумент функції в remove_actionне допоможе вам, оскільки debug_marker()функція була не тією функцією, яка була використана у add_action()виклику.

Іоаст, мабуть, має щось подібне 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 дії в function.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.