Я хочу исключить конкретную категорию в боковой панели

В моей боковой панели я хотел бы показать список архивов в списке, исключая запись категории «баннер». Ниже коды проверяются, но не работают для меня.

<?php echo wp_get_archives('type=monthly&exclude=6&limit=5'); ?> <?php echo wp_get_archives( array( 'type' => 'monthly', 'exclude' => 6,'limit' => 5) ); ?> <?php $args = array( 'type' => 'monthly', 'limit' => '', 'format' => 'html', 'before' => '', 'after' => '', 'show_post_count' => false, 'echo' => 1, 'order' => 'ASC', 'month' => -6 ); echo wp_get_archives( $args ); ?> 

Я добавил этот код в sidebar.php

Обратите внимание, что для отображения результата вам не нужно echo , так как echo=1 является настройками wp_get_archives() по умолчанию.

Как объяснил wp_get_archives() функция wp_get_archives() не поддерживает параметр exclude .

Но мы можем использовать _exclude_terms , настраиваемый параметр функции wp_get_archives() , чтобы исключить сообщения с некоторыми заданными условиями.

Вот пример:

 /** * Exclude terms from the wp_get_archives() function. */ wp_get_archives( array( 'type' => 'monthly', '_exclude_terms' => '21,22', // <-- Edit this to your needs! 'limit' => 5 ) ); 

где мы используем следующий плагин для поддержки этого настраиваемого параметра:

 <?php /** * Plugin Name: Enhance the wp_get_archive() function. * Description: Support the '_exclude_terms' parameter. * Plugin URI: https://wordpress.stackexchange.com/a/170535/26350 * Plugin Author: birgire * Version: 0.0.1 */ add_action( 'init', function() { $o = new WPSE_Archive_With_Exclude; $o->init( $GLOBALS['wpdb'] ); }); class WPSE_Archive_With_Exclude { private $db = null; public function init( wpdb $db ) { if( ( $this->db = $db ) instanceof wpdb ) add_filter( 'getarchives_where', array( $this, 'getarchives_where' ), 10, 2 ); } public function getarchives_where( $where, $r ) { if( isset( $r['_exclude_terms'] ) ) { $_exclude_terms = $r['_exclude_terms']; if( is_string( $_exclude_terms ) ) $_exclude_terms = explode( ',', $_exclude_terms ); if( is_array( $_exclude_terms ) ) $where .= $this->get_excluding_sql( $_exclude_terms ); } return $where; } private function get_excluding_sql( Array $terms ) { $terms_csv = join( ',', array_map( 'absint', $terms ) ); return " AND ( {$this->db->posts}.ID NOT IN ( SELECT object_id FROM {$this->db->term_relationships} WHERE term_taxonomy_id IN ( $terms_csv ) ) )"; } } // end class 

Обратите внимание, что здесь мы используем параметр _exclude_terms , на всякий случай, когда ядро ​​будет поддерживать параметр exclude в будущем.

Параметр _exclude_terms может быть строкой :

 '_exclude_terms' => '21,22', // <-- Edit this to your needs! 

или массив :

 '_exclude_terms' => array( 21, 22 ), // <-- Edit this to your needs! 

Если вы хотите использовать плагин для исключения некоторых терминов из первого встроенного виджета Archive , вы можете использовать его с помощью:

 /** * Exclude terms from the first Archive widget. */ add_filter( 'widget_archives_args', 'wpse_archive_exclude_terms' ); function wpse_archive_exclude_terms ( $args ) { remove_filter( current_filter(), __FUNCTION__ ); $args['_exclude_terms'] = '21,22'; // <-- Edit this to your needs! return $args; } 

или аналогичный для раскрывающегося случая с фильтром widget_archives_dropdown_args .

Надеюсь, вы сможете настроить это на свои нужды.

Ваш код не будет работать, поскольку в wp_get_archives() нет параметра wp_get_archives() . Ниже приведен список допустимых параметров и их значения по умолчанию

 <?php $args = array( 'type' => 'monthly', 'limit' => '', 'format' => 'html', 'before' => '', 'after' => '', 'show_post_count' => false, 'echo' => 1, 'order' => 'DESC' ); ?> 

Чтобы выполнить то, что вы хотите, вам нужно будет изменить SQL-запрос внутри функции. Для изменения SQL-запроса есть два фильтра: getarchives_where и getarchives_join

Вы можете попробовать что-то вроде этого ( Исходный код, взятый отсюда )

 add_filter( 'getarchives_where', 'customarchives_where' ); add_filter( 'getarchives_join', 'customarchives_join' ); function customarchives_join( $join ) { global $wpdb; return $join . " 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( $where ) { global $wpdb; $exclude = '1'; // category id to exclude return $where . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id NOT IN ($exclude)"; } 

Скорее всего, вы захотите удалить эти фильтры, когда это будет сделано, например

 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' ); 

После этого в течение нескольких часов. Этот блок кода работал для меня.

 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 = '8'; // category id to include return $x . " AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id IN ($include)"; }