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

问题描述 投票:2回答:1

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

我不知道我的错误在哪里...非常感谢你的帮助。美域数码

php wordpress
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.