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.