• 解決済 chatm

    (@chatm)


    wordpress6.8.1 でオリジナルテーマでサイトを作成しています。
    特定のカテゴリーのサイドバーに月別アーカイブ(ドロップダウン)で設置しましたが、特定のカテゴリーだけ表示させたいのですが、うまくいきません。
    いろいろなサイトを見て、function.phpに表示させたくないカテゴリーIDを除外するコードを記入しても除外されず全部の記事が収納されてドロップダウンリストとして表示されてしまいます。

    サイドバーのドロップダウンの記述

    <div class="archive">

    <h3>月別アーカイブ</h3>
    <select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
    <option disabled selected value>選択してください</option>
    <?php wp_get_archives( 'type=monthly&format=option&post_type=post&show_post_count=1' ); ?>
    </select>

    </div><!-- /archive -->

    function.php ドロップダウンの記述

    // カテゴリの投稿数をaタグの中に(月別アーカイブ)
    add_filter( 'get_archives_link', 'my_archives_link' );
    function my_archives_link( $output ) {
    $output = preg_replace('/<\/a>\s*(&nbsp;)\((\d+)\)/','($2)</a>',$output);
    return $output;
    }

    教えて頂けると助かります。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック投稿者 chatm

    (@chatm)

    すみません、自己解決しました。カテゴリーを絞れるコードをsidebar.phpとfunction.phpの両方に設定して、月別アーカイブに特定のカテゴリーだけ表示させることができました。
    サイドバーはドロップダウンの表示、投稿件数()表示「’show_post_count’ => 1,」付きの設定です。
    ●はカテゴリーIDの番号(数字)blogはこの場合のカテゴリースラッグです。
    sidebar.php

    <div class="archive">

    <h3>月別アーカイブ</h3>

    <select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
    <option disabled selected value>選択してください</option>
    <?php wp_get_archives(array(
    'type' => 'monthly',
    'format' => 'option',
    'show_post_count' => 1,
    'category' => ● // blogカテゴリーのみ
    )); ?>
    </select>

    </div><!-- /archive -->

    function.php に下記を記述しました。
    ●はカテゴリーIDの番号、blogはこの場合のカテゴリースラッグです。
    お使いの場合は皆様が設定されたカテゴリー名を入れて下さい。もっと素敵なコードがあるのでしょうが、私の場合は、カテゴリースラッグとカテゴリーID番号の2つをfunction.phpに記載しないと、カテゴリーで絞りこみできませんでした。

    //特定カテゴリー月別アーカイブ(blogカテゴリーのスラッグblogのみ表示)
    function custom_get_archives_where($where, $args) {
    global $wpdb;
    $where .= $wpdb->prepare(" AND ID IN (SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = (SELECT term_id FROM {$wpdb->terms} WHERE slug = %s))", 'blog');
    return $where;
    }
    add_filter('getarchives_where', 'custom_get_archives_where', 10, 2);

    //特定カテゴリー月別アーカイブ(blogカテゴリーID=●のみ表示)
    function filter_blog_archives($query) {
    if ($query->is_main_query() && !is_admin() && is_archive()) {
    $query->set('category__in', array(●)); // blogカテゴリーのみ表示
    }
    }
    add_action('pre_get_posts', 'filter_blog_archives');
    トピック投稿者 chatm

    (@chatm)

    解決したと思ったのですが、他のカテゴリーのトップページの一覧まで絞り込んでしまって、他のカテゴリーのアーカイブ一覧が表示されなくなってしまいました。
    なので、AIと検討しながら作った下記のコードが完成形になります。
    (文字化け防止コードの指定もあり)
    ●はカテゴリーIDの番号、blogはこの場合のカテゴリースラッグです。
    ドロップダウンで月別アーカイブの投稿数()も取得する

    ‘limit’ => 24, // 2年間分の月別アーカイブを取得
    ‘limit’ => ”, // 空にすると、全期間のアーカイブが表示される

    sidebar.php

    <div class="archive">
    <h3>月別アーカイブ</h3>

    <select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
    <option disabled selected value>選択してください</option>
    <?php
    $archives = wp_get_archives(array(
    'type' => 'monthly',
    'limit' => 12,
    'echo' => false,
    'format' => 'custom'
    ));

    $dom = new DOMDocument();
    @$dom->loadHTML(mb_convert_encoding($archives, 'HTML-ENTITIES', 'UTF-8')); // UTF-8に変換して解析
    foreach ($dom->getElementsByTagName('a') as $link) {
    $url = $link->getAttribute('href');
    $filtered_url = add_query_arg('cat', ●, $url);

    // 年・月を取得
    preg_match('/(\d{4})\/(\d{2})/', $url, $matches);
    if (!empty($matches)) {
    $year = intval($matches[1]);
    $month = intval($matches[2]);

    // blogカテゴリーの投稿数を取得
    $args = array(
    'category__in' => array(●),
    'year' => $year,
    'monthnum' => $month,
    'posts_per_page' => -1,
    );
    $posts = get_posts($args);
    $post_count = count($posts);
    } else {
    $post_count = 0; // デフォルトで0を設定
    }

    echo '<option value="' . esc_url($filtered_url) . '">' . htmlspecialchars($link->nodeValue, ENT_QUOTES, 'UTF-8') . ' (' . $post_count . ')</option>';
    }
    ?>
    </select>
    </div><!-- /archive -->

    ↓投稿数なしの場合

    <div class="archive">
    <h3>月別アーカイブ</h3>

    <select name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
    <option disabled selected value>選択してください</option>
    <?php
    $archives = wp_get_archives(array(
    'type' => 'monthly',
    'limit' => 12,
    'echo' => false,
    'format' => 'custom'
    ));

    $dom = new DOMDocument();
    @$dom->loadHTML(mb_convert_encoding($archives, 'HTML-ENTITIES', 'UTF-8')); // UTF-8に変換して解析
    foreach ($dom->getElementsByTagName('a') as $link) {
    $url = $link->getAttribute('href');
    $filtered_url = add_query_arg('cat', ●, $url);
    echo '<option value="' . esc_url($filtered_url) . '">' . htmlspecialchars($link->nodeValue, ENT_QUOTES, 'UTF-8') . '</option>';
    }
    ?>
    </select>
    </div><!-- /archive -->

    function.php の記述 他のカテゴリーのアーカイブに影響をあたえない設定

    //特定カテゴリー月別アーカイブ(blogカテゴリーのスラッグblogのみ表示)
    function filter_blog_archives($query) {
    if ($query->is_main_query() && !is_admin() && is_archive()) {
    // 特定のカテゴリースラッグ(blog)の場合のみ絞り込み
    if (is_category('blog')) {
    $query->set('category__in', array(●));
    }
    }
    }
    add_action('pre_get_posts', 'filter_blog_archives');
2件の返信を表示中 - 1 - 2件目 (全2件中)

トピック「特定カテゴリーの月別アーカイブ」には新たに返信することはできません。