Personalizzare l'output dei breadcrumb di Yoast SEO
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.

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

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.

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.

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.

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.

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.
