Исключить категорию из wp_get_archives? - PullRequest
3 голосов
/ 07 мая 2010

Есть ли способ исключить категорию из wp_get_archives? Я пытаюсь показать месяцы на боковой панели, но хочу исключить сообщения, которые не являются записями в блоге.

$catID = get_cat_id('Projects');
$variable = wp_get_archives('type=monthly&show_post_count=1);
echo $variable;

Ответы [ 9 ]

5 голосов
/ 12 мая 2011

Используйте это, если вы хотите включить только определенные категории для функции wp_get_archive в ваши functions.php директории вашей темы

add_filter( 'getarchives_where', 'customarchives_where' );
add_filter( 'getarchives_join', 'customarchives_join' );

function customarchives_join( $x ) {

    global $wpdb;

    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";

}

function customarchives_where( $x ) {

    global $wpdb;

    $includes= '14'; // category id to include
    return $x . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id = '$includes'";

}
2 голосов
/ 10 мая 2011

Вы можете написать фильтр в вашем файле functions.php, который изменит поведение функции wp_get_archive по умолчанию.

add_filter( 'getarchives_where', 'customarchives_where' );
add_filter( 'getarchives_join', 'customarchives_join' );

function customarchives_join( $x ) {

    global $wpdb;

    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";

}

function customarchives_where( $x ) {

    global $wpdb;

    $exclude = '1'; // category id to exclude

    return $x . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id NOT IN ($exclude)";

}
1 голос
/ 11 июля 2012

Столкнулся с этой проблемой в проекте, но так и не нашел решения в Интернете - у меня не самый красивый PHP, но он делает свое дело.

Это игра фильтра, предложенного Кэти, с которой я также столкнулся на нескольких форумах поддержки. Это идет в вашем functions.php:

add_filter( 'getarchives_where', 'customarchives_where' );
add_filter( 'getarchives_join', 'customarchives_join' );

function customarchives_join( $x ) {

    global $wpdb;

    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
    INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";

}

function customarchives_where( $x ) {

    global $wpdb;

    $categories = get_terms( 'taxonomy-name', 'orderby=id' );
    $includeIds;
    $i = 0;
    foreach($categories as $category) {
        if($i != 0) $includeIds .= ',';
        $includeIds .= $category->term_id;
        $i++;
    } 


    return $x . " AND $wpdb->term_taxonomy.taxonomy = 'taxonomy-name' 
    AND $wpdb->term_taxonomy.term_id IN ($includeIds)";

}

Во второй функции поменяйте taxonomy-name на название вашей действительной пользовательской таксономии.

Все идентификаторы терминов в вашей пользовательской таксономии записаны в строку; остальное работает так же, как и в исходной функции - в список wp_get_archives() включен только тот список категорий из вашей пользовательской таксономии. Вы также можете настроить код, чтобы исключить их (первый пример выше).

Если вы хотите, чтобы это делал только один экземпляр списка wp_get_archives(), просто пропустите две верхние строки кода в functions.php, которые применяют фильтры. Затем, когда вы используете тег wp_get_archives(), примените фильтры перед ним, а затем удалите их:

<?php   
add_filter( 'getarchives_where', 'customarchives_where' );
    add_filter( 'getarchives_join', 'customarchives_join' );

    wp_get_archives(); 

    remove_filter( 'getarchives_where', 'customarchives_where' );
    remove_filter( 'getarchives_join', 'customarchives_join' );
?>
0 голосов
/ 03 августа 2017

Нет официального способа сделать это.Но я попробовал и протестировал много блоков кода, и только этот работал для меня.

    add_filter( 'getarchives_where', 'customarchives_where' );
add_filter( 'getarchives_join', 'customarchives_join' );

function customarchives_join( $x ) {
    global $wpdb;
    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
}

function customarchives_where( $x ) {
    global $wpdb;
    $include = 'your_category_id'; // category id to include
    return $x . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id IN ($include)";
}

Замените your_category_id на оригинальный идентификатор вашей категории постов, и код будет работать.

0 голосов
/ 03 июня 2012

Поместите код ниже сразу после Этот код уже работает для меня:)

<?php
if ( $wp_query->is_archive ){
$wp_query->query_vars["cat"] = 14; // only the category that you want to inlcude
$wp_query->query_vars["posts_per_page"] = 10; // for number of posts you want
$wp_query->get_posts();}
?>
0 голосов
/ 22 мая 2010

Можете ли вы использовать вместо этого фильтр pre_get_posts?

Я знаю, что что-то подобное работает для is_author, is_home и is_feed ...

function exclude_stuff($query) { 
    if ( $query->is_author) {
        $query->set('cat', '-4, -142');
    }
    return $query;
}

add_filter('pre_get_posts', 'exclude_stuff');

зависит от того, можете ли вы сделатьэто для чего-то вроде is_archive или is_monthly

Вы бы поместили это в php-файл с заголовком плагина:

<?php
/*
 * Plugin Name: exclude some stuff
 * Description: blah
 * Author: blah
 * Plugin URI: blah
 * Version: 0.9
 * =======================================================================
*/
   Put the function here
?>

Затем загрузите его в каталог плагинов и активируйте.

0 голосов
/ 07 мая 2010

Возможно, вы захотите заглянуть в get_categories и обратиться к собственному индивидуальному решению. Хотя это может стоить вам немного больше времени и работы; вы действительно получите полный контроль над тем, чего пытаетесь достичь.

0 голосов
/ 07 мая 2010

Существуют различные способы работы с архивами категорий: WordPress ›Поддержка» Ограничение архивов архивами категорий / дат для категории

Я использую Clean Archloaded Reloaded WordPress ›Clean ArchivesПерезагружаем «Плагины WordPress и исключаем категории вокруг строки 200:

// Get a simple array of all posts
$rawposts = get_posts( 'numberposts=-1&category=-4,-6,-7,-9' );
0 голосов
/ 07 мая 2010

wp_get_archives() не имеет механизма исключения по категориям - он предназначен только для временных архивов (годовой, ежемесячный, ежедневный, еженедельный) или для архивов «каждый пост»: пост-пост или пост по почте заказано по названию.

...