Rimuovi un'azione da una classe esterna


8

Sto cercando di fare qualcosa di simile a questa domanda qui: remove_action o remove_filter con classi esterne?

Sto cercando di rimuovere il

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

messaggio dal plugin.

E prima che tu mi gridi su come questo possa non essere etico, l'autore dice che va bene fare qui: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous pagina-headers -inserted-Yoast-messaggio-in-? risposte = 29 # post-2503475

Ho trovato la classe che aggiunge il commento qui: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Fondamentalmente la WPSEO_Frontendclasse ha una funzione chiamata debug_markerche viene quindi chiamata da una funzione chiamata headche viene quindi aggiunta a wp_headin__Construct

Sono nuovo alle lezioni, ma ho trovato un modo per rimuovere completamente la testa facendo

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

ma voglio solo rimuovere la debug_markerparte da esso. Ho provato questo ma non funziona remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Come ho già detto, sono nuovo alle lezioni, quindi qualsiasi aiuto sarebbe fantastico.

Risposte:


5

Un modo semplice per raggiungere questo obiettivo (ma senza l'approccio Class) è filtrare l'output wp_headdell'action hook utilizzando l' output buffering .

Nel tema header.php, avvolgi la wp_head()chiamata con ob_start($cb)e ob_end_flush();funzioni come:

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

Ora nel functions.phpfile del tema , dichiara la tua funzione di callback di output ( ad_filter_wp_head_outputin questo caso):

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

Se si desidera eseguire tutto ciò tramite il file di functions.phpmodifica senza header.php, è possibile eseguire il hook get_headere hook di wp_headazione per definire la sessione di buffering di output:

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

Sono andato con il metodo hook quindi non avrei dovuto modificare header.php. Grazie.
Brooke.

4

Grazie per tutto il tuo aiuto, finalmente l'ho risolto. Ho creato un.php per il tema di mio figlio, quindi aggiungo

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

Questa è la risposta migliore
sMyles,

Se non riesci ad accedere all'oggetto classe, puoi usare my remove_class_actionper rimuovere l'azione / filtro gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles

3

Non penso che sarai in grado di farlo usando remove_action. L'argomento della funzione in remove_actionnon ti aiuterà in quanto la debug_marker()funzione non era la funzione utilizzata nella add_action()chiamata.

Probabilmente hai qualcosa di simile add_action( "wp_head", "head" )nel suo codice. Quindi puoi rimuovere la funzione "head", ma debug_markernon è stato aggiunto esplicitamente come azione.

Potresti

  1. Modifica il file sorgente di Yoast e rimuovi la riga dei commenti di debug.
  2. Estendi la WPSEO_Frontendclasse e sovraccarica la debug_markerfunzione per restituire "". TBH, non sono sicuro di come funzionerebbe in termini di caricamento del plugin da parte di WP, ma vale la pena indagare.

Grazie, non voglio davvero modificare il file. Sarei interessato a imparare come estendere la lezione, ma questo è un po 'fuori dalla mia conoscenza.
Brooke.

Steve, stavo provando la soluzione 2 prima di imbatterti nel tuo post. Sebbene avessi problemi a completarlo. Ho pubblicato i miei progressi come risposta in questa pagina. wordpress.stackexchange.com/a/209800/84030 Il tuo aiuto sarebbe apprezzato se avessi un'idea di come potrei risolverlo.
Adrien, il

2

Trovare questa discussione dopo aver lavorato sulla stessa soluzione di quella menzionataSteve Claridge , ovvero:

Estendi la WPSEO_Frontendclasse e sovraccarica la debug_markerfunzione per restituire ""

Ho dettagliato i passaggi seguenti, anche se mi sto bloccando nel passaggio finale.


Crea un plug-in di personalizzazione

Come menzionato in questo articolo di WP Tavern , "il modo più semplice per farlo è creare un plugin di funzionalità che verrà eseguito accanto ad esso".

Quindi ho continuato a creare il mio primo plugin seguendo questo articolo di ElegantTheme .

Estendi la classe pertinente.

Questo è quando le cose si sono complicate. Ho aggiunto quanto segue ma la mia funzione di override non è ancora attivata per qualche motivo.

//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
Oh, grazie per averlo segnalato! Yoast WordPress Seo ha un sacco di azioni e filtri che ci consentono di apportare solo modifiche parziali alle sue classi, l'approccio di estensione della classe potrebbe aiutarmi molto a liberarmi di alcune cose in contesti specifici.
Adriano Monecchi,

1

Ho scoperto che puoi rimuovere l'azione debug_marker in Functions.php. Il plug-in Yoast viene eseguito nell'azione wp_head. Ho appena preso l'hook dell'azione che segue subito dopo, vale a dire wp_enqueue_scripts e lì ho agganciato una funzione che ha rimosso l'output di debug_marker. Per questo devi anche passare l'oggetto plugin. Anche il numero di priorità deve essere uguale a quello impostato all'interno del plugin.

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

Tuttavia, questo non rimuove il

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

parte, perché questo fa eco nella testa della funzione wrapper cruciale del plugin . Potresti provare a sovrascriverlo.


1

Per aggiungere alla risposta di Ahmad puoi semplicemente rimuovere tutti i commenti HTML con la stessa quantità di codice, poiché Yoast non è l'unico plugin che lo fa.

   <?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 per l'approccio generico. Potrebbe volerci un po 'di tempo per rimuovere il commento su Yoast SEO per scoprire che ce n'è un altro dopo l'installazione di un altro plugin.
Adrien, il

Sì, odio quando i plugin lo fanno. Yoast, revslider, w3 total cache e molti altri plug-in cache / minificazione, e molti altri lo fanno.
Bryan Willis,

1

Mi sono imbattuto in uno snippet che rimuove tutti i commenti SEO di Yoast WordPress dal front-end. Modifica inoltre l'approccio di buffering dell'output utilizzato dalle risposte di @ bryan-willis e @ ahmad-m.

Posiziona semplicemente lo snippet sul tuo tema functions.phpo su un file php plugin / tema personalizzato.

Lo lascerò qui come riferimento: il merito va all'autore dello snippet

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

Questa è una versione modificata di @ ahmad-m Answer , applicando i filtri è possibile apportare più modifiche al contenuto nell'intestazione 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

Trovata una soluzione simile per la functions.phpquale non utilizza la priorità codificata 2ma legge e utilizza in modo dinamico la priorità di 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

Vedi la funzione flush_cache in wordpress-seo / frontend / class-frontend.php

Trova questa riga di codice

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

Sostituirlo con

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

Grazie al creatore di questo fantastico plugin.


Non modificare mai alcun file in alcun tema, plugin o core se non sei l'autore. Inoltre, non utilizzare questo sito per motivi promozionali.
Pieter Goosen il

Mi dispiace, non sto facendo una promozione. Fornisco solo un'altra soluzione. Forse non il migliore.
Wakanina,

considera che fare una donazione è promozione, o beneficia direttamente o indirettamente di questo finansialy
Pieter Goosen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.