Eu quero adicionar classes personalizadas aos meus itens de menu. Para cada subpágina eu mostro seus irmãos como uma navegação:
global $post;
if ( is_page() && $post->post_parent ) {
$args = array(
'sort_column' => 'menu_order',
'title_li' => '',
'child_of'=> $post->post_parent
);
$childpages = wp_list_pages($args );
}
Isso me dá uma lista com links. Eu quero dar a cada elemento de âncora a mesma classe personalizada. Como faço isso?
Uma das maneiras é estender a classe Walker_Page
. Veja o comentário no código para saber para onde vão as alterações.
class My_Siblings_CSS_Walker_Page extends Walker_Page {
public function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) {
if ( $depth ) {
$indent = str_repeat( "\t", $depth );
} else {
$indent = '';
}
$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 ( $_current_page && 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_classes = 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 );
}
$args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before'];
$args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after'];
$output .= $indent . sprintf(
// '<li class="%s"><a href="%s">%s%s%s</a>', // before
'<li class="%s"><a href="%s" class="my-custom-css-class">%s%s%s</a>', // after
$css_classes,
get_permalink( $page->ID ),
$args['link_before'],
apply_filters( 'the_title', $page->post_title, $page->ID ),
$args['link_after']
);
if ( ! empty( $args['show_date'] ) ) {
if ( 'modified' == $args['show_date'] ) {
$time = $page->post_modified;
} else {
$time = $page->post_date;
}
$date_format = empty( $args['date_format'] ) ? '' : $args['date_format'];
$output .= " " . mysql2date( $date_format, $time );
}
}
}
Use este Walker personalizado em seu modelo:
$args = array(
'sort_column' => 'menu_order',
'title_li' => '',
'child_of' => $post->post_parent
'walker' => new My_Siblings_CSS_Walker_Page() // use Walker here
);
// $childpages = wp_list_pages($args);
wp_list_pages($args); // as you utilize default 'echo' parameter (true)
A maneira muito mais fácil é usar o jQuery.
Não há um filtro bom para adicionar as classes CSS aos elementos âncora (<a>
), mas, se você precisar deles para o estilo CSS, poderá usar o filtro para os elementos <li>
. Este filtro é chamado page_css_class
, que é, nativamente, usado somente em páginas de listagem através de wp_list_pages()
. Ele filtra as classes usadas para as tags li
-.
Para usar este filtro, basta conectá-lo:
function wpse222112_pagelist_item_css_classes( $classes ) {
$classes[] = 'wpse222112-class';
return $classes;
}
add_filter( 'page_css_class', 'wpse222112_pagelist_item_css_classes' );
Se você precisar apenas deste menu, remova-o após chamar wp_list_pages()
usando
remove_filter( 'page_css_class', 'wpse222112_pagelist_item_css_classes' );
Por uma questão de completude: há também um filtro para toda a saída da lista de páginas, que você precisaria usar se fosse necessário adicionar uma classe às tags de âncora (o que não é no seu caso). Este filtro é wp_list_pages
.