web-dev-qa-db-ja.com

Get_categoriesを使用してカテゴリの画像を表示する、または任意の子投稿からの画像を表示する

私はget_categoriesを使って親カテゴリの子カテゴリをリストしています。

Get_categories出力を使って、子カテゴリに画像を追加したいです。

  • 私は、get_categoriesを使用しているカテゴリの子である、[IE] _、親カテゴリの孫という、任意の投稿から、おすすめの画像を取得することができます。私は他の壮大な子供の情報を見せたくありません、そしてカテゴリの子供たちの各セットからただ一つの特色にされたイメージがほしいと思います。

私が現在使っているコードは

$args = array('child_of'  => 1  );
$categories = get_categories($args);
  foreach($categories as $category) { 
    echo '<p>Category:'. $category->name.' </p> ';
    echo '<p> Description:'. $category->description . '</p>';
    echo PUT CAT IMAGE HERE;
     } 
  • あるいは、プラグインを使ってカテゴリに画像を追加し、それをforeach($categories as $category)の出力に表示することもできます。

しかし、これを実装するための最善の(そして最も簡単な)方法は何ですか?

3
Jon

これはget_termsのフィルタで可能です。

function grab_child_image($terms,$taxonomies,$args) {
  // var_dump($terms,$taxonomies,$args); // debug
  foreach ($terms as &$term) {
    $cp = new WP_Query(
      array (
        'cat' => $term->term_id,
        'fields' => 'ids',
        'ignore_sticky_posts' => true
      )
    );
    // var_dump($cp->posts); // debug
    if ($cp->have_posts()) {
      $attach = new WP_Query(
        array (
          'post_parent__in' => $cp->posts,
          'post_type' => 'attachment',
          'post_status' => 'inherit',
          'ignore_sticky_posts' => true,
          'posts_per_page' => 1
        )
      );
      if ($attach->have_posts()) {
        $term->image = wp_get_attachment_image($attach->posts[0]->ID);
      } else {
        $term->image = 'some other image';
      }
    }
  }
  return $terms;
}
add_filter('get_terms','grab_child_image',10,3);

$args = array('child_of'  => 1  );
$categories = get_categories($args);
foreach($categories as $category) { 
  echo '<p>Category:'. $category->name.' </p> ';
  echo '<p> Description:'. $category->description . '</p>';
  echo $category->image;
} 

remove_filter('get_terms','grab_child_image',10,3);

そこにいくつかのクエリがあるので、あなたがそれを必要なときだけそのフィルタを追加し、その後フィルタを削除してください。

wp_get_attachment_image()がニーズに合わない場合は、代わりに 関連する多数の画像関数 を使用できます。また、$sizeパラメータをwp_get_attachment_image()--第2パラメータに渡して、さまざまな画像サイズを取得できます。たとえば、コード行をこれに置き換えます。

$term->image = wp_get_attachment_image($attach->posts[0]->ID, $size->full);

wp_get_attachment_image_attributes--にフィルタを適用することで、wp_get_attachment_image()の出力をさらに変更できます。たとえば、クラス ここで行うように を追加することができます。

4
s_ha_dum

get_categories() を使う代わりに、 wp_list_categories() を見てみることをお勧めします。あなたはそれと同じ出力を得ることができますが、それは高度にカスタマイズ可能であるという利点があります。

カスタマイズには2つの方法があります。フィルタフック wp_list_categories - source を見てください - または Walker_Category クラスを拡張する - source を見てください。後者はあなたにカスタマイズのためのはるかに多くの可能性を与えますが、小さな変更のためにトップを越えるかもしれません。だからあなたは自分のニーズに最も合うものを評価する必要があります。

このトピックは実際にはWPSEとSOでかなりよくカバーされているので、私はあなたに参考文献の短いリストをあげるだけです。あなたがあなたのニーズについての具体的な十分な説明を与えていないことに加えて、それは少しあいまいなままです、1つはあなたが望むものを知ることができます。とにかく、以下のリソースはあなたに合った方法を選択するのを助け、さらにそれを達成できるようにするべきです。

  1. フィルタフック wp_list_categories
  2. Walker_Category class

