从wp_get_archives中排除类别?

时间:2010-05-07 14:19:52

标签: wordpress categories archive

有没有办法从wp_get_archives中排除某个类别?我试图在侧边栏中显示月份,但我想排除不是博客条目的帖子。

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

9 个答案:

答案 0 :(得分:5)

如果您想在主题目录的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;

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

}

答案 1 :(得分:2)

您可以在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)";

}

答案 2 :(得分:1)

在一个项目中遇到这个问题,但从未在网上找到解决方案 - 我的不是最漂亮的PHP,但它确实可以解决问题。

这是Katie建议的过滤器的一个游戏,我也在几个支持论坛中遇到过。这包含在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作为实际自定义分类的名称。

自定义分类中的所有术语ID都以字符串形式捕获;其余的操作与原始功能相同 - 只有自定义分类中的类别列表包含在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' );
?>

答案 3 :(得分:0)

wp_get_archives()没有基于类别排除的机制 - 它纯粹用于基于时间的档案(年度,月度,每日,每周)或“每个帖子”档案:postbypost或post by post by order by帖子标题。

答案 4 :(得分:0)

使用类别档案有多种方法:WordPress › Support » Limit archives to category / date archives for category

我使用Clean Archives Reloaded WordPress › Clean Archives Reloaded « WordPress Plugins并排除第200行附近的类别:

// Get a simple array of all posts
$rawposts = get_posts( 'numberposts=-1&category=-4,-6,-7,-9' );

答案 5 :(得分:0)

您可能希望查看get_categories并倾向于自己的自定义解决方案。虽然这可能会花费你更多的时间和工作;你的确会得到完全控制你想要实现的目标的结果。

答案 6 :(得分:0)

您可以在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
?>

然后将其上传到您的插件目录并激活它。

答案 7 :(得分:0)

将代码放在下面 这段代码已经为我工作了:))

<?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();}
?>

答案 8 :(得分:0)

没有正式的方法可以做到这一点。但我尝试并测试了很多代码块,只有这个对我有效。

    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替换为您的帖子类别的原始ID,代码将有效。