php - 致命错误:未捕获的错误:调用数组上的成员函数 have_posts()
问题描述
我在 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 实例......这就是问题所在。
所以有两种方法可以解决这个问题:
1.改用WP_Query
您可以使用 WP_Query 代替自定义 SQL 查询。
$flash_ads = new WP_Query( array(
'post_type' => 'ad_listing',
'post_status' => 'publish',
...
) );
然后您可以像在代码中一样使用它。
2.改变你的循环
或者您仍然可以使用自定义 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
设置全局。
推荐阅读
- mysql - 关于 node.js 和 mysql
- java - SpringBoot – 在 Rest 方法中添加 Cache Control Headers
- laravel - 如何在laravel单元测试中上传带有json post请求的文件
- java - 不同圆上两点之间的最大和最小距离是多少?
- html - 带箭头的 Bootstrap 手风琴问题
- rxjs - 可从数组轮询服务器观察到
- android - 删除数据库内容后 searchView 不起作用
- mysql - 如何在mysql中使用拆分功能或将拆分值存储在不同的列中?
- php - 具有单引号 (') 值的 JSON 无法存储在隐藏的输入字段中
- java - 如何使用 sbt 运行 scala 项目?