致命错误:未被捕获的错误:在数组上调用成员函数have_posts()

时间:2019-03-12 09:31:26

标签: php wordpress

我在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() ); ?>

我不知道我的错误在哪里... 非常感谢你的帮助。 塞伯姆

1 个答案:

答案 0 :(得分:0)

您不使用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