0

我有一个客户端的 CMS 设置,其中包含三个用于相关内容的元框。客户所要做的就是输入一个页面 slug(每个一个),该站点将返回三个相关产品。

一切正常,直到我的客户不小心拼错了一个蛞蝓。WordPress 没有返回任何内容,而是返回大约 6 个随机项目。

在 FUNCTIONS.PHP 中:

function get_ID_by_page_name($page_name) {
global $wpdb;
$page_name_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_name = '".$page_name."' AND post_type = 'page'");
return $page_name_id;

}

在模板文件中:

$goesWith = get_post_meta($post->ID, 'goes_with', true);

if (($goesWith) or ($goesWith2) or ($goesWith3)) {

            echo "<div class='goes-with'>";

            echo  "<h2>Goes Great With:</h2>";                      

            // OPTION ONE

                $pageID = get_ID_by_page_name($goesWith);

                    if ($goesWith) { 

                        $args = array(
                            'post_type'      => 'page',
                            'page_id'     => $pageID,
                            'post_status' => 'publish'
                        );
                        query_posts( $args );

                        while(have_posts()) {

                            the_post(); // vital                                                        

                            echo "<div class='post-product'>";
                            echo "<a href=";
                            the_permalink();
                            echo ">";
                            thumbPath(140, 140);
                            echo "</a><a href=";
                            the_permalink();
                            echo "><p>";
                            the_title();
                            echo "</p></a></div><!--end post-product-->";

                       }



                    }

                    else {

                        echo "";

                    } 


            wp_reset_query();  
4

1 回答 1

0

首先,您不需要任何自定义代码来执行您正在执行的操作:

$goes_with = get_post_meta(get_the_ID(), 'goes_with'); //Returns array when 3rd parameter is left empty or false
foreach($goes_with as $slug){
    $args = array(
        'post_type'   => 'page',
        'post_status' => 'publish',
        'pagename'    => $slug
    );
    query_posts( $args ); //Bad way
    while(have_posts()){ the_post(); //Bad way

    //$query = new WP_Query($args); //Good way
    //while($query->have_posts()){ $query->the_post(); //Good way                                                         

        echo "<div class='post-product'>";
        echo "<a href='".get_permalink()."'>";
        thumbPath(140, 140);
        echo "</a><a href='".get_permalink()."'><p>".get_the_title()."</p></a></div><!--end post-product-->";
    } 
    wp_reset_query(); //Bad way
    //wp_reset_postdata(); //Good way
}

其次,你应该绝对避免使用 query_posts()。这可能为时已晚,因为您的主题已经发送给您的客户,但如果将额外的时间投入主题不是问题,您应该考虑将所有内容从 query_posts 切换到WP Query 。

使用 WP_Query 可以显着提高性能,而且它不会改变任何 Wordpress 全局变量。

如果您想了解它是如何实现的,请随时注释掉所有标记为“Bad way”的行,并取消注释所有标记为“Good way”的行。

此外,使用上面的代码,您可以在自定义元字段中重复使用相同的 'goes_with' 键,以根据需要将尽可能多的其他页面链接到给定的页面查询。由于您通过页面名称而不是 ID 运行查询,因此必须在循环中执行此特定方法。

但是,与原来的相比,这样做的好处是,您依靠 Wordpress 的内置功能为您进行查询,而不是对数据库进行额外调用以返回您已经可用的结果。

此代码未经测试,可能需要进行一些重构才能使其与您的设置一起使用,但它应该可以帮助您入门。

希望这对你有所帮助,祝你好运。

于 2012-09-25T02:43:36.443 回答