有没有办法让这种循环变得更短、更好?

时间:2013-05-05 作者:mobsteady

这是我的循环代码,我想调用different page templates 对于different pages. 请注意,这是一个one-page-layout.

<?php $args = array( \'post_type\' => \'page\' );?>  <!-- get only pages -->

<?php query_posts($args); ?>

<?php while (have_posts()) : the_post(); ?>  <!-- loop with pages starts -->

<?php $id = get_the_ID(); ?>  <!-- get post/pageID --> 

<?php   if ($id == 5) : include( get_stylesheet_directory() . \'/page_special.php\' );

        else: include( get_stylesheet_directory() . \'/page_all.php\' );

        endif; 
?> 
是否可以更改if ($id == 5) 具有is_page 或者类似的东西?

3 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

是的,有一些改进。

不必要地打开和关闭PHP标记是一种浪费时间的行为,使其更难阅读,并且意味着键入更多的PHP Alt/short样式语法不会很好地与编辑器配合使用。改用{},IDE甚至可以帮助您自动键入右大括号

  • Query\\u帖子,永远不要使用它。WP\\u查询或pre\\u get\\u posts筛选器中没有未包含的有效用例,请不要放置尾随?>在PHP文件的末尾,应使用PHP注释而非HTML注释,而不是包含部分。查询后,您没有尝试进行清理。您从未检查是否找到任何页面。您正在使用模板名称中的页面,这可能会与模板继承权发生冲突,并且在某些情况下可能无法加载您认为的模板,因此让我们开始:

    <?php
    
    // grab pages
    $args = array( \'post_type\' => \'page\' );
    $query = new WP_Query( $args );
    
    // did we actually find posts?
    if ( $query->have_posts() ) {
    
        // while there are still posts
        while ( $query->have_posts()) {
            // setup the current post data/globals
            $query->the_post();
    
            // grab its ID
            $id = get_the_ID();
            if ($id == 5) {
                get_template_part( \'page_special\' );
            } else {
                get_template_part( \'page_all\' );
            }
        }
        // cleanup after ourselves
        wp_reset_postdata();
    } else {
        // no pages were found!
    }
    
    现在,您可以使用get\\u template\\u part进一步扩展它。

    首先,我会将其替换为使用“内容”而不是“页面”作为主标识符。因此:

    第页,共页。php成为内容。php第\\u页特别信息。php变得内容特殊。请注意-not的用法。

    然后,我将修改加载内容模板的代码,如下所示:

    get_template_part( \'content\', get_the_ID() );
    
    例如,如果您登录到第4页,它将尝试加载content-4。php,如果不存在,它将加载内容。php。您可以传入任何您想要的作为第二个参数的内容,它还可以查看子/父主题。将其绑定到自定义字段/帖子元,您可以进一步扩展它

  • SO网友:montrealist

    首先,不要使用query_posts. 检查this question 了解更多信息。

    其次,post-ID可能不是一件好事情,因为在多个服务器开发流(即一个用于dev,另一个用于QA,另一个用于live)的情况下,复制数据库表很容易成为一件麻烦事。

    我发现,将逻辑绑定到自定义字段或类似的内容(例如插件设置)最不容易,该设置允许用户指定页面ID以显示不同的模板。

    SO网友:Ralf912

    I love ternary operators

    $part = ( 5 === (int) get_the_ID() ) ?
      \'page_special\' : \'page_all\';
    get_template_part( $part );
    
    结束

    相关推荐

    WPML in custom page templates

    我有一个Wordpress网站,使用WPML从丹斯克翻译成英语。在其中,我有一个页面,它使用自定义页面模板来显示所有帖子的标题。遗憾的是,它两次显示所有帖子:原文和译文。这是我的代码:<ul id=\"archive-list\"> <?php $args = array( \'lang\' => ICL_LANGUAGE_CODE, \'numberposts\' => \'-1\',