我在wordpress中开发,我有一个错误。我使用此行创建了一个模板文件,以显示所有类型为“Flash”的广告
<?php
$sql = "
SELECT distinct p.*
FROM $wpdb->posts p, ".$wpdb->prefix."p2p pp
WHERE p.ID = pp.p2p_to
AND exists (select meta_id from ".$wpdb->prefix."p2pmeta m where m.p2p_id = pp.p2p_id and m.meta_key='type' and m.meta_value like '%flash%')
AND exists (select meta_value from $wpdb->postmeta g where g.post_id = p.ID and g.meta_key='cp_sys_expire_date' and g.meta_value >= now())
AND p.post_status = 'publish'
AND p.post_type = 'ad_listing'
ORDER BY p.post_date DESC";
$flash_ads = $wpdb->get_results($sql, OBJECT);
$result = '';
?>
<div id="primary" class="content-area row">
<div class="columns">
<?php get_template_part( 'parts/breadcrumbs', app_template_base() ); ?>
</div>
<main id="main" class="site-main small-12 columns" role="main">
<?php if ( $flash_ads->have_posts() ) : ?>
<div class="row entry-wrap small-up-1 medium-up-2 large-up-3">
<?php while ( $flash_ads->have_posts() ): $flash_ads->the_post(); ?>
<div class="column">
<?php get_template_part( 'parts/content-item', APP_POST_TYPE ); ?>
</div> <!-- .column -->
<?php endwhile; ?>
</div> <!-- .row -->
<?php cp_do_pagination(); ?>
<?php else : ?>
<?php appthemes_loop_else( get_post_type() ); ?>
<?php get_template_part( 'parts/content-none', get_post_type() ); ?>
<?php endif; ?>
<?php appthemes_after_loop( get_post_type() ); ?>
我不知道我的错误在哪里...非常感谢你的帮助。美域数码
您不使用WP_Query,而是使用自定义SQL查询:
$flash_ads = $wpdb->get_results($sql, OBJECT);
get_results
返回一组行。但是稍后在您的代码中执行此操作:
<?php if ( $flash_ads->have_posts() ) : ?>
所以你将该数组视为WP_Query实例......这就是问题所在。
所以有两种方法可以解决这个问题:
您可以使用WP_Query而不是自定义SQL查询。
$flash_ads = new WP_Query( array(
'post_type' => 'ad_listing',
'post_status' => 'publish',
...
) );
然后,您可以像在代码中一样使用它。
或者您仍然可以使用自定义SQL查询(我不建议这样做),但在这种情况下,您必须重建循环。
这个:
<?php if ( $flash_ads->have_posts() ) : ?>
应该成为这样的:
<?php if ( ! empty($flash_ads) ) : ?>
还有这个:
<?php while ( $flash_ads->have_posts() ): $flash_ads->the_post(); ?>
应该成为这样的:
<?php foreach ( $flash_ads as $row ) : ?>
但在这种情况下,您不能再使用模板标签来打印值,因为没有设置全局$post
。