web-dev-qa-db-fra.com

Modifier la sortie de la chapelure de SEO Yoast

Je veux personnaliser la sortie de chapelure de Yoast SEO, j'ai ceci jusqu'à présent qui fonctionne très bien:

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

La prochaine étape consiste à changer cette ligne:

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

Je veux ajouter un élément aria de aria-labelledby="breadcrumblabel" à cette sortie. J'ai donc configuré cette fonction:

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 . '>' );
}

Le problème que j'ai est $wrapper $id $class et $output tous renvoient null. Je pense que je sais pourquoi ils sont nuls bien qu'en tant que débutant PHP je ne puisse pas l'expliquer.

Si quelqu'un pouvait me diriger dans la bonne direction pour que je puisse résoudre ce problème, je l'apprécierais.

Merci.

1
showFocus

Ils sont tous nuls. Vous n'avez défini aucune de ces variables. Voici votre fonction.

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

Toutes les variables de cette fonction sont isolées de cette fonction. Les variables définies en dehors de cette fonction ne fonctionnent pas. Puisque vous n'avez défini aucune variable (dans la fonction), et qu'elles ne sont pas transmises à la fonction, elles sont empty . C'est une question de portée . Il y a des façons de contourner cela, comme la mondialisation , mais cela n’est pas critique pour cette question et je vous laisse donc à vous-même.

Mais à votre problème ... Regardez le filtre où il est appliqué dans le plugin .

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

Je pense que c'est peut-être là où vous vous trompez. Ce --'<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>'-- est tout un paramètre. Ce . est un opérateur de concaténation de chaîne, ce qui signifie que tout cela est fusionné dans une chaîne. Lorsque cela est passé au filtre, il n'y a plus de variables. Ils sont transmis au filtre sous la forme d'une simple chaîne.

Votre fonction pourrait attraper et manipuler cette chaîne si vous avez ajouté un paramètre comme:

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 . '>' );
}

Je suis confus à propos de cette partie: return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );

Si vous essayez de passer la sortie du fil d'Ariane à un autre filtre (de votre création, je suppose), vous voudriez:

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

Mais pourquoi? Tout ce que vous pourriez faire avec ce que vous pourriez faire avec le filtre wpseo_breadcrumb_output.

Je pense que tu veux juste:

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

Je ne devrais pas non plus que la regex sur le balisage soit assez risquée. Il est facile de se tromper. Utiliser avec précaution.

1
s_ha_dum

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

J'ai utilisé la première fonction en utilisant 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;
}