Dans ma barre latérale, je souhaite afficher la liste des archieves mois exclure la catégorie 'bannière'. Les codes ci-dessous sont essayés, mais ne fonctionnent pas pour moi.
<?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 ); ?>
J'ai ajouté ce code dans sidebar.php
Notez que vous n'avez pas besoin de echo
pour afficher le résultat, puisque echo=1
correspond aux paramètres par défaut de wp_get_archives()
.
Comme @PieterGoosen a expliqué , la fonction wp_get_archives()
ne prend pas en charge le paramètre exclude
.
Mais nous pouvons utiliser _exclude_terms
, le paramètre customde la fonction wp_get_archives()
, pour exclure les publications avec certains termes donnés.
Voici un exemple:
/**
* 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
)
);
où nous utilisons le plugin suivant pour supporter ce paramètre personnalisé:
<?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
Notez que nous utilisons ici le paramètre _exclude_terms
, juste au cas où le noyau supportera le paramètre exclude
dans le futur.
Le paramètre _exclude_terms
peut être une chaîne :
'_exclude_terms' => '21,22', // <-- Edit this to your needs!
ou un tableau :
'_exclude_terms' => array( 21, 22 ), // <-- Edit this to your needs!
Si vous souhaitez utiliser le plugin pour exclure certains termes du premier Archivewidget natif, vous pouvez l'utiliser avec:
/**
* 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;
}
ou similaire pour la liste déroulante case avec le filtre widget_archives_dropdown_args
.
J'espère que vous pourrez adapter cela à vos besoins.
Votre code ne fonctionnera pas car il n'y a pas de paramètre exclude
dans wp_get_archives()
. Voici la liste des paramètres valides et leurs valeurs par défaut
<?php $args = array(
'type' => 'monthly',
'limit' => '',
'format' => 'html',
'before' => '',
'after' => '',
'show_post_count' => false,
'echo' => 1,
'order' => 'DESC'
); ?>
Pour accomplir ce que vous voulez, vous devrez changer la requête SQL dans la fonction. Deux filtres sont fournis pour modifier la requête SQL, getarchives_where
et getarchives_join
.
Vous pouvez essayer quelque chose comme ceci ( Code original extrait de ici)
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)";
}
Vous souhaiterez probablement supprimer ces filtres lorsque vous aurez terminé, par exemple
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' );
Après avoir recherché cela pendant des heures. Ce bloc de code a fonctionné pour moi.
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)";
}