web-dev-qa-db-ja.com

外部クラスからアクションを削除する

私はここでこの質問と同じようなことをやろうとしています: 外部クラスでremove_actionまたはremove_filter?

削除しようとしています

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

プラグインからのメッセージ.

そして、あなたがこれがどのように非倫理的であるかもしれないかについて私に叫ぶ前に、著者はここでしても大丈夫だと言います: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-how-to-remove -dangerous-insert-yoast-message-in-page-headers?replies = 29#post-2503475

ここにコメントを追加するクラスが見つかりました。 http://plugins.svn.wordpress.org/wordpress-seo/tags/1.2.8.7/frontend/class-frontend.php

基本的にWPSEO_Frontendクラスはdebug_markerという名前の関数を持ち、それがheadという名前の関数によって呼び出され、それがwp_head__Constructに追加されます。

私はクラスに不慣れですが、私はすることによって頭を完全に取り除く方法を見つけました

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

しかし、私はそこからdebug_marker部分を削除したいだけです。私はこれを試しましたが、うまくいきませんremove_action( 'wp_head', array($wpseo_front,'head','debug_marker'), 1, 1 );

私が言ったように私はクラスが初めてなので、どんな助けでも素晴らしいでしょう。

9
Brooke.

これを達成するための簡単な方法は(/ Classのアプローチなしで) output buffering を使ってwp_headアクションフックの出力をフィルタリングすることです。

テーマのheader.phpで、wp_head()呼び出しをob_start($cb)関数とob_end_flush();関数でラップします。

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

テーマfunctions.phpファイルで、出力コールバック関数を宣言します(この場合はad_filter_wp_head_output)。

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

functions.phpファイルを編集せずにheader.phpを介してすべてを行いたい場合は、get_headerおよびwp_headアクションフックにフックして、出力バッファリングセッションを定義できます。

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;
}
6
Ahmad M

ご協力ありがとうございます、ついに解決しました。私は自分の子供のテーマ用にfunctions.phpを作成し、それから追加します

// 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 );
4
Mike Lecomte

remove_actionを使ってそれができるようになるとは思わない。 debug_marker()関数はadd_action()呼び出しで使用された関数ではなかったので、remove_actionの関数引数は役に立ちません。

Yoastはおそらく彼のコードにadd_action( "wp_head", "head" )のようなものがあるのでしょう。そのため、 "head"関数を削除できますが、debug_markerはアクションとして明示的に追加されていません。

あなたは出来る

  1. Yoastのソースファイルを編集して、デバッグコメント行を削除します。
  2. WPSEO_Frontendクラスを拡張し、 ""を返すようにdebug_marker関数をオーバーロードします。 TBHさん、WPプラグインのロードという点でこれがどのように機能するのかわかりませんが、調べる価値があります。
3
Steve Claridge

Steve Claridge と同じ解決策で作業した後にこのスレッドを見つける、つまり:

WPSEO_Frontendクラスを拡張し、 ""を返すためにdebug_marker関数をオーバーロードします。

最後のステップで行き詰まってしまいましたが、以下のステップの詳細を説明しました。


カスタマイズプラグインを作成する

WP Tavernからのこの記事 で述べたように、「これを達成するための最も簡単な方法は、それと並行して動作する機能プラグインを作成することです」。

それで私は ElegantThemeからのこの記事の後に私の最初のプラグインを作成する に続きました。

関連クラスを拡張する.

それは事が複雑になったときです。私は以下を加えました、しかし、私の最優先の機能はまだ何らかの理由で引き起こされません。

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

}
2
Adrien Be

Functions.phpのdebug_markerアクションを削除できることがわかりました。 Yoastプラグインはwp_headアクションで実行されます。その直後に続くアクションフック、すなわちwp_enqueue_scriptsを取ったところで、debug_markerの出力を削除する関数をフックしました。そのためには、プラグインオブジェクトも渡す必要があります。プライオリティ番号もプラグイン内から設定したものと同じでなければなりません。

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

しかしこれは削除しません

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

これはプラグインの重要なラッパー関数 head に反映されているからです。それを上書きしてみることができます。

1
Ogier Schelvis

Ahmadの答えに追加するには、Yoastがそれをする唯一のプラグインではないので、あなたはちょうど同じコードの量ですべてのhtmlコメントを削除することができました。

   <?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
Bryan Willis

フロントエンドからすべてのYoast WordPress SEOコメントを削除する抜粋を見つけました。また、@ bryan-willisと@ ahmad-mの回答が使用する出力バッファリングのアプローチも変更されています。

スニペットをあなたのテーマのfunctions.phpまたはカスタムプラグイン/テーマphpファイルに置くだけです。

参照用にここに置いておきます - クレジットはスニペットの作者のものです

/**
 * 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);
}
1

これは、@ ahmad-m Answer の修正版です。フィルタを適用することで、ヘッダー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
TarranJones