首页 > 解决方案 > 致命错误:未捕获的错误:调用数组上的成员函数 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() ); ?>

我不知道我的错误在哪里...非常感谢您的帮助。赛博姆

标签: phpwordpress

解决方案


您不使用 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设置全局。


推荐阅读