Le code ci-dessous sert à répertorier les types de publication personnalisés et leurs enfants dans la barre latérale. Le code fonctionne très bien mais ne met pas en évidence les sous-pages.
Dans 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;
}}
et en ajoutant ce code à la barre latérale:
<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>
Je ne connais pas bien PHP, et un ami m'a aidé à écrire ce code. Alors, que me manque-t-il pour mettre en évidence le sous-menu actuel de ce type de message personnalisé?
Le problème avec ce code est que la requête est en cours de modification et que current_page_item
est en train d'être perdu. C'est la partie qui cause des problèmes.
$post = get_post( $getid );
setup_postdata( $post );
Si vous commentez ces deux lignes, vous verrez que current_page_item
apparaît.
Ce code présente également des problèmes secondaires qui n’ont aucune incidence sur le problème principal.
<p></p>
ne devrait pas exister en tant qu'élément enfant de <ul>
. Seul <li>
est autorisé.<h3>...</h3>
ne devrait pas non plus exister en tant qu'élément enfant de <ul>
pour les mêmes raisons que # 1.if
définissant la classe CSS pour le lien "Biography" retournera true sur toute page unique , pas seulement la page parent.wp_list_pages()
génère une liste de paires de balises <li>...</li>
, de sorte qu'il n'est pas nécessaire de l'envelopper avec une autre paire de balises <li>...</li>
.Le code suivant corrige tous les problèmes.
<?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>
Il y a un correctif pour la même chose, voici le ticket: https://core.trac.wordpress.org/changeset/27755
Si vous en avez besoin de toute urgence, vous pouvez l'essayer.
Réponse originale de @goldenapples, voici le lien:
Navigation dynamique pour le type de publication personnalisé (pages)
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;
}