もう1つの発言、個人的にはWalker_Categoryクラス・メソッドを拡張することをほぼ常に選択しますが、必要な変更が非常に小さい場合は注意してください。これはもちろん少し個人的な好みですが、特に再利用可能性、拡張性、そして - たとえそれが必要ではないように思われるとしても - 結局のところ - おそらくほとんどの場合さえ - あるためにいくらかの背景がありますカスタム出力を達成するためのより簡単な方法。


子カテゴリの投稿からのサムネイル:

このようにして、子カテゴリの1つに属するランダムな投稿から「カテゴリのサムネイル」を取得できます。

これがどのように行われるのかをわかりやすくするために、私はコードをコメントしました。

/**
 * wpse135208_cat_thumb_from_random_child.
 *
 * Get the thumbnail from a random post belonging to one of the child categories.
 *
 * @version 0.1
 *
 * @link https://wordpress.stackexchange.com/q/135208/22534
 *
 * @param integer $c_cat (default: '')
 * @param string/array $size (default: 'post-thumbnail')
 * @param string/array $attr (default: null)
 *
 * @return string
 */
function wpse135208_cat_thumb_from_random_child( $c_cat = '', $size = 'post-thumbnail', $attr = null ) {
    // do nothing if $c_cat is empty
    if( empty($c_cat) ) return;
    // get_terms is used because we only need ids
    $taxonomies = array(
        'category'
        );
    $args = array(
        'child_of' => $c_cat,
        'fields' => 'ids'
        );
    // returns an array of ids
    $child_cats = get_terms( $taxonomies, $args );
    // use this for debugging
    //echo '<pre>'; print_r($child_cats); echo '</pre>';

    $args = array(
        // we use numberposts instead of post_per_page,
        // because if the pre_get_posts filter is used,
        // it can make a difference in this case 
        // we only want one post
        'numberposts' => 1,
        // but we randomize this
        'orderby' => 'Rand',
        'category__in' => $child_cats,
        'fields' => 'ids',
        // make sure only posts with featured image are considered
        'meta_query' => array(
            array(
                'key' => '_thumbnail_id',
                'compare' => 'EXISTS'
            )
        )
        );
    // returns an array containing one post id
    $ct_p_id = get_posts( $args );
    // use this for debugging
    //echo '<pre>'; print_r($ct_p_id); echo '</pre>';

    // use this for debugging
    //echo '<pre>'; print_r( ( 1 /*change to 0 to show src info*/ ) ? get_the_post_thumbnail( $ct_p_id[0], $size, $attr ) : wp_get_attachment_image_src( get_post_thumbnail_id( $ct_p_id[0] ) ) ); echo '</pre>'; 
    // now we can use this to return our thumbnail
    return get_the_post_thumbnail( $ct_p_id[0], $size, $attr );
}

使い方はこんな感じ:

echo wpse135208_cat_thumb_from_random_child( '1', 'thumbnail', null );

あなたのコードでは、次のように使用してください。

$categories = get_categories($args);
foreach($categories as $category) { 
    echo wpse135208_cat_thumb_from_random_child($category->cat_ID); 
} 



プラグインによるカテゴリのサムネイル:

これには実際のカテゴリのサムネイルがあるという利点があります。

私はプラグインを与えました - Category Thumbnails - 私は簡単なテストの上のコメントで述べました。それは一般的に機能し、私はそれがあなたがあなたの答えで提案しているものより良い解決策であると感じます、それはそれがあなたがwordpressメディアライブラリを通してサムネイルを管理することを可能にします。

私はマイナーなバグを発見しました、プラグインの作者は notification で、すぐに返信したので、バグはすぐに修正されるでしょう。あなたが待つことができないなら、あなたはこのように自分でそれを直すことができます:

しかし機能は

the_category_thumbnail();

