web-dev-qa-db-fra.com

wp_list_pages (); Changer la sortie du lien hypertexte

Je crée un menu pour un site de documentation très semblable à ceci: http://getbootstrap.com/components/

J'utilise un type de message personnalisé hiérarchique (manuel). J'utilise actuellement wp_list_pages () pour afficher la liste. Cela me donne la structure imbriquée que je cherche:

<ul>
  <li>Parent Post</li>
    <ul>
      <li>Child Post</li>
      <li>Child Post</li>
    </ul>
  <li>Parent Post</li>
    <ul>
      <li>Child Post</li>
      <li>Child Post</li>
    </ul>
</ul>
<!-- and so on -->

Malheureusement, wp_list_pages () affiche le lien permanent vers le message comme ceci:

<li class="page_item page-item-332"><a href="http://myurl.com/manual/introduction-to-the-manual/organization/">1.1 &#8211; Manual Organization</a></li>

et j'en ai besoin pour afficher le post_id comme ceci:

<li class="page_item page-item-332"><a href="#332">1.1 &#8211; Manual Organization</a></li>

De plus, voici mon code wp_list_pages:

 <ul id="markdown-toc">
   <li><h3><a href="#contents">Contents</a></h3></li>
   <ul id="my_cutom_type-list">
     <?php wp_list_pages( 'post_type=manual&title_li=' ); ?>
   </ul>
 </ul>
1
Jonathan Pyle

Vous pouvez ajouter un filtre sur post_type_link, ce qui permet de modifier les permaliens de type publication personnalisés avant leur sortie.

Le filtre passe l'objet de publication personnalisé en tant que deuxième argument. Nous pouvons donc l'utiliser pour obtenir l'ID et former le nouveau permalien:

function wpd_list_pages_permalink_filter( $permalink, $page ){
    return '#' . $page->ID;
}

Ensuite, vous pouvez ajouter et supprimer le filtre lorsque vous utilisez wp_list_pages:

add_filter( 'post_type_link', 'wpd_list_pages_permalink_filter', 10, 2 );

wp_list_pages();

remove_filter( 'post_type_link', 'wpd_list_pages_permalink_filter', 10, 2 );

Si votre menu contenait le type de publication page intégré, vous utiliseriez le filtre page_link. Notez que dans ce cas, le deuxième argument est uniquement l'ID de la page, pas l'objet de page complet comme dans le filtre post_type_link.

3
Milo

Vous pouvez le faire en créant votre classe Walker personnalisée et en passant son instance en argument en appelant la fonction wp_list_pages().

Le but de la classe Walker est

Il trace simplement chaque branche de votre arbre: il doit être étendu par d'autres classes qui lui indiquent quoi faire pour chaque élément rencontré.

Placez cette classe dans votre fichier functions.php ou plugins.

class linkModifyWalker extends Walker_Page {


function start_lvl( &$output, $depth = 0, $args = array() ) {
    $indent = str_repeat("\t", $depth);
    $output .= "\n$indent<ul class='dropdown-menu children'>\n";
}


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 dropdown';

    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 ) );
    $output .= $indent . '<li class="' . $css_class . '"><a href="#' .$page->ID . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>';


    }
}

Nous venons de créer la classe linkModifyWalker. Nous devons passer son objet à la wp_list_pages() en tant qu'argument. 'walker' => new linkModifyWalker()

<ul id="markdown-toc">
   <li><h3><a href="#contents">Contents</a></h3></li>
   <ul id="my_cutom_type-list">
     <?php 
     wp_list_pages( array(
         'post_type'=> 'manual',
         'walker' => new linkModifyWalker()
     ) ); 
     ?>
   </ul>
 </ul>

Pour en savoir plus sur la classe Walker. Je vous recommande de visiter le lien ci-dessous.

Comprendre la classe Walker

0
Govind Kumar