0

我正在尝试在页面模板上显示自定义帖子类型的列表。当我查看页面时,我看到的不是不同的帖子,而是重复的实际页面。例如,如果我有 5 个帖子,实际页面(页眉内容页脚)将显示五次。看起来查询正在工作......以某种方式但我不确定出了什么问题。这是模板代码:

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

    <div id="post-<?php the_ID(); ?>" <?php post_class('page'); ?>>

        <h1><?php the_title(); ?></h1>

        <article>

            <div class="post-content page-content">
                <?php the_content(); ?>
                <?php wp_link_pages('before=<div class="pagination">&after=</div>'); ?>
            </div><!--.post-content .page-content -->

        </article>

    </div><!--#post-# .post-->

<?php endwhile; ?>

<!-- Start search result code -->

<?php
//query_posts('post_type=listing&orderby=title&order=ASC&posts_per_page=9999');
?>

<?php
$querystr = "
SELECT * 
FROM $wpdb->posts, $wpdb->postsmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = 'listing_open' 
AND wp_postmeta.meta_value = 'YES'
AND wp_posts.post_status = 'publish' 
AND wp_posts.post_type = 'listing'
ORDER BY post_title
";                              
$pageposts = $wpdb->get_results($querystr, OBJECT);                         
if ($pageposts):                    
foreach ($pageposts as $postdata):
setup_postdata($postdata);
?>

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

    <?php include_once(get_bloginfo('template_url')."/layout-listings.php?id=".$postdata->ID); ?>       

<?php //endwhile; endif; rewind_posts(); wp_reset_query(); ?>

<?php
endforeach;
endif;
?>

<?php
$querystr = "
SELECT * 
FROM $wpdb->posts, $wpdb->postmeta
WHERE wp_posts.ID = wp_postmeta.post_id
AND wp_postmeta.meta_key = 'listing_open' 
AND wp_postmeta.meta_value = 'NO'
AND wp_posts.post_status = 'publish' 
AND wp_posts.post_type = 'listing'
ORDER BY post_title
";                              
$pageposts2 = $wpdb->get_results($querystr, OBJECT);                            
if ($pageposts2):                    
foreach ($pageposts2 as $postdata2):
setup_postdata($postdata2);
?>

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

    <?php include_once(get_bloginfo('template_url')."/layout-listings.php?id=".$postdata2->ID); ?>      

<?php //endwhile; endif; rewind_posts(); wp_reset_query(); ?>

<?php
endforeach;
endif;
?>

<!-- End search result code -->

4

1 回答 1

0

该代码中有几件事需要注意。

正确include_once使用

您必须在磁盘中包含文件的路径,而不是公共 url。就像是:

include_once(get_stylesheet_directory() . "/layout-listings.php"); 

或者更好的是,使用get_template_part

get_template_part('layout', 'listings');

使用get_postsornew WP_Query代替显式查询

只有在别无选择时才应尝试使用查询,请改用 get_posts :

$pageposts2 = new WP_Query(array(
  'meta_key'   => 'listing_open',
  'meta_value' => 'NO'
));

上面的代码会得到你需要的结果。

关于使用 wordpress 功能的优点:

  • wordpress 缓存
  • 与第三方插件的兼容性,例如多语言插件
  • 分页

如果查询对于WP_Query来说太复杂,您还应该考虑阅读有关保护查询免受 SQL 注入攻击的信息

** 小心使用query_posts

错别字?

你得到了if, while, the_post,rewind_postswp_reset_query函数的注释。

于 2013-06-26T03:09:02.367 回答