サポート » 使い方全般 » 複数のカテゴリーに属する記事に同名のカテゴリー別リンクを表示したい

  • 解決済 developer

    (@6flat)


    リンクカテゴリーと投稿のカテゴリーを連動させる形でリンクをシングルページに表示したいです。
    イメージとしては以下の様な形です。

    リンクの設定
    リンクカテゴリーA
    ・リンク1
    ・リンク2
    リンクカテゴリーB
    ・リンク3
    ・リンク4
    投稿記事α
    カテゴリー : カテゴリーA
    
    本文
    
    ・リンク1
    ・リンク2
    投稿記事β
    カテゴリー : カテゴリーA,カテゴリーB
    
    本文
    
    ・リンク1
    ・リンク2
    ・リンク3
    ・リンク4

    当初は以下のトピックに書き込んでいる様にwp_list_bookmarksのcategory_nameを用いて実現させようとしていたのですが、私の勘違いで元より実現出来るものではありませんでした。
    http://ja.forums.wordpress.org/topic/13755

    category_nameに複数指定を可能にする方法があればベストなのですが、予めストックしておいたアイテム(リンク)をカテゴリーに連動する形で記事に表示する事が出来るのならリンク以外の方法でも構いません。

    何か良い方法がありましたらお知恵を拝借させて下さい。
    よろしくお願い致します。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • 「カテゴリー(category)とリンクカテゴリー(link_category)は同じ名前である」というのが前提です。

    <?php
    $categories = get_the_category();
    $category_names = array();
    foreach($categories as $category) :
        $category_names[] =  $category->cat_name;
    endforeach;
    
    echo "<ul>";
    foreach ($category_names as $link_cat_name) :
        $links = get_bookmarks('category_name='.$link_cat_name);
        foreach ($links as $link) :
    ?>
            <li><a href="<?php echo esc_url($link->link_url); ?>" target="<?php echo esc_attr($link->link_target); ?>"><?php echo esc_html($link->link_name); ?></a></li>
    <?php
        endforeach;
    endforeach;
    echo "</ul>";
    ?>

    トピック投稿者 developer

    (@6flat)

    ご回答ありがとうございます。

    提示して頂いたコードを試みてみましたが、get_bookmarksのパラメータ「limit」で、例えば10件まで表示とした時に、カテゴリーAとカテゴリーBのリンクをそれぞれ10件ずつの合計20件が表示されるいう結果になりました。

    これを、記事が属するカテゴリーがいくつであっても「limit」で指定した件数分だけが表示され、尚且つのリンクもカテゴリーが複合した形で表示される様にしたいのですが、何か良い方法はありませんでしょうか。
    カテゴリーが複合したリストなので、例えばorderby=randとした時は以下の様な表示になるのが理想です。

    投稿記事
    カテゴリー : カテゴリーA,カテゴリーB
    
    本文
    
    リンク1
    リンク3
    リンク2
    リンク4
    カテゴリーが複合した形

    ゴチャマゼということですか?
    また、limit で制限せずに全部表示した場合、ひとつのポストで最大どれくらいのリンク数になるのでしょうか?

    リンク数がべらぼうに多くないとすると、

    <?php
    $limit = 10;
    $all_links = array();
    $categories = get_the_category();
    foreach($categories as $category) :
        $links = get_bookmarks('category_name='.$category->cat_name);
        $all_links = array_merge($all_links,$links);
    endforeach;
    
    if ($all_links) :
        shuffle($all_links);
        $n = 0;
        echo '<ul>';
        foreach ($all_links as $link) :
            if ($n == $limit) break;
    ?>
            <li><a href="<?php echo esc_url($link->link_url); ?>" target="<?php echo esc_attr($link->link_target); ?>"><?php echo esc_html($link->link_name); ?></a></li>
    <?php
            $n++;
        endforeach;
        echo '</ul>';
    endif;
    ?>

    トピック投稿者 developer

    (@6flat)

    提示して頂いたコードを試みた結果、当初思い描いていた通りの結果を得る事が出来ました。
    ちなみに、ひとつのポストで表示させる予定のリンク数は12です。
    説明下手といいますか、言葉足らずな部分を上手に形にして頂いて本当に感謝しています。

    そして、ここで欲を出す様で申し訳ないのですが、よろしければもう一つだけお付き合い頂けないでしょうか。

    内容としてはほぼ同じなのですが、リンクをカテゴリーの数に応じて均等に出したいというものです。
    提示して頂いたコードから表示のランダム化をshuffleで行うのを止めてget_bookmarksにorderby=randを加え、更に “$limit = 数値;” の部分で指定している数値をカテゴリーの数で割って四捨五入し、その値をget_bookmarksの “limit=値” に代入するという様な事は出来ますでしょうか?

    出力される結果のイメージとしては、表示上限を10としていた場合に以下の様になります。

    記事に属するカテゴリーが1つの場合

    カテゴリーAからランダムに取り出されたリンク2
    カテゴリーAからランダムに取り出されたリンク6
    カテゴリーAからランダムに取り出されたリンク9
    カテゴリーAからランダムに取り出されたリンク11
    カテゴリーAからランダムに取り出されたリンク3
    カテゴリーAからランダムに取り出されたリンク1
    カテゴリーAからランダムに取り出されたリンク23
    カテゴリーAからランダムに取り出されたリンク7
    カテゴリーAからランダムに取り出されたリンク14
    カテゴリーAからランダムに取り出されたリンク8

    記事に属するカテゴリーが2つの場合

    カテゴリーAからランダムに取り出されたリンク2
    カテゴリーAからランダムに取り出されたリンク6
    カテゴリーAからランダムに取り出されたリンク9
    カテゴリーAからランダムに取り出されたリンク11
    カテゴリーAからランダムに取り出されたリンク3
    カテゴリーBからランダムに取り出されたリンクIII
    カテゴリーBからランダムに取り出されたリンクIV
    カテゴリーBからランダムに取り出されたリンクXI
    カテゴリーBからランダムに取り出されたリンクI
    カテゴリーBからランダムに取り出されたリンクXV

    記事に属するカテゴリーが3つの場合

    カテゴリーAからランダムに取り出されたリンク2
    カテゴリーAからランダムに取り出されたリンク6
    カテゴリーAからランダムに取り出されたリンク9
    カテゴリーBからランダムに取り出されたリンクIII
    カテゴリーBからランダムに取り出されたリンクIV
    カテゴリーBからランダムに取り出されたリンクXI
    カテゴリーCからランダムに取り出されたリンクβ
    カテゴリーCからランダムに取り出されたリンクΩ
    カテゴリーCからランダムに取り出されたリンクν

    尚、カテゴリーの数によってはリンクの合計数が若干前後する事については無視して頂いて構わないです。
    説明下手で申し訳ないのですが、どうかよろしくお願い致します。

    カテゴリーの数は、

    $cat_num = count($categories);

    で取得できますので、ご自分でチャレンジしみて下さい。

    トピック投稿者 developer

    (@6flat)

    わーい!できました!
    PHPへの理解もほんの少しかもしれませんが深める事ができました!
    最後までお付き合い頂いて本当にありがとうございました!

    ちなみに最終的なコードはこうなりました。

    <?php
    $limit = 10;
    $all_links = array();
    $categories = get_the_category();
    $cat_num = count($categories);
    $cat_limit = round($limit/$cat_num);
    foreach($categories as $category) :
        $links = get_bookmarks('orderby=rand&limit='.$cat_limit.'&category_name='.$category->cat_name);
        $all_links = array_merge($all_links,$links);
    endforeach;
    
    if ($all_links) :
        $n = 0;
        echo "<ul>\n";
        foreach ($all_links as $link) :
            if ($n == $limit) break;
    ?>
            <li><a href="<?php echo esc_url($link->link_url); ?>" target="<?php echo esc_attr($link->link_target); ?>"><?php echo esc_html($link->link_name); ?></a><?php if ($link->link_description) echo "<br />$link->link_description"; ?></li>
    <?php
            $n++;
        endforeach;
        echo '</ul>';
    endif;
    ?>

    若干問題があります。
    1) カテゴリーが付いていないとき、0 で割り算をしてしまいます。
    2) リンクの数は get_bookmarks() で制限しているので、下のループで行っている制限は不要になります。

    <?php
    $limit = 10;
    $all_links = array();
    $categories = get_the_category();
    $cat_num = count($categories);
    if ($cat_num!=0) :
        $cat_limit = round($limit/$cat_num);
        foreach($categories as $category) :
            $links = get_bookmarks('orderby=rand&limit='.$cat_limit.'&category_name='.$category->cat_name);
            $all_links = array_merge($all_links,$links);
        endforeach;
    
        if ($all_links) :
            echo "<ul>\n";
            foreach ($all_links as $link) :
    ?>
                <li><a href="<?php echo esc_url($link->link_url); ?>" target="<?php echo esc_attr($link->link_target); ?>"><?php echo esc_html($link->link_name); ?></a><?php if ($link->link_description) echo "<br />$link->link_description"; ?></li>
    <?php
            endforeach;
            echo '</ul>';
        endif;
    endif;
    ?>

    トピック投稿者 developer

    (@6flat)

    手直しまでして頂いて感激です!

    まだなんとなく程度にしか分からないので、マニュアルとコードを見比べながらそれぞれ理解していこうと思います。

    重ねてのお礼になりますが、ありがとうございました!

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「複数のカテゴリーに属する記事に同名のカテゴリー別リンクを表示したい」には新たに返信することはできません。