Jeramai
Actualmente estoy trabajando en un sitio web de wordpress, pero me encontré con un pequeño problema.
estoy usando wp_page_menu
para hacer una barra de navegación para llegar a mis otras páginas. Ahora me dirige a www.mysite.com/sport
pero necesito que me dirija a www.mysite.com/sport#header
o www.mysite.com/sport/#header
.
¿Alguien sabe cómo puedo hacer esto?
Intenté usar diferentes complementos o cambiar el slug o el enlace permanente, pero esto no me dio el resultado que quería.
¡Gracias por ayudar a los chicos!
cristian nguyen
Está bien. Aquí está tu código. Simplemente anulo el caminante predeterminado de wordpress. Concéntrese en el #encabezado de texto en este código.
Si te preocupa este código. Entonces puede ir al archivo: …wp-includes/post-template.php en la línea 1238. Es el mismo código pero agregué #header después de get_permalink().
Espero que ayude.
class WPSE_HasHeader_Custom_Walker extends Walker_Page {
function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) {
if ( $depth )
$indent = str_repeat("\t", $depth);
else
$indent="";
extract($args, EXTR_SKIP);
$css_class = array('page_item', 'page-item-'.$page->ID);
if( isset( $args['pages_with_children'][ $page->ID ] ) )
$css_class[] = 'page_item_has_children';
if ( !empty($current_page) ) {
$_current_page = get_post( $current_page );
if ( in_array( $page->ID, $_current_page->ancestors ) )
$css_class[] = 'current_page_ancestor';
if ( $page->ID == $current_page )
$css_class[] = 'current_page_item';
elseif ( $_current_page && $page->ID == $_current_page->post_parent )
$css_class[] = 'current_page_parent';
} elseif ( $page->ID == get_option('page_for_posts') ) {
$css_class[] = 'current_page_parent';
}
$css_class = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) );
if ( '' === $page->post_title )
$page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );
/** CHANGE LINK HERE **/
$output .= $indent . '<li class="' . $css_class . '"><a href="' . get_permalink($page->ID) . '#header">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';
if ( !empty($show_date) ) {
if ( 'modified' == $show_date )
$time = $page->post_modified;
else
$time = $page->post_date;
$output .= " " . mysql2date($date_format, $time);
}
}
}
wp_list_pages(array(
'sort_column' => 'menu_order',
'title_li' => '',
'echo' => 1,
'walker' => new WPSE_HasHeader_Custom_Walker()
));
Actualizado:
La segunda vía: Gracias Mero Desarrollo. Creo que esta es la misma idea con él, pero es mucho más simple en tu caso. Como esto:
$link = wp_list_pages(array(
'sort_column' => 'menu_order',
'title_li' => '',
'echo' => 0,
));
echo preg_replace('/<a(.*)href="https://stackoverflow.com/questions/29963139/([^"]*)"(.*)>/', '<a$1href="$2#header"$3>', $link);
-
¡Agradable! no sabía
wp_page_menu
podría usar un Walker, no está documentado. aún.– Mero Desarrollo
30 de abril de 2015 a las 11:08
La respuesta de Christian es excelente y me hizo pensar en formas alternativas de hacer esto, especialmente aquellas que te permiten usar tu wp_page_menu()
función como se solicitó originalmente. Así que aquí hay otro enfoque usando un filtro.
Agregue esta función antes de su wp_page_menu()
llamada, o en functions.php
function wp_list_pages_addhash($output) {
$dom = new DOMDocument;
$dom->loadHTML($output);
$links = $dom->getElementsByTagName('a');
foreach ($links as $link) {
$link->setAttribute('href', $link->getAttribute('href') . '#header');
}
$output = $dom->saveHTML();
return $output;
}
add_filter('wp_list_pages', 'wp_list_pages_addhash');
Luego use su llamada wp_page_menu como estaba originalmente en su tema:
wp_page_menu();
Explicación: Encuentra cada atributo href de cada enlace en la salida de wp_list_pages
y agrega ‘#header’ al final. wp_page_menu
a su vez utiliza wp_list_pages
para crear salida.
¿Lo necesita en todos los enlaces, o solo en un solo enlace?
– Stewartside
30 de abril de 2015 a las 8:53
@Stewartside En todos los enlaces, uno diferente sería el mejor, pero en todos los enlaces lo mismo también podría funcionar
– Jeramai
30 de abril de 2015 a las 8:55
¿Por qué no crear un menú personalizado en el Administrador? En lugar de usar una función para obtener las páginas, puede enlazarlas manualmente usando el tipo de elemento de menú “Enlace”… Suena más fácil que la alternativa.
– rnevio
30 de abril de 2015 a las 9:11
@rnevius Esperaba evitar eso… Bueno, si realmente no hay nada que pueda hacer al respecto, entonces creo que debería ir con un menú personalizado…
– Jeramai
30 de abril de 2015 a las 9:18