Usuń akcję z klasy zewnętrznej


8

Próbuję zrobić coś podobnego do tego pytania tutaj: remove_action lub remove_filter z klasami zewnętrznymi?

Próbuję usunąć

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

wiadomość z wtyczki.

Zanim zaczniesz na mnie krzyczeć, że to może być nieetyczne, autor mówi, że można to zrobić tutaj: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-yoast-message-in-page-headers? replies = 29 # post-2503475

Znalazłem klasę, która dodaje komentarz tutaj: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Zasadniczo WPSEO_Frontendklasa ma funkcję o nazwie debug_marker, która jest następnie wywoływana przez funkcję o nazwie head, która jest następnie dodawany do wp_headIN__Construct

Jestem nowy na zajęciach, ale znalazłem sposób na całkowite usunięcie głowy

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

ale chcę tylko usunąć z niego debug_markerczęść. Próbowałem tego, ale to nie działa remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Jak powiedziałem, jestem nowy na zajęciach, więc każda pomoc byłaby świetna.

Odpowiedzi:


5

Prostym sposobem na osiągnięcie tego (ale bez podejścia klasowego) jest filtrowanie wyjścia wp_headhaka akcji za pomocą buforowania wyjścia .

W swoim motywie header.phpzakończ wp_head()połączenie ob_start($cb)i ob_end_flush();funkcje takie jak:

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

Teraz w functions.phppliku motywu zadeklaruj wyjściową funkcję zwrotną ( ad_filter_wp_head_outputw tym przypadku):

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

Jeśli chcesz to wszystko zrobić za pomocą pliku functions.phpbez edycji header.php, możesz podpiąć się do zaczepów akcji get_headeri wp_headzdefiniować sesję buforowania danych wyjściowych:

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

Poszedłem z metodą hook, więc nie musiałbym edytować header.php. Dzięki.
Brooke.

4

Dzięki za całą pomoc, w końcu to rozwiązałem. Utworzyłem functions.php dla mojego motywu podrzędnego, a następnie dodaję

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

To najlepsza odpowiedź
sMyles

Jeśli nie możesz uzyskać dostępu do obiektu klasy, możesz użyć my, remove_class_actionaby usunąć akcję / filtr gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles

3

Nie sądzę, że będziesz w stanie to zrobić za pomocą remove_action. Argument funkcji w remove_actionnie pomoże, ponieważ debug_marker()funkcja nie była funkcją użytą w add_action()wywołaniu.

Yoast prawdopodobnie ma coś add_action( "wp_head", "head" )w swoim kodzie. Możesz więc usunąć funkcję „head”, ale debug_markernie została ona wyraźnie dodana jako akcja.

Mógłbyś

  1. Edytuj plik źródłowy Yoast i usuń debugowaną linię komentarza.
  2. Rozszerz WPSEO_Frontendklasę i przeciąż debug_markerfunkcję, aby zwrócić „”. TBH, nie jestem pewien, jak to by działało pod względem ładowania WP przez wtyczkę, ale warto to zbadać.

Dzięki, naprawdę nie chcę edytować pliku. Byłbym zainteresowany nauką, jak przedłużyć klasę, ale to trochę z mojej wiedzy.
Brooke.

Steve, próbowałem rozwiązania 2, zanim wpadłem na twój post. Chociaż miałem problemy z ukończeniem tego. Mój postęp opublikowałem jako odpowiedź na tej stronie. wordpress.stackexchange.com/a/209800/84030 Twoja pomoc byłaby mile widziana, jeśli masz pomysł, jak to rozwiązać.
Adrien Be

2

Znalezienie tego wątku po pracy na tym samym rozwiązaniu, co wspomniane przezSteve Claridge , to znaczy:

Rozszerz WPSEO_Frontendklasę i przeciąż debug_markerfunkcję, aby zwrócić „”

Szczegółowo opisałem poniższe kroki, chociaż utknąłem w ostatnim kroku.


Utwórz wtyczkę dostosowywania

Jak wspomniano w tym artykule z WP Tavern , „najłatwiejszym sposobem na osiągnięcie tego jest stworzenie wtyczki funkcjonalnej, która będzie działała obok niego”.

Więc zacząłem tworzyć moją pierwszą wtyczkę po tym artykule z ElegantTheme .

Rozszerz odpowiednią klasę.

Wtedy sprawy się skomplikowały. Dodałem następujące, ale z jakiegoś powodu moja funkcja zastępowania nadal nie jest uruchamiana.

//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
Och, dzięki za zwrócenie na to uwagi! Yoast WordPress Seo ma wiele akcji i filtrów, które pozwalają nam dokonywać tylko częściowych zmian w swoich klasach, podejście do rozszerzania klas może mi bardzo pomóc w pozbyciu się pewnych rzeczy w określonych kontekstach.
Adriano Monecchi,

1

Przekonałem się, że możesz usunąć akcję debug_marker w functions.php. Wtyczka Yoast jest wykonywana w akcji wp_head. Właśnie wziąłem hak akcji, który następuje bezpośrednio po tym, a mianowicie wp_enqueue_scripts i tam podłączyłem funkcję, która usunęła wynik debug_marker. W tym celu musisz również przekazać obiekt wtyczki. Również numer priorytetu musi być taki sam jak ustawiony z poziomu wtyczki.

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

Jednak to nie usuwa

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

część, bo to odbija się echem w kluczowej funkcji otoki Wtyczka za głowę . Możesz spróbować to zastąpić.


1

Aby dodać do odpowiedzi Ahmada, możesz po prostu usunąć wszystkie komentarze HTML z taką samą ilością kodu, ponieważ Yoast nie jest jedyną wtyczką, która to robi.

   <?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 za ogólne podejście. Usunięcie komentarza Yoast SEO może chwilę potrwać, aby odkryć, że po zainstalowaniu kolejnej wtyczki pojawia się inny.
Adrien Be

Tak, nienawidzę, gdy robią to wtyczki. Yoast, revslider, całkowita pamięć podręczna w3 i większość innych wtyczek pamięci podręcznej / minifikacji oraz mnóstwo innych.
Bryan Willis

1

Natknąłem się na fragment, który usuwa wszystkie komentarze SEO Yoast WordPress z interfejsu. Zmienia także metodę buforowania danych wyjściowych, z której korzystają odpowiedzi @ bryan-willis i @ ahmad-m.

Po prostu umieść fragment kodu w motywie functions.phplub niestandardowym pliku php wtyczki / motywu.

Zostawię to tutaj jako odniesienie - podziękowania należą się autorowi fragmentu

/**
 * 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

To jest zmodyfikowana wersja @ ahmad-m Odpowiedź , stosując filtry możesz wprowadzić wiele zmian treści w html nagłówka.

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

Znaleziono podobne rozwiązanie, dla functions.phpktórego nie używa priorytetu zakodowanego na stałe, 2ale dynamicznie czyta i używa priorytetu z 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

Zobacz funkcję flush_cache w wordpress-seo / frontend / class-frontend.php

Znajdź ten wiersz kodu

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

Zamienić

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

Dzięki twórcy tej świetnej wtyczki.


Nigdy nie zmieniaj żadnego pliku w żadnym motywie, wtyczce lub rdzeniu, jeśli nie jesteś autorem. Prosimy również nie korzystać z tej strony w celach promocyjnych.
Pieter Goosen,

Przepraszamy, nie robię promocji. Podaję tylko inne rozwiązanie. Być może nie najlepszy.
Wakanina,

rozważ dokonanie darowizny jest promocją, albo skorzystasz bezpośrednio lub pośrednio z tej finansialy
Pieter Goosen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.