web-dev-qa-db-fra.com

Plusieurs filtres pour wp_get_archive

J'ai besoin d'afficher des archives d'articles personnalisées sur une page au format suivant:

  • Mensuel - Groupé par mois pour l'année en cours.
  • Annuellement - Groupé par année et par mois pour toutes les années précédentes

J'ai donc deux fonctions à faire, qui sont censées être appelées à la suite:

function show_monthly_archive( $post_type ) {
    $current_year_args = array(
        'type'            => 'monthly',
        'limit'           => '12',
        'format'          => 'html',
        'before'          => '',
        'after'           => '',
        'show_post_count' => false,
        'echo'            => 1,
        'order'           => 'DESC',
        'post_type'       => $post_type
    );

    echo '<ul>';
        wp_get_archives( $current_year_args );
    echo '</ul>';
}

function show_yearly_archive( $post_type ) {
    $previous_years_args = array(
        'type'            => 'yearly',
        'limit'           => '',
        'format'          => 'html',
        'before'          => '',
        'after'           => '',
        'show_post_count' => false,
        'echo'            => 1,
        'order'           => 'DESC',
        'post_type'       => $post_type
    );

    echo '<ul>';
        wp_get_archives( $previous_years_args );
    echo '</ul>';
}

Ensuite, je dois le filtrer de sorte que la première fonction n’affiche que les archives de l’année en cours et que la seconde n’affiche pas l’année en cours.

La façon dont cela aurait pu être fait:

add_filter( 'getarchives_where', 'filter_monthly_archives', 10, 2 );

function filter_monthly_archives($text, $r) {
    return $text . " AND YEAR(post_date) = YEAR (CURRENT_DATE)";
}

Et pour les archives annuelles, nous remplaçons " AND YEAR(post_date) = YEAR (CURRENT_DATE)" with " AND YEAR(post_date) < YEAR (CURRENT_DATE)"

Cependant, le filtre s'applique globalement et, lorsque je l'applique, il affecte les deux filtres.

Existe-t-il un moyen de contourner ce problème (appliquer un filtre spécifique pour un appel wp_get_archives spécifique) ou un autre moyen d'obtenir la sortie des archives comme décrit ci-dessus?

1
Igor Skoldin

Utiliser un paramètre personnalisé, appelons-le wpse__current_year, qui acceptera deux valeurs, true ( inclut l’année en cours ) et false ( exclut l'année en cours ). Permet d'intégrer cela

function show_monthly_archive( $post_type ) 
{
    $current_year_args = array(
        'type'               => 'monthly',
        'limit'              => '12',
        'format'             => 'html',
        'before'             => '',
        'after'              => '',
        'show_post_count'    => false,
        'echo'               => 1,
        'order'              => 'DESC',
        'post_type'          => $post_type,
        'wpse__current_year' => true
    );

    echo '<ul>';
        wp_get_archives( $current_year_args );
    echo '</ul>';
}

function show_yearly_archive( $post_type ) 
{
    $previous_years_args = array(
        'type'               => 'yearly',
        'limit'              => '',
        'format'             => 'html',
        'before'             => '',
        'after'              => '',
        'show_post_count'    => false,
        'echo'               => 1,
        'order'              => 'DESC',
        'post_type'          => $post_type,
        'wpse__current_year' => false
    );

    echo '<ul>';
        wp_get_archives( $previous_years_args );
    echo '</ul>';
}

Nous pouvons maintenant modifier notre filtre en conséquence

add_filter( 'getarchives_where', 'filter_monthly_archives', 10, 2 );

function filter_monthly_archives( $text, $r ) 
{
    // Check if our custom parameter is set, if not, bail early
    if ( !isset( $r['wpse__current_year'] ) )
        return $text;

    // If wpse__current_year is set to true
    if ( true === $r['wpse__current_year'] )
        return $text . " AND YEAR(post_date) = YEAR (CURRENT_DATE)";

    // If wpse__current_year is set to false
    if ( false === $r['wpse__current_year'] )
        return $text . " AND YEAR(post_date) < YEAR (CURRENT_DATE)";

    return $text;
}
2
Pieter Goosen