• 解決済 linamia

    (@linamia)


    いつもお世話になっております。

    ワードプレスのTOPページをニュースサイト風にリニューアルしようと考えています。
    そのため、各カテゴリーごとに、新着記事一覧を表示したいと考えております。

    ——————————————————–

    ※表示イメージ

    【カテゴリー名:ノベル】
     ・にんじんの冒険 (~月~日)
     ・ピーマンの冒険 (~月~日)
      …
     >もっと読む

    【カテゴリー名:ストーリー】
     ・かぼちゃの早とちり (~月~日)
     ・なすびの早とちり (~月~日)
      …
     >もっと読む

    【カテゴリー名:コミック】
     ・トマトはデザートなの? (~月~日)
     ・メロンは野菜なの? (~月~日)
     …
     >もっと読む

    ——————————————————–

    そこで、あるサイトさんに掲載の有った
    下記のphpコードをお借りして実装しようと思ったのですが、
    「cat」に対して複数カテゴリーを指定するとエラーが出てしまいます。


    2行目→ $cat = ‘novel’; だと動きます
    2行目→ $cat = ‘novel,story,comic’; だとphp部分がエラーになって表示されません

    <?php
    $cat = ‘novel’;
    $num = ‘5’;
    global $post;

    $term_id = get_category_by_slug($cat)->term_id;
    $myposts = get_posts(‘numberposts=’ .$num. ‘&category_name=’ .$cat);
    if ($myposts) {
    echo ‘Category: ‘ .get_the_category_by_ID($term_id). ‘‘;
    foreach($myposts as $post):
    setup_postdata($post);
    echo ‘<div class=”postlist-category”>‘;
    if ( has_post_thumbnail() ) {
    echo ”.get_the_post_thumbnail($page->ID, ‘thumbnail’). ”;
    } else {
    echo ‘<i class=”ico-camera-alt”></i>’;
    }
    echo ‘
    </div><div class=”postlist-category-inner”>’;
    echo ‘<span class=”postlist-datetime”>’ .get_the_time(‘Y/n/j H:i:j’).'</span>’;
    echo ‘<p>‘. the_title(“”,””,false).’</p>’;
    echo ‘<p>’ .mb_substr( strip_tags( $post -> post_content ), 0, 32 ). ‘…</p></div>’;
    endforeach;
    echo ‘<p>カテゴリの一覧 ≫</p>’;
    } else {
    echo ‘<p>記事がありません。</p>’;
    }
    ?>

    こちら、かなり基本的な話になるかとは思うのですが
    複数カテゴリーなので「,」で指定できるものと簡単に考えていたのですが、
    ループ処理? if? などを入れないといけないのでしょうか。
    phpについてはまだまだ勉強不足で、ご迷惑をおかけいたします。

    ※上記コードをカテゴリーの数分コピペすれば実装はできたのですが、
     コード的にスマートでない(のと重くなりそう)気がしております……。

    お手すきの時にでもお力添え頂けますと幸いです。
    どうぞよろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    カテゴリーの数だけループを回すなら、get_termsを使うと良いですよ。
    手前味噌で恐縮ですが私が以前書いたブログ記事を参考に説明します。
    http://mypacecreator.net/blog/archives/1574

    これだと途中でカテゴリーが増えてもコードを増やさなくていいので便利ですよ。
    上記事でget_terms(‘post_tag’)とある部分のpost_tagをcategoryに変えれば、全カテゴリーを順番に取得できます。
    新着記事一覧は、linamiaさんが貼ってくださったコードにあるようにget_postsで行いますが、ちょっと書き方がややこしいですね。
    貼ってくださったコードは、コンテンツ表示部分を echo get_the_***** って感じで書いてますが、私の記事のようにechoを使わずに、HTMLベースで書いてその中に<?php the_title(); ?>みたいな普通のテンプレートタグを入れていくほうがわかりやすいと思います。

    トピック投稿者 linamia

    (@linamia)

    mypacecreator様

    ご返信ありがとうございました。

    ご教示いただいたことのうち、

    ・get_terms(”)でカテゴリーを繰り返して取得させる必要がある
    ・タグ的には<?php the_title(); ?>の方がすっきりする

    という点がわかり、大変勉強になりました。
    特に、下記の点については、確かにその方がマークアップもしやすいので
    できればそちらの方で書いていきたいと考えています。

    ただ、phpに関してはほぼ全く知らない素人なので、
    教えていただいたことを活かしてどう言語に落とし込んでいいのかわかりませんでした。

    ・今「$cat = ‘novel’;」とある部分には変数を指定する必要がある
    ・echo ‘部分は<?php get_the_time(‘Y/n/j H:i:j’); ?>のように書き改める

    とりあえず2時間考え込んで下記に落とし込みましたが、
    当然滅茶苦茶なので全く動きません……。
    ※cat部分の変数はとりあえず「$taginfo」にしておきました。

    <?php
         $alltags = get_terms('cat,novel,story');
         foreach($alltags as $taginfo):     //取得したタグをその都度、変数$taginfoに代入する
    ?>
    <?php
    $myposts = get_posts('numberposts=' .$num. '&category_name=' .$taginfo);
    if ($myposts) {
    echo 'Category: ' .get_the_category_by_ID($term_id). '';
    foreach($myposts as $post):
    setup_postdata($post);
    echo '<div class="postlist-category">';
    if ( has_post_thumbnail() ) {
    echo ''.get_the_post_thumbnail($page->ID, 'thumbnail'). '';
    } else {
    echo '<i class="ico-camera-alt"></i>';
    }
    echo '</div><div class="postlist-category-inner">';
    <?php get_the_time('Y/n/j H:i:j'); ?>
    <?php the_title("","",false); ?>
    <?php mb_substr( strip_tags( $post -> post_content ), 0, 32 ); ?>
    </div>';
    endforeach;
    echo '<p>カテゴリの一覧 ≫</p>';
    } else {
    echo '<p>記事がありません。</p>';
    }
    ?>

    まずはphpの基礎知識から勉強しなくてはならないことは重々承知しているのですが、
    現在htmlやcssまわりから勉強をはじめているため、
    まだphpの知識に勉強の手が回っていない状況です。
    もしでしたらもう少し具体的にご教示いただけますととてもうれしいです。

    本当に申し訳ございませんが、どうぞよろしくお願いいたします。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    ・今「$cat = ‘novel’;」とある部分には変数を指定する必要がある

    うーん、ちょっと違いますね。
    × get_terms('cat,novel,story');

    get_terms('category');

    get_termsには、「カテゴリーなのか/タグなのか/カスタムタクソノミーなのか」という「タクソノミー名(スラッグ)」を指定します。
    実際にカテゴリーとして登録されている「ノベル ストーリー コミック」などではありません。

    ×get_posts('numberposts=' .$num. '&category_name=' .$taginfo);

    get_posts( array( //以下の条件の投稿を取り出す
                   'category_name' => $taginfo->slug //カテゴリースラッグを取り出す
                   'posts_per_page' => 5 //ここに表示したい記事数を指定
              ));

    get_postsの引数の指定の仕方が違います。
    get_postsの使い方はこちらも参考にしてください。
    http://mypacecreator.net/blog/archives/1981

    ・echo ‘部分は<?php get_the_time(‘Y/n/j H:i:j’); ?>のように書き改める

    ここも違いますね。getなしの<?php the_time(‘Y/n/j H:i:j’); ?>でないと表示できません。

    一旦ご自身が最初に書いたコードは置いておいて、もう一度最初から1行1行意味を考えながら書いていったほうが分かりやすいと思いますよ。
    多分コピペ元のコード自体がややこしいというか高難易度というか、ちょっと古い書き方の部分もあるので、今回はあまり参考にしないほうが良いと思います。

    参考
    関数リファレンス/get terms – WordPress Codex 日本語版
    テンプレートタグ/get posts – WordPress Codex 日本語版

    トピック投稿者 linamia

    (@linamia)

    >mypacecreatorさま

    お世話になっております、ご返信ありがとうございました。

    いろいろ細かくご教示いただきましてありがとうございます。
    ただ現状だと全く知識がない状態でコードを書き起こすのは厳しいので、
    phpの勉強をしてから改めて実装を考えたいと思い、
    今回はリニューアルを見送るなり、同じコードをカテゴリー分張り込むなりで
    対応したいと思います。せっかくですのに申し訳ございません。

    また時期が来ましたら参考にさせていただきながら実装に
    挑戦してみたいと思います。

    どうぞよろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「各カテゴリーの、それぞれの新着記事一覧をTOPページに表示したい」には新たに返信することはできません。