Hapus tindakan dari Kelas eksternal

8

Saya mencoba melakukan sesuatu yang mirip dengan pertanyaan ini di sini: remove_action atau remove_filter dengan kelas eksternal?

Saya mencoba menghapus

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

pesan dari plugin.

Dan sebelum Anda meneriaki saya tentang bagaimana ini mungkin tidak etis, penulis mengatakan tidak apa-apa untuk dilakukan di sini: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove-dangerous -inserted-yoast-message-in-page-header? balasan = 29 # post-2503475

Saya telah menemukan kelas yang menambahkan komentar di sini: http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

Pada dasarnya WPSEO_Frontendkelas memiliki fungsi bernama debug_markeryang kemudian dipanggil oleh fungsi bernama headyang kemudian ditambahkan ke wp_headdalam__Construct

Saya baru di kelas tetapi saya menemukan cara untuk benar-benar menghapus kepala dengan melakukan

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

tapi saya hanya ingin menghapus debug_markerbagian dari itu. Saya mencoba ini tetapi itu tidak berhasil remove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

Seperti yang saya katakan saya baru di kelas sehingga bantuan apa pun akan bagus.

Brooke.
sumber

Jawaban:

5

Cara sederhana untuk mencapai ini (tetapi tanpa pendekatan Kelas) adalah dengan memfilter output dari wp_headhook tindakan menggunakan buffering output .

Dalam tema Anda header.php, bungkus wp_head()panggilan dengan ob_start($cb)dan ob_end_flush();fungsinya seperti:

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

Sekarang dalam functions.phpfile tema , nyatakan fungsi panggilan balik output Anda ( ad_filter_wp_head_outputdalam hal ini):

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

Jika Anda ingin melakukan semua itu melalui file yang functions.phptidak diedit header.php, Anda dapat menghubungkan ke get_headerdan wp_headkait tindakan untuk menentukan sesi buffering 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;
}
Ahmad M
sumber
Saya menggunakan metode hook jadi saya tidak perlu mengedit header.php. Terima kasih.
Brooke.
4

Terima kasih atas semua bantuan Anda, saya akhirnya menyelesaikannya. Saya membuat functions.php untuk tema anak saya, lalu menambahkan

// 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 );
Mike Lecomte
sumber
Ini adalah jawaban terbaik
sMyles
Jika Anda tidak dapat mengakses objek kelas, Anda dapat menggunakan saya remove_class_actionuntuk menghapus action / filter gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles
3

Saya tidak berpikir Anda akan dapat melakukannya dengan menggunakan remove_action. Argumen fungsi di remove_actiontidak akan membantu Anda karena debug_marker()fungsi itu bukan fungsi yang digunakan dalam add_action()panggilan.

Yoast mungkin memiliki sesuatu seperti add_action( "wp_head", "head" )dalam kodenya. Jadi Anda dapat menghapus fungsi "head", tetapi debug_markertidak secara eksplisit ditambahkan sebagai tindakan.

Anda bisa

  1. Edit file sumber Yoast dan hapus baris komentar debug.
  2. Perpanjang WPSEO_Frontendkelas dan kelebihan debug_markerfungsi untuk mengembalikan "". TBH, saya tidak yakin bagaimana ini akan bekerja dalam hal WP memuat plugin, tetapi bisa jadi layak diselidiki.
Steve Claridge
sumber
Terima kasih, saya benar-benar tidak ingin mengedit file. Saya akan tertarik untuk belajar bagaimana memperluas kelas tetapi ini sedikit dari pengetahuan saya.
Brooke.
Steve, saya sudah mencoba solusi 2 sebelum menabrak posting Anda. Meskipun saya mengalami masalah dalam menyelesaikan ini. Saya memposting kemajuan saya sebagai jawaban di halaman ini. wordpress.stackexchange.com/a/209800/84030 Bantuan Anda akan dihargai jika Anda memiliki ide bagaimana saya bisa menyelesaikan ini.
Adrien Be
2

Menemukan utas ini setelah mengerjakan solusi yang sama dengan yang disebutkan olehSteve Claridge , yaitu:

Perpanjang WPSEO_Frontendkelas dan kelebihan debug_markerfungsi untuk mengembalikan ""

