Personalizzare l'output dei breadcrumb di Yoast SEO

26 feb 2013, 14:33:47
Visualizzazioni: 17.2K
Voti: 1

Voglio personalizzare l'output dei breadcrumb di Yoast SEO, ho già questo codice che funziona bene:

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

Il prossimo passo è modificare questa riga:

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

Voglio aggiungere un elemento ARIA aria-labelledby="breadcrumblabel" a quell'output. Quindi ho impostato questa funzione:

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

Il problema che ho è che $wrapper, $id, $class e $output restituiscono tutti null. Penso di capire perché sono null, ma essendo un principiante in PHP non riesco a spiegarlo.

Se qualcuno potesse indicarmi la direzione giusta per risolvere questo problema, lo apprezzerei molto.

Grazie.

0
Tutte le risposte alla domanda 2
2

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

Ho utilizzato la prima funzione usando str_replace

add_filter( 'wpseo_breadcrumb_output', 'custom_wpseo_breadcrumb_output' );
function custom_wpseo_breadcrumb_output( $output ){
    if( is_page() ){
        $from = '<a href="">...</a>';   // MODIFICA questo in base alle tue esigenze  
        $to     = '';
        $output = str_replace( $from, $to, $output );
    }
    return $output;
}
9 feb 2015 20:24:12
Commenti

Grazie, funziona bene e mi ha fatto risparmiare molto tempo.

Michael Rogers Michael Rogers
23 mar 2019 15:39:15

C'è un problema con questo. Sì, cambia l'output ma non lo schema JSON, quindi fondamentalmente agli occhi di Google il breadcrumb non è cambiato.

Michael Rogers Michael Rogers
18 giu 2019 16:25:36
5

Sono tutti nulli. Non hai impostato nessuna di quelle variabili. Ecco la tua funzione.

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

Tutte le variabili in quella funzione sono isolate alla funzione stessa. Le variabili impostate al di fuori di quella funzione non funzionano. Dato che non hai impostato alcuna variabile (nella funzione), e non vengono passate alla funzione, sono empty. È una questione di scope. Ci sono modi per aggirare questo, come la globalizzazione, ma non è cruciale per questa domanda quindi ti lascio alle tue capacità.

Ma veniamo al tuo problema... Guarda il filtro dove viene applicato nel plugin.

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

Penso che questo possa essere il punto in cui stai sbagliando. Questo--'<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>'-- è tutto un singolo parametro. Quel . è l'operatore di concatenazione di stringhe, il che significa che tutto viene unito in una stringa. Quando viene passato al filtro, non ci sono più variabili. Vengono passate al filtro come una semplice stringa.

La tua funzione potrebbe catturare e manipolare quella stringa se aggiungi un parametro come:

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

Sono confuso riguardo a questa parte: return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );

Se stai cercando di passare l'output del breadcrumb a un altro filtro (di tua creazione, presumo), vorresti:

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

Ma perché? Tutto ciò che potresti fare con quello potresti farlo con il filtro wpseo_breadcrumb_output.

Penso che tu voglia semplicemente:

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

Dovrei anche notare che usare regex su markup è piuttosto rischioso. È facile sbagliare. Usa con cautela.

26 feb 2013 17:06:26
Commenti

Innanzitutto, grazie per una risposta così dettagliata. Mi incuriosisce il fatto che tu dica che le variabili sono vuote a causa di una questione di ambito. Ma poi usi $output nei tuoi ultimi 2 esempi su come risolvere questo? Ho provato a fare var_dump($output) dentro la funzione ma non viene restituito nulla.

showFocus showFocus
27 feb 2013 00:17:29

Guarda la modifica che ho fatto alla definizione della tua funzione: ss_breadcrumb_output($output). Devi passare la variabile all'interno per poterla usare (Con i filtri e le azioni il passaggio della variabile avviene dietro le quinte). Penso che sia qui che stai sbagliando.

s_ha_dum s_ha_dum
27 feb 2013 00:23:24

Ok, credo di aver capito. Una cosa che non comprendo è il tuo uso di $output. Nel file della classe originale, $output sembra essere dentro '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' Non capisco perché stiamo alterando $output? Ho già modificato ciò che voglio nella variabile $output in altre funzioni. Vado a fare qualche ricerca in più, come puoi vedere tutto questo è nuovo per me! Grazie ancora.

showFocus showFocus
27 feb 2013 00:31:56

Ricorda lo scope. Stai modificando ciò che entra nella funzione. Le variabili, anche quelle con lo stesso nome, che sono al di fuori della funzione sono fuori dallo scope e non esistono all'interno della funzione. Ma puoi usare qualsiasi nome di variabile desideri, se ti fa sentire più a tuo agio.

s_ha_dum s_ha_dum
27 feb 2013 00:36:51

Ora ho capito! Ti darei un voto positivo se potessi, ma sembra che non abbia ancora quel privilegio. Quindi mi limito a dirti grazie. @s_ha_dum

showFocus showFocus
27 feb 2013 00:42:09