web-dev-qa-db-fra.com

Je veux exclure la catégorie particulière dans la barre latérale

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

1
abdul

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.

2
birgire

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' );
1
Pieter Goosen

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)";
}
0
Ankit Anand