如何在代码中定位虚拟页面?

时间:2017-05-19 作者:Mugluck

我意识到Wordpress的问题很难回答,因为有太多的插件和复杂的问题。

我们在Wordpress页面上遇到了一些问题,虚拟页面将用所有没有显式父级(父级:(无父级))的页面填充其子菜单。

我已将有问题的代码隔离到标题中的这段代码中:

<!-- Secondary Nav -->
<!-- Show Secondary Menu if the page is a child or has children -->
<?php global $post; $children = get_pages( array( \'child_of\' => $post->ID ) );

    if ( is_page() && $post->post_parent  || count( $children ) > 0 ) : ?>

        <div class="row subnav">
            <div class="container">
                <div class="columns large-12">
                    <ul>
                        <?php wp_list_pages( array(\'title_li\'=>\'\',\'depth\'=>1,\'child_of\'=>get_post_top_ancestor_id()) ); ?>
                    </ul>
                </div>
            </div>
        </div>

    <?php else : ?>
    <!--This is a parent page without children -->

    <?php endif; ?>
研究表明,虚拟页面通常是有子页面的页面,而不是没有子页面的页面。

Wordpress如何处理与页面相关的虚拟页面。。。孩子?正如在普通页面上所期望的那样,它会得到一个附属菜单项的列表。

我在buddypress上也看到过同样的行为,而coursepress现在也出现了这种情况。

我想更重要的是,在if语句中有没有一种方法可以将虚拟页面与普通页面分开,这样就不会为它们生成子菜单?

以下是几个图像示例:

Example slug designation

Course page

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

WordPress就像其他CMS一样,依赖于根据用户的请求生成内容,然后将其作为HTML页面输出到浏览器。你问的问题可能有很长的答案,但这里有一个简单的解释。

我们从名为.htaccess, 这是一个服务器文件。这就是.htaccess 文件(由WordPress在激活pretty permalinks时生成):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
代码只是告诉服务器:

如果请求的URL不是文件或目录,请将请求发送到index.php, WordPress被告知加载和查看内容的位置。

当您尝试访问帖子内容时,例如通过访问http://example.com/my-category/my-first-post, WordPress会检查URL并注意到您试图访问单个帖子的内容。然后,它将尝试为该特定页面生成内容。

WordPress中的每一页都有自己的模板,就像一张空白表单,里面会填入数据。例如,单个帖子的模板文件称为single.php 并位于模板目录的根目录中。因此,当您尝试访问帖子时,模板部分中的代码将运行。

要更好地了解模板层次结构,请查看下图:

WordPress template hierarchy

那么,我们如何定位这些页面?第一种方法是找到合适的模板文件并直接编辑它。不建议这样做,因为模板文件将来可能会被更新覆盖。

另一种方法是找到合适的hook 改变我们需要改变的东西。例如,如果您想更改WordPress的标题,可以挂接到wp_title 挂钩:

add_filter( \'wp_title\', \'my_wp_title\', 10, 2 );
function my_wp_title(){
    return \'Hello!\';
}
这会将WordPress的标题设置为Hello!. 正如我提到的,你的问题很广泛,答案可能很长。如果你确切地说明你的问题,我可以发布一个更准确的答案。

我希望这有助于您理解WordPress(或任何其他CMS)如何呈现其内容。

SO网友:Frank P. Walentynowicz

问题说明

唯一的问题是菜单设置和菜单结构。不需要任何自定义代码,也不需要搜索任何“挂钩”。在最后一节中,我将解释为什么CoursePress插件创建的页面(自定义帖子类型)不会显示在所有页面列表中。

解决方案

转到外观->菜单并选择要编辑的菜单。在菜单设置->自动添加页面选项中,取消选择自动向该菜单添加新的顶级页面。这一步非常重要。如果选中上述框,则每次创建新课程时,其标题都将添加为顶级菜单项。现在,您可以通过拖放菜单项来重新排列菜单结构,以获得如下内容:

Courses ( Post Type Archive )
    ├─── Course 1 ( Course )
    ├─── Course 2 ( Course )
    └─── Course 3 ( Course )
按保存菜单按钮。全部完成。其余部分由CoursePress插件处理。

页面vs自定义帖子类型

课程是一种自定义帖子类型,由CoursePress插件创建。该插件创建一个顶级管理菜单CoursePress,并作为其子菜单之一创建课程。这是您获得虚拟页面列表的地方(如您所称)。它们不会按页面->所有页面列出,因为它们的“post\\u type”不是“page”,而是“course”。

结束

相关推荐

在Single.php中显示其他类别帖子

我的单曲。php我想显示当前帖子,在它下面我想列出cat-2中的所有帖子。在我的循环中,我试图用cat-2查询帖子,但它仍然显示当前帖子。<?php global $query_string; $posts = query_posts($query_string.\'\'); ?> <?php if (have_posts()): while (have_posts()) : the_post(); ?> <h4>