出力を生成しません。バージョン1.0.3のソースコードでは次のようになります。

function the_category_thumbnail($category_id = null, $sizes = array()) {
    print get_the_category_thumbnail($cat, $sizes);
}

私はこのように問題を解決することができました:

function the_category_thumbnail($category_id = null, $sizes = array()) {
    print get_the_category_thumbnail($category_id, $sizes);
}

それで、パラメータ/引数名を等しくすることによって。

あるいは代わりにget_the_category_thumbnail()を使うだけで、それをechoにするだけです。

echo get_the_category_thumbnail('1');

もう一つのマイナーな失望はそれが提供するプラグインと機能はあなたに生成された画像サイズで動作する可能性を与えていないということです。正しいサイズではなく、常にフルサイズである必要がないため、これはそれほど良くありません。私もそれについて作者に通知するつもりです、それで彼は彼のプラグインをさらに改良することができます。それまでの間、これは幸いなことにカスタム関数を作成することで簡単に修正できます。

/**
 * wpse135208_cat_thumb_wrapper.
 *
 * Wrapper function to have the ability to use predefined image sizes via wp_get_attachment_image().
 *
 * @version 0.1
 *
 * @link https://wordpress.stackexchange.com/q/135208/22534
 *
 * @param integer $category_id (default: null)
 * @param string/array $size (default: 'thumbnail')
 * @param boolean $icon (default: false)
 * @param string/array (default: null)
 *
 * @return string
 */
function wpse135208_cat_thumb_wrapper( $category_id = null, $size = 'thumbnail', $icon = false, $attr = null ) {
    $category_thumbnail_obj = get_the_category_data( $category_id );
    return wp_get_attachment_image( $category_thumbnail_obj->id, $size, $icon, $attr );
}

使い方はこんな感じ:

echo wpse135208_cat_thumb_wrapper( '1', 'thumbnail', false, null );

これはあなたがこれを機能させる手助けになるはずです。私が言ったように、それはあなたがメディアライブラリを通してあなたのカテゴリーサムネイルを管理することができるので好ましいです。あなたのコードでは、次のように使用してください。

$categories = get_categories($args);
foreach($categories as $category) { 
    echo wpse135208_cat_thumb_wrapper($category->cat_ID); 
} 
2
Nicolai

まあ、私は Advanced Custom Fields を使用してあなたがやりたいと思うことをどうにかして、1つのimageカスタムフィールドで新しいカスタムフィールドのセットを作成しました。そこから、場所のルールを「分類用語」>「等しい」>「カテゴリ」(またはこれを使用する分類)に設定します。

これを公開すると、画像の新しいフィールドで分類法を編集する場所が更新されます。これで、カテゴリforeachループ内でACF関数「get_field()」を使用するだけの問題になりました。 カテゴリからフィールドを取得する方法は次のとおりです

例:

<?php foreach ( $categories as $category ) {
    echo get_field('field_name_for_image', $category->taxonomy . "_" . $category->term_id);
} ?>

ACFのデフォルト設定を使用した場合、これからイメージオブジェクトである配列を取得する必要があります。そのためには、ACFから イメージフィールドタイプ を参照してください。

これをセットアップするのに5分もかかりませんでした。プラグインは無料です。それがあなたにとって迅速で簡単であることを願っています!

幸運を祈ります!

1
socki03

Wordpressにはコードがあります - http://codex.wordpress.org/Function_Reference/get_the_category

     Show Category Images
This outputs category images named after the cat_ID with the alt attribute set to cat_name. You can also use any of the other member variables instead.

<?php 
foreach((get_the_category()) as $category) { 
    echo '<img src="http://example.com/images/' . $category->cat_ID . '.jpg" alt="' . $category->cat_name . '" />'; 
} 
?>

これにより、get_categories関数内に画像を設定できます。画像は機能に合わせて設定する必要があります。そのため、$ category-> nameが使用されている場合、画像はカテゴリの名前と一致する正しいフォルダに保存されなければなりません。

0
Jon