如何排除菜单中没有PageID的页面?

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

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

我使用以下循环获取所有页面index.php 文件

<?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 
        global $post;
        $slug = $post->post_name;
    ?>
    <section id="<?php echo $slug; ?>" class="slideshow">
        <div class="container">
           <h3><?php the_title(); ?></h3>
           <?php the_content(); ?>
        </div>
    </section>
    <?php endwhile; ?>
    <?php endif; ?>
对索引中的页(节)进行排序。php文件,我使用menu_order 循环参数,根据菜单顺序定位节(页),如以上代码所示。

这工作正常,但问题从这里开始。由于网站包含多个代表一种广告版面的版面,因此不应将其作为菜单项显示在菜单中。

查找我添加到此问题的视觉效果。左侧是包含菜单项的侧栏。如果单击某个项目,它将滚动到页面的右侧部分(第页)。

我创建了如下菜单:

<?php wp_page_menu( array(
       \'sort_column\' => \'menu_order, post_title\',
       \'menu_class\'  => \'primary-menu\',
       \'exclude\'     => \'\',
    )); 
?>
我可以使用exclude 从菜单中排除特定页面,但这应该是硬代码。使用模板的所有节(页)parallax 应从菜单项列表中排除。正如您在视觉中所看到的,第2页应该从菜单中排除,仅从菜单中排除,该部分应该在页面上仍然可见。

如果有办法将这些页面从菜单中排除,但仍然使用菜单的顺序将这些部分放置在正确的位置,这将非常好,与其他不包含广告的部分一样。只有排除的项目不应显示在菜单项列表中。

值得一提的是,每个“广告”部分都有类视差。模板中还有标题名称(见下文)。

因此,如果有一种方法可以编写一个函数,将这些节与类一起排除parallax, 那太好了。有一种方法可以通过输入pageID来排除硬编码的页面,但我正在寻找一种在WordPress中通过查找类来自动处理的方法parallax 或者别的什么。。。

视差模板的标题:

<?php

/*
    Template Name: Parallax
*/

?>
如果有问题,我想听听你的意见。希望有人能帮我!提前谢谢。晚上好!

enter image description here

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

排除必须基于与存储在数据库中的页面连接的内容。数据库中存储的唯一与模板相关的内容是视差模板的文件名,它存储在post meta中的键下_wp_page_template. 您可以查询没有密钥的页面_wp_page_template, 或者,如果它确实有密钥,则它不等于模板文件的文件名。

$args = array(
    \'post_type\'       => \'page\',
    \'posts_per_page\'  => -1,
    \'fields\'          => \'ids\',
    \'meta_query\'      => array(
        \'relation\'    => \'OR\',
        array(
            \'key\'     => \'_wp_page_template\',
            \'value\'   => \'templates/parallax.php\',
            \'compare\' => \'!=\',
        ),
        array(
            \'key\'     => \'_wp_page_template\',
            \'compare\' => \'NOT EXISTS\',
        ),
    ),
);
然后,您可以使用此查询的结果来构建自己的菜单,而不是使用wp_page_menu. 与下面的其他选项相比,这将在查询数量方面更加有效。。。

编辑-另一个选项是使用视差模板查询所有页面。然后,您可以使用此查询的结果从wp_page_menu:

$args = array(
    \'post_type\'       => \'page\',
    \'posts_per_page\'  => -1,
    \'fields\'          => \'ids\',
    \'meta_query\'      => array(
        array(
            \'key\'     => \'_wp_page_template\',
            \'value\'   => \'templates/parallax.php\',
            \'compare\' => \'=\',
        )
    ),
);

$pages_to_exclude = new WP_Query( $args );

wp_page_menu( array(
   \'sort_column\' => \'menu_order, post_title\',
   \'menu_class\'  => \'primary-menu\',
   \'exclude\'     => implode( \',\', $pages_to_exclude->posts ),
));