0

私は一日中この問題に悩まされてきました、そして誰かが助けてくれることを願って、私はそれでどこにも行きません!

複数の場所があり、それぞれの特定の場所に存在する各飲み物をリストする必要があるレストランのサイトを構築しています。次に、これらの飲み物をカテゴリ(茶色、白、トマト、ビール、ワイン)で並べ替える必要があります。私は解決策に非常に近いように感じますが、私は最後まで頭を叩いています。

これが私のコードです:

$drinks = get_posts('post_type=drinks&numberposts=-1');
        $show_brown_title   = false;
        $show_white_title   = false;
        $show_tomato_title  = false;
        $show_wine_title    = false;
        $show_beer_title    = false;

        if ( $drinks ) {
            foreach( $drinks as $drink ) {

                $id             = $drink->ID;
                $drink_location = $drink->drink_location;

                if($drink->drink_category == 'Brown' && $drink_location && in_array($site_slug, $drink_location)) {
                    if($show_brown_title == false) {
                        echo '<h4><span>Brown</span> Cocktails</h4>';
                        echo '<ul>';

                        $show_brown_title = true;
                    }

                    echo '<li>';
                    echo '<span class="drink_title">'.$drink->post_title.'</span>';
                    echo '<span class="drink_ingredients">'.$drink->drink_ingredients.'</span>';
                    echo '<span class="drink_price">'.$drink->price_oz.'</span>';
                    echo '</li>';
                }

                if($drink->drink_category == 'White' && $drink_location && in_array($site_slug, $drink_location)) {
                    if($show_white_title == false) {
                        echo '<h4><span>White</span> Cocktails</h4>';
                        echo '<ul>';

                        $show_white_title = true;
                    }

                    echo '<li>';
                    echo '<span class="drink_title">'.$drink->post_title.'</span>';
                    echo '<span class="drink_ingredients">'.$drink->drink_ingredients.'</span>';
                    echo '<span class="drink_price">'.$drink->price_oz.'</span>';
                    echo '</li>';
                }
           }
}

ほとんどの場合、これは機能します。しかし、私は2つの問題に直面しています。

  1. 各カテゴリを終了した後、順序付けされていないリストを閉じる方法がわかりません。
  2. このグループはほとんどの場合カテゴリ別に分類されていますが、後で飲む飲み物がある場合、実際には正しいカテゴリに分類されず、一番下にあるカテゴリに分類されます。これは、順序付けされていないリストを閉じていないためか、投稿がWPからプルされている順序のためかはわかりません。

私がこれを大丈夫に説明しているなら私に知らせてください、そして私はあなたたちが提供できるどんな助けにも本当に感謝します!

Z

4

2 に答える 2

1

get_postsの代わりに、WP_Queryを使用する必要があります。情報:https ://wordpress.stackexchange.com/questions/50761/when-to-use-wp-query-query-posts-and-pre-get-posts/50762#50762

$show_brown_title   = false;
$show_white_title   = false;
$show_tomato_title  = false;
$show_wine_title    = false;
$show_beer_title    = false;
$args = array(
    'post_type'     => 'drinks',
    'numberposts'   => '-1'
);
$query = new WP_Query( $args );
if( $query->have_posts() ):
    while( $query->have_posts() ): $query->the_post();
        echo '<pre>';
        print_r( $query );
        echo '<pre>';
    endwhile;
endif;
wp_reset_postdata();

ループ内で、リストを再度作成し、print_rを段階的に使用し、オブジェクト要素をスマートに使用します。


アプローチ#2:

$show_brown_title   = false;
$show_white_title   = false;
$show_tomato_title  = false;
$show_wine_title    = false;
$show_beer_title    = false;
foreach((get_the_category()) as $cat) {
    $args = array(
        'post_type'     => 'drinks',
        'numberposts'   => '-1',
        'cat'           => $cat->cat_ID
    );
    $query = new WP_Query( $args );
    if( $query->have_posts() ):
        echo '<ul>';
        while( $query->have_posts() ): $query->the_post();
            echo '<h4><span>'. $query->category_name .'</span> Cocktails</h4>';
            echo '<li>';
            echo '<span class="drink_title">'.$query->post_title.'</span>';
            echo '<span class="drink_ingredients">'.$query->drink_ingredients.'</span>';
            echo '<span class="drink_price">'.$query->price_oz.'</span>';
            echo '</li>';
        endwhile;
        echo '</ul>';
    endif;
    wp_reset_postdata();
}

$ query-> category_nameは、おそらく別の方法で記述する必要があるという仕様があります。print_rを使用して、オブジェクトの正しいフィールド名/要素を確認します。

于 2013-01-26T22:37:35.467 に答える
0

ベローは私の解決策です。

注:get_postsは、orderbyパラメーターを使用して、drink_categoryで投稿を並べ替えます。

コードは<ul>、drink_categoryが変更されたときにのみ開始し</ul>、カテゴリの変更時にも終了するように簡略化されています。コードはまた、出力するhtmlに値が割り当てられていることを確認し、</ul>まだ追加されていない場合はfinalを追加します。

$drinks = get_posts('post_type=drinks&numberposts=-1&orderby=drink_category');

$current_category = '';
$html = '';
if ( $drinks ) {
    foreach( $drinks as $drink ) {
        $id             = $drink->ID;
        $drink_location = $drink->drink_location;

        if ($current_category != $drink->drink_category) {
            if ($current_category != '') {
                $html .= '</ul>';           
            }
            $current_category = $drink->drink_category;
            $html .= '<h4><span>' . $current_category . '</span> Cocktails</h4>';
            $html .= '<ul>';
        }

        if($drink_location && in_array($site_slug, $drink_location)) {
            $html .= '<li>';
            $html .= '<span class="drink_title">'.$drink->post_title.'</span>';
            $html .= '<span class="drink_ingredients">'.$drink->drink_ingredients.'</span>';
            $html .= '<span class="drink_price">'.$drink->price_oz.'</span>';
            $html .= '</li>';
        }
    }
}

if (strlen($html) > 0 && !endsWith($html, '</ul>')) {
    $html .= '</ul>';
}

function endsWith($haystack, $needle)
{
    $length = strlen($needle);
    if ($length == 0) {
        return true;
    }
    return (substr($haystack, -$length) === $needle);
}
于 2013-01-26T23:59:43.363 に答える