Resalta el elemento actual de las subpáginas de tipos de publicaciones personalizadas, enumeradas por wp_list_pages

4

El siguiente código es para enumerar los tipos de publicación personalizados y sus hijos en la barra lateral. El código funciona muy bien pero no resalta las subpáginas.

En functions.php :

if(!function_exists('get_post_top_ancestor_id')){
/**
* Gets the id of the topmost ancestor of the current page. Returns the current
* page's id if there is no parent.
* 
* @uses object $post
* @return int 
*/
function get_post_top_ancestor_id(){
global $post;

if($post->post_parent){
    $ancestors = array_reverse(get_post_ancestors($post->ID));
    return $ancestors[0];
}

return $post->ID;
}}

y agregando este código a la barra lateral:

<ul>
<?php
$getid=get_post_top_ancestor_id(); 
#echo $getid;
global $post;
$post=get_post($getid);
setup_postdata($post);
?>
<?php
if (is_single($post->ID)) {$pg_li .="current_page_item";}
else {
$pg_li .="page_item";}
?>
<h3><?php the_title();?></h3>
<p></p>
<li class="<?php echo $pg_li; ?>">
<a href="<?php the_permalink(); ?>">BIOGRAPHY</a>
</li>
<li class="<?php echo $pg_li; ?>">
<?php
$args=array(
'post_type'=>'artists',
'child_of'=>$getid ,
'sort_column'=>'menu_order',
'hierarchical' => 1,
'title_li'=>__('')
);
wp_list_pages( $args );
wp_reset_query();
?></li>
</ul>

No estoy familiarizado con PHP, y un amigo me ayudó a escribir este código. Entonces, ¿qué me falta para resaltar el submenú actual de ese tipo de publicación personalizada?

    
pregunta sez 27.11.2012 - 01:05

2 respuestas

1

El problema con este código es que la consulta se está modificando y se está perdiendo current_page_item . Esta es la parte que causa problemas.

$post = get_post( $getid );
setup_postdata( $post );

Si comentas esas dos líneas, verás que aparece current_page_item .

También hay algunos problemas secundarios con este código que no tienen relación con el problema principal.

  1. <p></p> no debería existir como un elemento secundario de <ul> . Solo se permite <li> .
  2. <h3>...</h3> tampoco debería existir como elemento secundario de <ul> por las mismas razones que # 1.
  3. La declaración if que establece la clase CSS para el enlace "Biografía" devolverá verdadero en cualquier página única, no solo en la página principal.
  4. wp_list_pages() genera una lista de pares de etiquetas <li>...</li> , por lo que no es necesario que se incluya con otro par de etiquetas <li>...</li> .

El siguiente código corrige todos los problemas.

<?php
$getid = get_post_top_ancestor_id(); 
global $post;
?>
<h3><?php echo get_the_title( $getid );?></h3>
<ul>
    <?php
    if ( $post->ID == $getid ) {
        $pg_li .= "current_page_item";
    } else {
        $pg_li .= "page_item";
    }
    ?>  
    <li class="<?php echo $pg_li; ?>">
        <a href="<?php echo get_permalink( $getid ); ?>">BIOGRAPHY</a>
    </li>
    <?php
    $args=array(
        'post_type' => 'artists',
        'child_of' => $getid,
        'sort_column' => 'menu_order',
        'hierarchical' => 1,
        'title_li' => __('')
    );
    wp_list_pages( $args );
    ?>
</ul>
    
respondido por el epilektric 27.08.2013 - 22:09
1

Hay una solución para el mismo, aquí está el ticket: enlace

En caso de que lo necesite con urgencia, puede intentarlo

Respuesta original de @goldenapples, aquí está el enlace:

Navegación dinámica para el tipo de publicación personalizada (páginas)

function wp_list_post_types( $args ) {
$defaults = array(
    'numberposts'  => -1,
    'offset'       => 0,
    'orderby'      => 'menu_order, post_title',
    'order'      => 'ASC',
    'post_type'    => 'page',
    'depth'        => 0,
    'show_date'    => '',
    'date_format'  => get_option('date_format'),
    'child_of'     => 0,
    'exclude'      => '',
        'include'      => '',
    'title_li'     => __('Pages'),
    'echo'         => 1,
    'link_before'  => '',
    'link_after'   => '',
    'exclude_tree' => '' );

$r = wp_parse_args( $args, $defaults );
extract( $r, EXTR_SKIP );

$output = '';
$current_page = 0;

// sanitize, mostly to keep spaces out
$r['exclude'] = preg_replace('/[^0-9,]/', '', $r['exclude']);

// Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array)
$exclude_array = ( $r['exclude'] ) ? explode(',', $r['exclude']) : array();
$r['exclude'] = implode( ',', apply_filters('wp_list_post_types_excludes', $exclude_array) );

// Query pages.
$r['hierarchical'] = 0;
$pages = get_posts($r);

if ( !empty($pages) ) {
    if ( $r['title_li'] )
        $output .= '<li class="pagenav">' . $r['title_li'] . '<ul>';

    global $wp_query;
    if ( ($r['post_type'] == get_query_var('post_type')) || is_attachment() )
        $current_page = $wp_query->get_queried_object_id();
    $output .= walk_page_tree($pages, $r['depth'], $current_page, $r);

    if ( $r['title_li'] )
        $output .= '</ul></li>';
}

$output = apply_filters('wp_list_pages', $output, $r);

if ( $r['echo'] )
    echo $output;
else
    return $output;
 }
    
respondido por el sven 01.04.2014 - 10:22

Lea otras preguntas en las etiquetas