Saya merinci langkah-langkah di bawah ini, meskipun saya terjebak pada langkah terakhir.


Buat plugin penyesuaian

Seperti yang disebutkan dalam artikel ini dari WP Tavern , "cara termudah untuk mencapai ini adalah dengan membuat plugin fungsionalitas yang akan berjalan di sampingnya".

Jadi saya melanjutkan untuk membuat plugin pertama saya mengikuti artikel ini dari ElegantTheme .

Perpanjang kelas yang relevan.

Saat itulah segalanya menjadi rumit. Saya menambahkan berikut ini tetapi fungsi utama saya masih tidak dipicu karena beberapa alasan.

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

}
Adrien Be
sumber
1
Oh, terima kasih sudah menunjukkan ini! Yoast WordPress Seo memiliki banyak tindakan dan filter yang memungkinkan kita melakukan hanya sebagian perubahan pada kelasnya, pendekatan perluasan kelas mungkin banyak membantu saya menyingkirkan beberapa hal pada konteks tertentu.
Adriano Monecchi
1

Saya menemukan bahwa Anda dapat menghapus tindakan debug_marker di functions.php. Plugin Yoast dieksekusi dalam aksi wp_head. Saya hanya mengambil kait tindakan yang mengikuti langsung setelah itu, yaitu wp_enqueue_scripts dan di sana saya mengaitkan fungsi yang menghapus output debug_marker. Untuk ini, Anda juga harus melewati objek plugin. Juga nomor prioritas harus sama dengan yang ditetapkan dari dalam plugin.

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

Namun ini tidak menghapus

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

sebagian, karena itu bergema di kepala fungsi pembungkus penting plugin . Anda bisa mencoba menimpanya.

Ogier Schelvis
sumber
1

Untuk menambahkan jawaban Ahmad, Anda bisa menghapus semua komentar html dengan jumlah kode yang sama, karena Yoast bukan satu-satunya plugin yang melakukan itu.

   <?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);
Bryan Willis
sumber
1
+1 untuk pendekatan umum. Orang mungkin perlu waktu untuk menghapus komentar SEO Yoast untuk hanya menemukan ada satu lagi muncul setelah menginstal plugin lain.
Adrien Be
Ya saya benci ketika plugin melakukan ini. Yoast, revslider, w3 total cache dan kebanyakan cache / minification plugins lainnya, dan satu ton lainnya semua melakukan ini.
Bryan Willis
1

Saya telah menemukan potongan yang menghapus semua komentar Yoast WordPress SEO dari ujung depan. Ini juga memodifikasi pendekatan buffering output yang menggunakan jawaban @ bryan-willis dan @ ahmad-m.

Cukup letakkan cuplikan di tema Anda functions.phpatau file plugin / tema khusus PHP.

Saya akan meninggalkannya di sini sebagai referensi - kredit diberikan kepada pembuat cuplikan

/**
 * 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);
}
Adriano Monecchi
sumber
0

Ini adalah versi modifikasi dari @ ahmad-m Answer , dengan menerapkan filter Anda dapat membuat beberapa perubahan konten ke html header.

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));
}
TarranJones
sumber
0

Menemukan solusi serupa functions.phpyang tidak menggunakan prioritas hardcoded 2tetapi secara dinamis membaca dan menggunakan prioritas dari 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 );
    }
}
Ov3rfly
sumber
-3

Lihat fungsi flush_cache di wordpress-seo / frontend / class-frontend.php

Temukan baris kode ini

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

Ubah dengan

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

Terima kasih kepada pembuat plugin yang luar biasa ini.

Wakanina
sumber
Jangan pernah mengubah file apa pun dalam tema, plugin, atau inti apa pun jika Anda bukan pembuatnya. Selain itu, jangan gunakan situs ini karena alasan promosi.
Pieter Goosen
Maaf, saya tidak melakukan promosi. Saya hanya memberikan solusi lain. Mungkin bukan yang terbaik.
Wakanina
pertimbangkan untuk membuat donasi sebagai promosi, Anda dapat memperoleh manfaat baik secara langsung maupun tidak langsung dari keuangan ini
Pieter Goosen