Personalizar la salida de las migas de pan de Yoast SEO

26 feb 2013, 14:33:47
Vistas: 17.2K
Votos: 1

Quiero personalizar la salida de las migas de pan de Yoast SEO, tengo esto hasta ahora que funciona 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;
}

El siguiente paso es cambiar esta línea:

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

Quiero añadir un elemento aria de aria-labelledby="breadcrumblabel" a esa salida. Así que configuré esta función:

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

El problema que tengo es que $wrapper $id $class y $output todos devuelven null. Creo que sé por qué son null aunque como principiante en PHP no puedo explicarlo.

Si alguien pudiera indicarme la dirección correcta para que pueda resolver esto, lo agradecería.

Gracias.

0
Todas las respuestas a la pregunta 2
2

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

Utilicé la primera función 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>';   // EDITAR esto según tus necesidades  
        $to     = '';
        $output = str_replace( $from, $to, $output );
    }
    return $output;
}
9 feb 2015 20:24:12
Comentarios

Gracias, funciona bien, me ahorró mucho tiempo.

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

Hay un problema con esto. Sí, cambia la salida pero no el esquema JSON, así que básicamente para los ojos de Google la miga de pan no cambió.

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

Todos son nulos. No has configurado ninguna de esas variables. Aquí está tu función.

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

Todas las variables en esa función están aisladas dentro de ella. Las variables establecidas fuera de esa función no funcionan. Como no has configurado ninguna variable (dentro de la función), y no se pasan a la función, están vacías. Es una cuestión de ámbito. Hay formas de solucionarlo, como la globalización, pero eso no es crítico para esta pregunta, así que te dejaré a tus propios recursos.

Pero sobre tu problema... Mira el filtro donde se aplica en el plugin.

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

Creo que aquí es donde puedes estar equivocándote. Esto--'<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>'-- es todo un parámetro. Ese . es el operador de concatenación de cadenas, lo que significa que todo eso se combina en una cadena. Cuando se pasa al filtro, ya no hay variables. Se pasan al filtro como una simple cadena.

Tu función podría capturar y manipular esa cadena si añadieras un parámetro como:

function ss_breadcrumb_output($output) {
    var_dump($output); // deberías ver la cadena mencionada arriba
    return apply_filters( 'ss_breadcrumb_output', '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $output . '</' . $wrapper . '>' );
}

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

Si estás intentando pasar la salida del breadcrumb a otro filtro (de tu creación, supongo), querrías:

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

Pero ¿por qué? Cualquier cosa que pudieras hacer con eso podrías hacerlo con el filtro wpseo_breadcrumb_output.

Creo que simplemente quieres:

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

También debería mencionar que usar expresiones regulares en marcado es bastante arriesgado. Es fácil equivocarse. Úsalo con precaución.

26 feb 2013 17:06:26
Comentarios

Primero, gracias por una respuesta tan detallada. Me llama la atención que digas que las variables están vacías por un tema de ámbito. Pero luego usas $output en tus últimos 2 ejemplos de cómo resolver esto? He intentado hacer var_dump($output) dentro de la función pero no retorna nada.

showFocus showFocus
27 feb 2013 00:17:29

Mira la modificación que hice a tu definición de función: ss_breadcrumb_output($output). Tienes que pasar la variable dentro para poder usarla (Con los filtros y acciones el paso de variables ocurre detrás de escena). Creo que ahí es donde te estás equivocando.

s_ha_dum s_ha_dum
27 feb 2013 00:23:24

Ok, creo que entiendo. Una cosa que no comprendo es tu uso de $output. En el archivo de clase original, $output parece estar dentro de '<' . $wrapper . $id . $class . ' xmlns:v="http://rdf.data-vocabulary.org/#">' No entiendo por qué estamos alterando $output? Ya he modificado lo que quiero en la variable $output en otras funciones. Voy a investigar un poco más, ¡como puedes ver esto es nuevo para mí! Gracias de nuevo.

showFocus showFocus
27 feb 2013 00:31:56

Recuerda el alcance. Estás modificando lo que entra en la función. Las variables, incluso las variables con el mismo nombre, que están fuera de la función están fuera del alcance y no existen dentro de la función. Pero puedes usar cualquier nombre de variable que quieras, si eso te hace sentir mejor.

s_ha_dum s_ha_dum
27 feb 2013 00:36:51

¡Entiendo ahora! Te daría un voto positivo si pudiera, pero parece que aún no tengo ese privilegio. Así que solo diré gracias. @s_ha_dum

showFocus showFocus
27 feb 2013 00:42:09