Personalizarea output-ului pentru breadcrumbs în Yoast SEO

26 feb. 2013, 14:33:47
Vizualizări: 17.2K
Voturi: 1

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.

0
Toate răspunsurile la întrebare 2
2

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;
}
9 feb. 2015 20:24:12
Comentarii

Mulțumesc, funcționează bine și mi-a economisit mult timp.

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

Există o problemă cu asta. Da, schimbă afișajul, dar nu și schema JSON, așa că, din perspectiva Google, breadcrumb-ul nu s-a schimbat.

Michael Rogers Michael Rogers
18 iun. 2019 16:25:36
5

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.

26 feb. 2013 17:06:26
Comentarii

Î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.

showFocus showFocus
27 feb. 2013 00:17:29

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.

s_ha_dum s_ha_dum
27 feb. 2013 00:23:24

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.

showFocus showFocus
27 feb. 2013 00:31:56

Ț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.

s_ha_dum s_ha_dum
27 feb. 2013 00:36:51

Am înțeles! Ți-aș da un vot în sus dacă aș putea, dar se pare că încă nu am acest privilegiu. Așa că voi spune doar mulțumesc. @s_ha_dum

showFocus showFocus
27 feb. 2013 00:42:09