質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

wordpressで新着情報を作る際に通常の投稿は1日1件のみ表示したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 684

Lariat

score 13

お世話になっております。

wordpressでサイトのトップページに更新情報を5件掲載しようと思っています。

表示したい項目は下記の通りで、

  • ブログ
  • カスタム投稿タイプA
  • カスタム投稿タイプB
  • カスタム投稿タイプC
  • カスタム投稿タイプD

上記の「ブログ」(WordPressの通常の投稿)のみ数人で更新しており、毎日数件の記事が追加されている状況です。
この状態では5件しかない表示枠に全が「ブログ」になってしまい、他の情報を見落としてしまう可能性があります。

そこで、「ブログ」のみ1日1件のみ表示したいのですが、5日間「ブログ」の記事の追加しかなかった場合は、
表示枠全てが「ブログ」になってしまうのは問題ありません。

理想の状態は下記になります

  • 2018/02/06 「ブログ」を更新しました(この日に何件記事が追加されても1枠のみ表示)
  • 2018/02/05 「カスタム投稿タイプA」を更新しました。
  • 2018/02/05 「カスタム投稿タイプA」を更新しました。
  • 2018/02/04 「カスタム投稿タイプB」を更新しました。
  • 2018/02/03 「ブログ」を更新しました(この日に何件記事が追加されても1枠のみ表示)

各カスタム投稿タイプについては1日に5件記事が追加された場合、表示枠が全て埋まっても問題ありません。

現在のコードは以下になります。

$count = 1;
$args = array(
    'post_type' => array( 'post', 'kasutamu1', 'kasutamu2', 'kasutamu3' )
);
$posts = get_posts( $args );
foreach ($posts as $post) {
    if (get_post_type() === 'post') {
        if (!$date === get_the_date()) {
            $date = get_the_date();
            echo $date.' 「ブログ」を更新しました';
        } else {
            continue;
        }
    } else {
        echo get_the_date().' 「'.get_post_type().'」を更新しました';
    }
    if ($count === 5) {
        break;
    } else {
        $count++;
    }
}

何とぞ、ご教授のほどお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

ちょっと冗長な気はしますが

$count = 1;
foreach ($posts as $post) {
    if (get_post_type() === 'post') {
        if (!$date === get_the_date()) {
            $date = get_the_date();
            echo $date.' 「ブログ」を更新しました';
        } else {
            continue;
        }
    } else {
        echo get_the_date().' 「'.get_post_type().'」を更新しました';
    }
    if ($count === 5) {
        break;
    } else {
        $count++;
    }
}


post_typeがpostなら一旦出力(日付を変数に入れておく)
次もpostで日付が前回の投稿と一致したら出力せずにcontinueで次のループへ
出力が5件になったらbreakでループを抜ける

こんな感じでしょうか?
未検証なので上手く動かない時は言ってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/06 17:34

    ありがとうございます!
    ループを二重にしたり、いろいろ試してみていましたが、カウントは思いつきませんでした!
    さっそく試してみようと思います。
    取り急ぎ御礼まで。

    キャンセル

  • 2018/02/06 18:30

    いただいた回答に
    $count = 1;
    $args = array(
    'post_type' => array( 'post', 'カスタムA', 'カスタムB', 'カスタムC' )
    );
    $posts = get_posts( $args );
    foreach ($posts as $post) {
    if (is_singular( 'post' ) ) {
    if (!$date === get_the_date()) {
    $date = get_the_date();
    echo $date.' 「ブログ」を更新しました';
    } else {
    continue;
    }
    } else {
    echo get_the_date().' 「'.get_post_type().'」を更新しました';
    }
    if ($count === 5) {
    break;
    } else {
    $count++;
    }
    }

    としたところ、上手く表示されたようです!ありがとうございます!!

    キャンセル

  • 2018/02/06 19:18

    申し訳ありません。
    上記のわたくしのコードでは上手く表示できていませんでした。
    aozukiさんのコードを実行してみたところ、件数が1件しか表示されておらず、postがカウントされていないような気がしています。

    改めてご助力いただけるのであればありがたいです・・・!

    キャンセル

checkベストアンサー

+2

have_postsを利用した場合は、以下のような感じかと思います。
カウントさせておくってところはaozukiさんと同じですね。
実際の条件式やプログラムなどは書いてないですが。考え方だけでもいいですか?

//どれだけ出力したかと、何日のブログを表示したかの配列を用意しておく
$intPostNum = 0;
$arrBlogDate = array();

if ( have_posts() ) :
    while ( have_posts() && $intPostNum < 5) :
    // ↑have_postsだけではなく、表示件数($intPostNum)が5件に満たなかったときの条件を追加する

        the_post();

        // 投稿タイプがブログの場合

            // $arrBlogDateに、ループ中の記事の日付が入っていなければ
                // フォーマットに沿って出力

                // $arrBlogDateに、今の日付を追加する
                // 記事件数($intPostNum)をプラスする

            // 日付の配列に、該当記事の日付が入ってたら
            //     何も処理しない(スルー)

        // 投稿タイプがブログじゃない場合
            // フォーマットに沿って出力
            // 記事件数($intPostNum)をプラスする

    endwhile;
else :

endif;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/06 18:33

    ありがとうございます!
    考え方のみでも非常にありがたいです!!
    やりたい事を日本語で書くというのは凄くわかりやすいですね。

    今回はaozukiさんからいただいたコードで表現することができました。
    まだまた初心者なので、これから勉強していきます!

    お時間いただきまして、ありがとうございました!

    キャンセル

0

みなさんご回答ありがとうございました。
下記のコードで無事に解決できました!!

aozukiさん、kszk311さん本当にありがとうございました!
自己解決欄に書くのは大変おこがましいのですが、
こちらの方が他の方にもコードが見やすいかと思い、こちらに最終的なコードを記載させていただきます。
お二人のコードや考え方を自分なりに書いてみましたので、不要な箇所などあるかもしれませんが、今のところ動作しています。

$intPostNum = 0;
$arrBlogDate = array();
$args = array(
    'post_type' => array( 'post', 'kasuamu01', 'kasuamu02', 'kasuamu03' )
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts()) {
    while( $the_query->have_posts()&& $intPostNum < 5 ) {
        $the_query->the_post();
        if (get_post_type() === 'post' ) {
            $blogDate = get_the_date();
            $key = in_array($blogDate, $arrBlogDate);
            if(!$key){
                echo '<li>'.get_the_date().' 「ブログ」を更新しました'.'</li>';
                $arrBlogDate[]=$blogDate;
                $intPostNum++;

            }else{
                continue;
                $blogDate=0;

            }
        }else{
            echo '<li>'.get_the_date().' 「'.get_post_type().'」を更新しました'.'</li>';
            $intPostNum++;

        }
    }
    wp_reset_postdata();
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る