WP_LIST_Pages();更改超级链接的输出

时间:2016-11-30 作者:Jonathan Pyle

我正在为一个文档网站创建一个菜单,非常像这样:http://getbootstrap.com/components/

我使用的是分层自定义帖子类型(手动)。我目前正在使用wp\\u list\\u pages()输出列表。这为我提供了我正在寻找的嵌套结构:

<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 -->
不幸的是,wp\\u list\\u pages()将永久链接输出到帖子,如下所示:

<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>
我需要它像这样输出post\\u id:

<li class="page_item page-item-332"><a href="#332">1.1 &#8211; Manual Organization</a></li>
此外,以下是我的wp\\U list\\U页面代码:

 <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>

2 个回复
最合适的回答,由SO网友:Milo 整理而成

您可以在上添加筛选器post_type_link, 它允许在输出自定义post类型永久链接之前对其进行修改。

过滤器将自定义post对象作为第二个参数传递,因此我们可以使用它来获取ID并形成新的永久链接:

function wpd_list_pages_permalink_filter( $permalink, $page ){
    return \'#\' . $page->ID;
}
然后,您可以在使用时添加和删除筛选器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 );
如果您的菜单包含内置page post类型,您可以使用page_link 滤器注意,在这种情况下,第二个参数只是页面的ID,而不是像post_type_link 滤器

SO网友:GKS

可以通过创建自定义Walker类并在调用wp_list_pages() 作用

Walker课程的目的是

它只跟踪树的每个分支:它必须由其他类扩展,这些类告诉它对遇到的每个元素做什么。

将此类放入functions.php 文件或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>\';


    }
}
我们刚刚创建linkModifyWalker 类,我们需要将其对象传递给wp_list_pages() 作为论据。\'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>
了解更多关于Walker课程的信息。我建议您访问以下链接。

Understanding the Walker Class

相关推荐

如何创建4列和2列Twitter-Bootstrap相结合的WordPress循环?

我想根据4列(桌面视图)、2列(mobile view 768px)和1列(mobile view 425px)的组合显示帖子。我在下面找到了很棒的代码:<?php $paged = ( get_query_var(\'paged\') ) ? get_query_var(\'paged\') : 1; $args=array( \'post_type\' => \'post\',