0

関連コンテンツ用の 3 つのメタ ボックスを備えたクライアント用の CMS セットアップがあります。クライアントがしなければならないことは、ページ スラッグ (それぞれに 1 つ) を入力することだけで、サイトは 3 つの関連する製品を返します。

クライアントが誤ってナメクジの 1 つをスペルミスするまで、すべてが正常に機能していました。このスポットに対して何も返さない代わりに、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 に答える