Harici bir Sınıftan eylem kaldırma


8

Ben burada bu soruya benzer bir şey yapmaya çalışıyorum: remove_action veya dış sınıfları ile remove_filter?

Kaldırmaya çalışıyorum

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

eklentiden mesaj.

Ve bana bunun nasıl etik dışı olabileceğini söylemeden önce yazar burada yapmanın uygun olduğunu söylüyor: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-Yoast-ileti-in-page-başlıklarıyla? cevaplar = 29 # sonrası 2503475

Burada yorumu ekleyen sınıfı buldum: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Temelde WPSEO_Frontendsınıfın adı debug_markerdaha sonra adı headeklenmiş bir fonksiyon tarafından çağrılan bir işleve sahiptir wp_head.__Construct

Derslerde yeniyim ama kafayı tamamen çıkarmanın bir yolunu buldum

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

ama sadece debug_markerparçayı çıkarmak istiyorum . Bunu denedim ama işe yaramıyor remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Dediğim gibi derslerde yeniyim, bu yüzden herhangi bir yardım harika olurdu.

Yanıtlar:


5

Bunu başarmanın basit bir yolu (ancak Sınıf yaklaşımı olmadan), çıktı tamponlamasınıwp_head kullanarak eylem kancasının çıkışını filtrelemektir .

Temanızın header.phpiçinde wp_head()aramayı ob_start($cb)ve aşağıdaki ob_end_flush();gibi işlevlerle sarın :

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

Şimdi tema functions.phpdosyasında, çıkış geri arama işlevinizi bildirin ( ad_filter_wp_head_outputbu durumda):

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

Bunları functions.phpdüzenleme header.phpdosyası olmadan yapmak istiyorsanız , çıktı arabelleğe alma oturumunu tanımlamak için kancalara get_headerve wp_headişlem kancalarına bağlanabilirsiniz :

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 dosyasını düzenlemek zorunda kalmayacağım için hook yöntemiyle gittim. Teşekkürler.
— Brooke.

4

Tüm yardımlarınız için teşekkürler, sonunda çözdüm. Çocuk temam için bir function.php oluşturdum, sonra ekle

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

Bu en iyi cevaptır
— sMyles


3

Bunu kullanarak yapabileceğinizi sanmıyorum remove_action. İşlev bağımsız değişkeni , işlev çağrıda kullanılan işlev olmadığından remove_actionsize yardımcı debug_marker()olmaz add_action().

Muhtemelen add_action( "wp_head", "head" )kodunda olduğu gibi bir şey var . Böylece "head" işlevini kaldırabilirsiniz, ancak debug_markeraçıkça bir eylem olarak eklenmedi.

Yapabilirdin

  1. Yoast'ın kaynak dosyasını düzenleyin ve hata ayıklama yorum satırını kaldırın.
  2. WPSEO_FrontendSınıfı genişletin ve debug_marker"" işlevine dönmek için işlevi aşırı yükleyin . TBH, bunun eklenti yükleme WP açısından nasıl çalışacağından emin değilim, ancak araştırmaya değer olabilir.

Teşekkürler, dosyayı gerçekten düzenlemek istemiyorum. Sınıfı nasıl genişleteceğimi öğrenmek isterdim ama bu biraz bilgim dışında.
— Brooke.

Steve, görevine çarpmadan önce çözüm 2'yi deniyordum. Her ne kadar bunu tamamlamakta sorun yaşıyordum. İlerlememi bu sayfada bir cevap olarak gönderdim. wordpress.stackexchange.com/a/209800/84030 Bunu nasıl çözeceğime dair bir fikriniz varsa yardımınız takdir edilecektir.
— Adrien Be

2

BahsedilenleSteve Claridge aynı çözüm üzerinde çalıştıktan sonra bu konuyu bulmak , yani:

WPSEO_FrontendSınıfı genişletin ve debug_marker"" işlevini döndürmek için işlevi aşırı yükleyin

