在主页中仅显示公共自定义帖子

时间:2014-07-24 作者:sunil

我正在处理自定义帖子类型。目前,我们正在使用以下代码在主页中显示所有自定义帖子

     <?php
$args = array(
   \'public\'   => true,
   \'_builtin\' => false
);

$output = \'names\'; // names or objects, note names is the default
$operator = \'and\'; // \'and\' or \'or\'

$post_types = get_post_types( $args, $output, $operator ); 

foreach ( $post_types  as $post_type ) {
   echo $post_type;
}

?>

<?php query_posts(\'post_type=$post_type\'); ?>

        <?php if(have_posts()) : while(have_posts()) : the_post(); ?>

            <?php get_template_part( \'content\', get_post_format() ); ?>

        <?php endwhile; ?>

        <?php else : ?>

            <div class="page-info">
                <h1 style="font-family: <?php echo $options[\'heading_choise\']; ?>"><?php _e(\'No items found\', \'persona\') ?></h1>
            </div>

        <?php endif; ?>
因为我的主页显示NO ITEMS FOUND.

EDIT 2

这是我现在的密码

    <?php 


$query = new WP_Query(\'post_type=any\'); 

if($query->have_posts()) : 
    while($query->have_posts()) : $query->the_post(); 

        get_template_part( \'content\', get_post_format() ); 

    endwhile; 

    wp_reset_postdata();

else : 
?>

    <div class="page-info">
    <h1 style="font-family: <?php echo $options[\'heading_choise\']; ?>"><?php _e(\'No items found\', \'persona\') ?></h1>
    </div>

<?php 
endif; 
?>
如何将输出职位限制为公共职位

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

不客气,但你错过了这里的一切

首先,你不应该使用query_posts 构造自定义查询。这不仅是我的重点,也是抄本。最大的问题是query_posts 在许多情况下,分页都会失败

Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

其次,你在主页上,我相信默认情况下这只是一个正常的主页。为什么要运行不必要的自定义查询,而只需使用主查询并使用pre_get_posts. 它速度更快,而且不需要进行任何额外的db查询。

综上所述,回到默认循环,应该是

<?php 
if(have_posts()) : 
    while(have_posts()) : the_post(); 

        get_template_part( \'content\', get_post_format() ); 

    endwhile; 

else : 
?>

    <div class="page-info">
    <h1 style="font-family: <?php echo $options[\'heading_choise\']; ?>"><?php _e(\'No items found\', \'persona\') ?></h1>
    </div>

<?php 
endif; 
?>
更换所有部件。然后在函数中使用以下内容。php

function posts_on_homepage( $query ) {

    $args = array(
       \'public\'   => true,
       \'_builtin\' => false
    );

    $post_types = get_post_types( $args ); 

    if ( $query->is_main_query() && $query->is_home()) {
        $query->set( \'post_type\', $post_types );
    }
}
add_action( \'pre_get_posts\', \'posts_on_homepage\' );

EDIT 1

我只想在这里添加一些额外的信息,纯粹是为了提供信息。晚餐正在等着,他急着发帖:-)

我只想回到您的代码,如果将debug设置为true,您就会看到这些问题

$post_type 只生活在你的foreach 环您所做的是关闭foreach 在循环之前,所以当您将其添加到query_posts 参数,$post_type 已经不存在了。因此,您现在将一个未定义的变量传递给query_posts, 导致查询失败,您会收到“找不到项目”消息

您应该在foreach 循环以使查询工作。只要你在foreach$post_type 存在并将有效值传递给自定义查询

EDIT 2 and 3 SCRAPPED

EDIT 4

似乎您可能已经设置了头版,正如您所说,我的代码不起作用。如果你有头版,那么pre_get_posts 行不通。在这里,您需要运行自定义查询。使用WP_Query 这样做。将您的查询更改为

<?php
$args = array(
   \'public\'   => true,
   \'_builtin\' => false
);

$post_types = get_post_types( $args ); 

$query = new WP_Query(array(\'post_type\' => $post_types )); 

if($query->have_posts()) : 
    while($query->have_posts()) : $query->the_post(); 

        get_template_part( \'content\', get_post_format() ); 

    endwhile; 

    wp_reset_postdata();

else : 
?>

    <div class="page-info">
    <h1 style="font-family: <?php echo $options[\'heading_choise\']; ?>"><?php _e(\'No items found\', \'persona\') ?></h1>
    </div>

<?php 
endif; 
?>

SO网友:Khan

你的query_posts 线路使用情况$post_type 这将是$post_types 大堆

结束

相关推荐

如何创建具有定制分类和定制帖子类型(如base-name/parent-tax/child-tax/custom-post-type-name)的固定链接结构

我一直在搜索这个网站和谷歌来寻找答案,但结果完全是空的。基本上我想做什么this post 但我需要一个层次分类法。这篇文章中给出的答案非常有效,但只适用于单级分类法。有可能做我想做的事吗?我尝试了一百万种方法,但都没有成功,最多我可以得到正确的永久链接,但它们都是404。要直观地说明我想要什么:/basename/ - ideally a page, but I think this will cause a permalink collision /basename/top-cat/