Skip to content

Instantly share code, notes, and snippets.

@Jakobuz
Last active April 21, 2022 05:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jakobuz/017dcca449255d62bef9155102964b3a to your computer and use it in GitHub Desktop.
Save Jakobuz/017dcca449255d62bef9155102964b3a to your computer and use it in GitHub Desktop.
Wordpress | Filter the function wp_get_archives() so a category_id can be added
/*
* Filter the wp_get_archives() so a cat_id can be added
* Example: wp_get_cat_archives('type=monthly&format=option&show_post_count=1', 46);
* in this case '46' = the category id
*/
add_filter('getarchives_where', 'custom_archives_where', 10, 2);
add_filter('getarchives_join', 'custom_archives_join', 10, 2);
function custom_archives_join($x, $r) {
global $wpdb;
// $cat_ID = $r['cat'];
$cat_ID = isset($r['cat']) ? $r['cat'] : ''; // prevents 'Notice: Undefined index: cat
if (isset($cat_ID)) {
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)";
} else {
return $x;
}
}
function custom_archives_where($x, $r) {
global $wpdb;
// $cat_ID = $r['cat'];
$cat_ID = isset($r['cat']) ? $r['cat'] : ''; // prevents 'Notice: Undefined index: cat
if (isset($cat_ID)) {
return $x . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id IN ($cat_ID)";
} else {
$x;
}
}
function wp_get_cat_archives($opts, $cat) {
$args = wp_parse_args($opts, array('echo' => '1')); // default echo is 1.
$echo = $args['echo'] != '0'; // remember the original echo flag.
$args['echo'] = 0;
$args['cat'] = $cat;
$tag = ($args['format'] === 'option') ? 'option' : 'li';
$archives = wp_get_archives(build_query($args));
$archs = explode('</'.$tag.'>', $archives);
$links = array();
foreach ($archs as $archive) {
$link = preg_replace("/='([^']+)'/", "='$1?cat={$cat}'", $archive);
array_push($links, $link);
}
$result = implode('</'.$tag.'>', $links);
if ($echo) {
echo $result;
} else {
return $result;
}
}
@Alfredst
Copy link

Hello, why is this not working now? Please tell me how to fix?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment