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


8

私はこの質問に似た何かをしようとしています:remove_actionまたはremove_filter with external classes?

削除しようとしています

<!-- 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 -inserted-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 );

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

回答:


5

これを実現する簡単な方法(ただし、クラスアプローチなし)は、 wp_head出力バッファリングを使用してアクションフックです。

あなたのテーマのでheader.phpwp_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;
}

フックメソッドを使用したので、header.phpを編集する必要はありません。ありがとう。
ブルック。

4

あなたの助けをありがとう、私は最終的にそれを解決しました。子テーマ用の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 );

これが最良の答えです
sMyles

クラスオブジェクトにアクセスできない場合は、my remove_class_actionを使用してアクション/フィルターを削除できますgist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
sMyles

3

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

Yoastはおそらくadd_action( "wp_head", "head" )彼のコードに何かのようなものを持っています。したがって、「ヘッド」機能を削除できますがdebug_marker、アクションとして明示的に追加されていません。

あなたは出来る

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

おかげで、ファイルを編集したくありません。クラスを拡張する方法に興味がありますが、これは私の知識ではありません。
ブルック。

スティーブ、私はあなたの投稿にぶつかる前にソリューション2を試していました。これを完了するのに問題がありましたが。進捗状況を回答としてこのページに投稿しました。wordpress.stackexchange.com/a/209800/84030私がこれをどのように解決できるか考えているなら、助けていただければ幸いです。
Adrien Be

2

によって言及さ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 '';
    }

}

1
これを指摘してくれてありがとう!Yoast WordPress Seoには、クラスを部分的に変更するだけのアクションとフィルターがたくさんあります。クラス拡張アプローチは、特定のコンテキストでいくつかのものを取り除くのに役立ちます。
Adriano Monecchi

1

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

アフマドの答えに追加するには、同じ量のコードですべてのhtmlコメントを削除するだけです。これは、Yoastがそれを行う唯一のプラグインではないためです。

   <?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。Yoast SEOのコメントを削除して、別のプラグインをインストールした後に別のプラグインが表示されることを発見するには、しばらく時間がかかる場合があります。
Adrien Be

ええ、私はプラグインがこれを行うのが嫌いです。Yoast、revslider、w3合計キャッシュ、その他のほとんどのキャッシュ/縮小プラグイン、そして他の多くのものがすべてこれを行います。
ブライアンウィリス

1

フロントエンドからすべての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);
}

0

これは@ 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

functions.phpハードコードされた優先度を使用せず2、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

wordpress-seo / frontend / class-frontend.phpのflush_cache関数を参照してください

このコード行を見つける

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

と置換する

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

この素晴らしいプラグインの作成者に感謝します。


著者でない場合は、テーマ、プラグイン、コアのファイルを変更しないでください。また、宣伝目的でこのサイトを使用しないでください。
Pieter Goosen

申し訳ありませんが、プロモーションは行いません。私は別のソリューションを提供します。おそらく最高ではありません。
ワカニーナ2015

寄付は昇進であることを考慮してください。この金融から直接または間接的に利益を得ることができます
Pieter Goosen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.