web-dev-qa-db-ja.com

Yoast SEOブレッドクラム出力を編集する

Yoast SEOブレッドクラムの出力をカスタマイズしたいのですが、これまでのところこれでうまくいきます。

add_filter( 'wpseo_breadcrumb_single_link', 'ss_breadcrumb_single_link', 10, 2 );
function ss_breadcrumb_single_link( $link_output, $link ) {
    $element = 'li';
    $element = esc_attr( apply_filters( 'wpseo_breadcrumb_single_link_wrapper', $element ) );
    $link_output = '<' . $element . ' typeof="v:Breadcrumb">';
    if ( isset( $link['url'] ) && ( $i < ( count( $links ) - 1 ) || $paged ) ) {
        $link_output .= '<a href="' . esc_url( $link['url'] ) . '" rel="v:url" property="v:title">' . esc_html( $link['text'] ) . '</a>';
    } else {
        if ( isset( $opt['breadcrumbs-boldlast'] ) && $opt['breadcrumbs-boldlast'] ) {
            $link_output .= '<strong class="breadcrumb_last" property="v:title">' . esc_html( $link['text'] ) . '</strong>';
        } else {
            $link_output .= '<li class="breadcrumb_last" property="v:title">' . esc_html( $link['text'] ) . '</li>';
        }
    }
    $link_output .= '</' . $element . '>';
    return $link_output;
}

add_filter( 'wpseo_breadcrumb_output_wrapper', 'ss_breadcrumb_output_wrapper', 10, 1 );
function ss_breadcrumb_output_wrapper( $wrapper ) {
    $wrapper = 'ol';
    return $wrapper;
}

次のステップはこの行を変更することです:

return apply_filters( 'wpseo_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );

その出力にaria-labelledby="breadcrumblabel"のaria要素を追加したいです。だから私はこの機能を設定します。

add_filter( 'wpseo_breadcrumb_output', 'ss_breadcrumb_output' );
function ss_breadcrumb_output() {
    return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
}

私が抱えている問題は$wrapper $id $class$outputがすべてnullを返すことです。 PHP初心者としては説明できませんが、なぜそれらがnullであるのかはわかっていると思います。

誰かが私がこれを理解することができるように正しい方向に私を指すことができれば私はそれをいただければ幸いです。

ありがとう。

1
showFocus

それらはすべてnullです。これらの変数を設定していません。これがあなたの機能です。

function ss_breadcrumb_output() {
    return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
}

その関数内のすべての変数はその関数に分離されています。その関数外に設定された変数は機能しません。変数を(関数内で)設定しておらず、それらが関数に渡されていないので、それらは empty です。 それは範囲の問題ですグローバリゼーションのように それを回避する方法があります、しかしそれはこの質問にとって重要ではないので私はあなた自身の装置に任せます.

しかし、あなたの問題に...フィルタ それがプラグインで適用されているところを見てください

return apply_filters( 'wpseo_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );

これはあなたが間違っているところかもしれないと思う。この--'<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>'--はすべて1つのパラメータです。その.は文字列連結演算子です。つまり、それらすべてが文字列にマージされます。それがフィルタに渡されると、変数はもうありません。それらは単純な文字列としてフィルタに渡されます。

次のようなパラメータを追加した場合、関数はその文字列を捕捉して操作することができます。

function ss_breadcrumb_output($output) {
    var_dump($output); // you should see the string referred to above
    return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
}

私はこの部分について混乱しています:return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );

あなたがブレッドクラム出力を(あなたの作成物の)別のフィルタに渡すことを試みているなら、私はあなたが欲しいと思うでしょう:

function ss_breadcrumb_output($output) {
    return apply_filters( 'ss_breadcrumb_output', $output );
}

しかし、なぜ? wpseo_breadcrumb_outputフィルターを使ってできることなら何でもできます。

私はあなたが欲しいと思います:

function ss_breadcrumb_output($output) {
    $output = preg_replace('/([^>]+)>(.*)/','$1 aria-labelledby="breadcrumblabel" >$2',$output);
    return $output;
}

また、マークアップに関する正規表現が非常に危険であるとも思わないでください。誤解するのは簡単です。慎重に使用してください。

1
s_ha_dum

http://wpquestions.com/question/showChrono/id/8603

Str_replaceを使って最初の関数を使いました

add_filter( 'wpseo_breadcrumb_output', 'custom_wpseo_breadcrumb_output' );
function custom_wpseo_breadcrumb_output( $output ){
    if( is_page() ){
        $from = '<a href="">...</a>';   // EDIT this to your needs  
        $to     = '';
        $output = str_replace( $from, $to, $output );
    }
    return $output;
}