wordpress query_posts替代方案

时间:2013-10-18 18:49:42

标签: php wordpress portfolio

我正在创建一个集成了使用自定义帖子类型的投资组合的网站,这是基于本教程完成的。

到目前为止,正是我正在寻找的东西,除了一个小细节外,效果很好。为了从新的自定义帖子类型中获取帖子,本教程的作者使用了query_posts()codex。因此,我的投资组合页面顶部如下所示:

<?php
/* Template Name: Portfolio */
get_header();
query_posts('post_type=portfolio&posts_per_page=10');
?>

我收集的是,这声明“从帖子类型”投资组合中获取帖子并且每页显示10个“。我的问题是我无法从我的投资组合页面获取内容。现在我的投资组合页面似乎只从自定义帖子类型中提取内容,我不能使用:

<?php while ( have_posts() ) : the_post(); ?>
  <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

从实际页面获取内容。

这就是我想要做的,我已经取代了:

query_posts('post_type=portfolio&posts_per_page=10');

使用:

add_action( 'pre_get_posts', 'add_my_post_types_to_query' );

function add_my_post_types_to_query( $query ) {
    if ( is_page( 8 ) && $query->is_main_query() )
        $query->set( 'post_type', array( 'portfolio' ) );
    return $query;
}

这似乎是正确的轨道,但它仍然不起作用。我没有收到自定义帖子类型的帖子。

我有什么想法可以修改它吗?我还在学习,所以很清楚,解释将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

编辑pre_get_posts将替换原始查询,您将根本没有页面内容。如果您只想显示投资组合帖子类型的内容而不是投资组合页面的内容,我建议您采用这种方法。

对于一般的帖子查询,建议使用WP_Query或get_posts。

http://codex.wordpress.org/Class_Reference/WP_Query

http://codex.wordpress.org/Template_Tags/get_posts

如果您使用WP_Query函数,wp_reset_postdata()会将发布数据恢复为原始数据,以便您可以获取原始页面的内容。

$args = array(
    'posts_per_page' => 10,
    'post_type' => 'portfolio',

);    

// The Query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

现在,您将能够使用原始循环来显示页面内容

<?php while ( have_posts() ) : the_post(); ?>
  <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

答案 1 :(得分:0)

通常,我将查询帖子粘贴在变量中,如下所示:

$catid = get_cat_ID('My Category Name');

$args = array(
    'posts_per_page' => 5,
    'orderby' => 'post_date',
    'order' => 'DESC',
    'post_type' => 'post',
    'post_status' => 'publish',
    'category' => $catid
);

$posts_array = get_posts($args); 

然后你可以这样循环:

<?php foreach ($posts_array as $post) : setup_postdata($post);?>
    <h1><?php the_title(); ?></h1>
    <p><?php the_content(); ?></p>
<?php endforeach; ?>

最后,要访问您的网页内容,您可以使用变量$post,它由wordpress自动设置。无需添加任何代码来访问您的网页内容。

<?php foreach( $posts as $post ) : setup_postdata($post); ?>
    <h1><?php the_title(); ?></h1>
    <p><?php the_content(); ?></p>
<?php endforeach; ?>

页面内容的foreach循环有点矫枉过正,有一种更好的方法(最有可能),但我还没有打算进一步研究它!它虽然有效!