如何在菜单链接中替换页面插件的页面URL?

时间:2015-11-21 作者:Casper

我正在WordPress中开发一个包含多个部分的单页网站。这些部分是WordPress中的页面。

在我的index.php 我循环浏览WordPress中的所有页面,并使用自定义循环将它们添加到索引文件-首页。

循环浏览所有页面

<?php 
    $args = array(\'post_type\' => \'page\', \'orderby\' => \'menu_order\', \'posts_per_page\' => -1);
    $loop = new WP_Query($args); 
?>
<?php if ($loop) : while ($loop->have_posts()) : $loop->the_post(); ?>

    <?php $slides = get_field(\'flexslider\'); ?>
    <?php 
        if ($slides) { 
            get_template_part( \'templates/slideshow\' );
        } else {
            get_template_part( \'templates/parallax\' );
        } 
    ?>

<?php endwhile; ?>
<?php endif; ?>

MENU

因为我正在开发单页布局,所以我应该修改基本的WordPress导航,以输出特定于这种布局类型的右菜单链接。所以正常输出(我删除了idclass 属性)应该替换为标签和页面的slug。

基本菜单链接标记:

<li id="" class=""><a href="http://prachtelectronica.nl/wordpress/?page_id=10" class="menu-link main-menu-link">Lightning</a></li>
修改菜单链接(如我所愿):

<li id="" class=""><a href="#lightning" class="menu-link main-menu-link">Lightning</a></li>
我使用以下WordPress函数构建菜单:

<?php wp_nav_menu( array(
       \'theme_location\' => \'primary-menu\',
       \'menu\' => \'primary-menu\',
       \'container\' => \'nav\',
       \'container_id\' => \'primary-navwrapper\',
       \'menu_id\' => \'listnav\',
    ));
?>
我希望每个部分(页面)的位置将由中设置的菜单顺序确定Appearance > Menu, 因此,客户在创建新分区(页面)时只有三件事要做。(1) 创建一个页面,(2)将页面添加到菜单(3)并在菜单结构中排序。

我已经在使用menu_order 属性以显示index.php 文件菜单的顺序用于按正确的顺序定位节(页)。

页面的一个额外选项是,用户可以通过选择模板向页面添加自定义模板ads 在WP编辑器内。使用名为“ads”的模板的页面应显示在索引中。php作为一个节,但不作为菜单项列表中的菜单项出现,因为这些节与主要内容无关。

我希望我的愿望能得到解决。如果您有任何问题,请在下面的评论中告诉我。现在,请提前感谢。

1 个回复
SO网友:JHoffmann

为了能够更改链接,可以将nav_menu_link_attributes 滤器

if ( ! function_exists( \'wpse_209457_nav_menu_link_attributes\' ) ) {
    function wpse_209457_nav_menu_link_attributes( $atts, $item, $args ) {
        if ( \'primary-menu\' == $args->theme_location ) {
            // Get the target posts slug
            $object_data = get_post( $item->object_id );
            $atts[\'href\'] = \'#\'.$object_data->post_name;
            return $atts;
        }
    }
}
 add_filter( \'nav_menu_link_attributes\', \'wpse_209457_nav_menu_link_attributes\', 10, 3 );
根据使用的模板,使特定项目不出现在菜单中更适合单独的问题,但我还是要发布解决方案。您需要在此处使用另一个挂钩:

if ( ! function_exists( \'wpse_209457_wp_nav_menu_objects\' ) ) {
    function wpse_209457_wp_nav_menu_objects( $sorted_menu_items, $args ) {
        foreach ( $sorted_menu_items as $key => $item ) {
            $template = get_post_meta( $item->object_id, \'_wp_page_template\', true );
            if ( "templates/ads.php" == $template ) {
                unset( $sorted_menu_items[$key] );
            }
        }
        return $sorted_menu_items;
    }
}
add_filter ( \'wp_nav_menu_objects\', \'wpse_209457_wp_nav_menu_objects\', 10, 2 );
我没有运行此代码,我希望它对您有用。