Personalizarea output-ului pentru breadcrumbs în Yoast SEO
Vreau să personalizez output-ul pentru breadcrumbs în Yoast SEO, am următorul cod care funcționează perfect:
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;
}
Următorul pas este să modific această linie:
return apply_filters( 'wpseo_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
Vreau să adaug un element ARIA aria-labelledby="breadcrumblabel"
la acest output. Am creat această funcție:
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 . '>' );
}
Problema pe care o am este că $wrapper
, $id
, $class
și $output
toate returnează null. Cred că înțeleg de ce sunt null, dar ca începător în PHP nu pot să explic exact.
Dacă cineva mă poate îndruma în direcția corectă ca să pot rezolva această problemă, aș aprecia.
Mulțumesc.

http://wpquestions.com/question/showChrono/id/8603
Am folosit prima funcție utilizând str_replace
add_filter( 'wpseo_breadcrumb_output', 'custom_wpseo_breadcrumb_output' );
function custom_wpseo_breadcrumb_output( $output ){
if( is_page() ){
$from = '<a href="">...</a>'; // Modifică asta în funcție de nevoile tale
$to = '';
$output = str_replace( $from, $to, $output );
}
return $output;
}

Toate sunt nule. Nu ai setat niciuna dintre acele variabile. Iată funcția ta.
function ss_breadcrumb_output() {
return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
}
Toate variabilele din acea funcție sunt izolate în interiorul funcției. Variabilele setate în afara funcției nu funcționează. Deoarece nu ai setat nicio variabilă (în funcție) și ele nu sunt transmise funcției, acestea sunt goale
. Este o problemă de domeniu de aplicare. Există modalități de a rezolva asta, cum ar fi globalizarea, dar acest lucru nu este critic pentru această întrebare, așa că te las pe mâinile tale.
Dar revenind la problema ta... Uită-te la filtrul unde este aplicat în plugin.
return apply_filters( 'wpseo_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
Cred că aici poate greșești. Acest lucru—'<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>'
—este un singur parametru. Acel .
este operatorul de concatenare a șirurilor, ceea ce înseamnă că totul este combinat într-un singur șir. Când acesta este transmis filtrului, nu mai există variabile. Ele sunt transmise filtrului ca un simplu șir.
Funcția ta ar putea prelua și manipula acel șir dacă ai adăuga un parametru precum:
function ss_breadcrumb_output($output) {
var_dump($output); // ar trebui să vezi șirul menționat mai sus
return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
}
Sunt confuz în legătură cu această parte: return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
Dacă încerci să transmiți rezultatul breadcrumb-ului la un alt filtru (al tău, presupun), ai vrea:
function ss_breadcrumb_output($output) {
return apply_filters( 'ss_breadcrumb_output', $output );
}
Dar de ce? Orice ai putea face cu asta, ai putea face cu filtrul wpseo_breadcrumb_output
.
Cred că vrei doar:
function ss_breadcrumb_output($output) {
$output = preg_replace('/([^>]+)>(.*)/','$1 aria-labelledby="breadcrumblabel" >$2',$output);
return $output;
}
Ar trebui să menționez și că folosirea expresiilor regulate pe markup este destul de riscantă. Este ușor să greșești. Folosește cu precauție.

În primul rând, mulțumesc pentru un răspuns atât de detaliat. Sunt interesat că spui că variabilele sunt goale din cauza unui aspect de scop. Dar apoi folosești $output în ultimele tale 2 exemple despre cum să rezolvi asta? Am încercat să folosesc var_dump($output)
în interiorul funcției, dar nu este returnat nimic.

Uită-te la modificarea pe care am făcut-o la definiția funcției tale: ss_breadcrumb_output($output)
. Trebuie să transmiți variabila înăuntru pentru a o putea folosi (Cu filtre și acțiuni, transmiterea variabilei se face în fundal). Cred că acolo greșești.

Ok, cred că înțeleg. Un lucru pe care nu îl înțeleg este folosirea ta a lui $output. În fișierul clasei originale, $output
pare să fie în interiorul '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">'
Nu înțeleg de ce modificăm $output? Am schimbat deja ce vreau în variabila $output
în alte funcții. O să mă duc să fac niște cercetări suplimentare, după cum poți vedea, toate acestea sunt noi pentru mine! Mulțumesc din nou.

Ține minte despre domeniul de aplicare. Modifici ceea ce intră în funcție. Variabilele, chiar și cele cu același nume, care sunt în afara funcției sunt în afara domeniului de aplicare și nu există în interiorul funcției. Dar poți folosi orice nume de variabilă dorești, dacă te face să te simți mai bine.