Son adımda takılı kalmamıza rağmen aşağıdaki adımları ayrıntılı olarak açıkladım.


Özelleştirme eklentisi oluşturma

WP Tavern'in bu makalesinde belirtildiği gibi , "bunu başarmanın en kolay yolu, onunla birlikte çalışacak bir işlev eklentisi oluşturmaktır".

ElegantTheme'den bu makaleyi takiben ilk eklentimi oluşturmaya devam ettim .

İlgili sınıfı genişlet.

İşte o zaman işler karmaşıklaştı. Aşağıdakileri ekledim, ancak geçersiz kılma işlevim hala bazı nedenlerden dolayı tetiklenmiyor.

//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, bunu belirttiğin için teşekkürler! Yoast WordPress Seo, sınıflarında sadece kısmi değişiklikler yapmamıza izin veren bir dizi eylem ve filtreye sahiptir, sınıf genişletme yaklaşımı, belirli bağlamlardaki bazı şeylerden kurtulmama yardımcı olabilir.
— Adriano Monecchi

1

Debug_marker eylemi actions.php içinde kaldırabilirsiniz. Yoast eklentisi wp_head eyleminde yürütülür. Ben sadece bundan sonra, yani wp_enqueue_scripts doğrudan takip eylem kanca aldı ve orada debug_marker çıktı kaldıran bir fonksiyon bağladım. Bunun için eklenti nesnesini de geçmeniz gerekir. Ayrıca, öncelik numarası eklentinin içinden ayarlananla aynı olmalıdır.

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

Ancak bu işlem

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

çünkü bu, eklentinin önemli sarmalayıcı işlev kafasında yankılanır . Bunun üzerine yazmayı deneyebilirsiniz.


1

Ahmad'ın cevabına eklemek için, tüm html yorumlarını aynı miktarda kodla kaldırabilirsiniz, çünkü Yoast bunu yapan tek eklenti değildir.

   <?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
Genel yaklaşım için +1. Bir sadece başka bir eklenti yükledikten sonra geliyor başka bir keşfetmek keşfetmek için Yoast SEO yorum kaldırmak için biraz zaman alabilir.
— Adrien Be

Evet, eklentiler bunu yaparken nefret ediyorum. Yoast, revslider, w3 toplam önbellek ve diğer birçok önbellek / minyatür eklentisi ve bir ton diğerleri bunu yapıyor.
— Bryan Willis

1

Ön uçtan tüm Yoast WordPress SEO yorumlarını kaldıran bir pasajla karşılaştım. Ayrıca @ bryan-willis ve @ ahmad-m'nin cevaplarının kullandığı çıktı tamponlama yaklaşımını değiştirir.

Snippet'i temanızın functions.phpveya özel bir eklenti / tema php dosyasına yerleştirin.

Burada referans olarak bırakacağım - kredi snippet'in yazarına gidiyor

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

Bu ahmad-m @ değiştirilmiş versiyonu Yanıt filtreleri üstbilgi html birden fazla içerik değişiklikleri yapabilirsiniz uygulayarak,.

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.phpSabit kodlanmış önceliği 2kullanmayan, ancak Yoast'ın önceliğini dinamik olarak okuyan ve kullanan benzer bir çözüm bulundu 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

Wordpress-seo / frontend / class-frontend.php içindeki flush_cache işlevine bakın

Bu kod satırını bulun

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

Şununla değiştir

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

Bu harika eklentinin yaratıcısı sayesinde.


Yazar değilseniz, herhangi bir tema, eklenti veya çekirdekteki hiçbir dosyayı değiştirmeyin. Ayrıca, lütfen bu siteyi tanıtım amacıyla kullanmayın.
— Pieter Goosen

Üzgünüm, terfi etmem. Sadece başka bir çözüm sağlıyorum. Belki de en iyisi değil.
— Wakanina

bağış yapmanın promosyon olduğunu düşünün , bu finansialy'den doğrudan veya dolaylı olarak faydalanırsınız
— Pieter Goosen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.