Personalizar la salida de las migas de pan de Yoast SEO
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.

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

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.

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.

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.

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.

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.
