web-dev-qa-db-ja.com

Wp_get_archive用の複数のフィルタ

カスタム投稿アーカイブをページに次の形式で表示する必要があります。

  • 毎月 - 当年の月ごとにグループ化されています。
  • 毎年 - 前年すべての年および月ごとにグループ化されています

それで、私は2つの関数を持っています。それらは連続して呼ばれることになっていました:

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

それから私はそれをフィルタリングする必要がありますので、最初の関数は現在の年のアーカイブのみを表示し、2番目の関数は現在の年を表示しません。

これが可能であった方法:

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

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

そして年間アーカイブのために" AND YEAR(post_date) = YEAR (CURRENT_DATE)" with " AND YEAR(post_date) < YEAR (CURRENT_DATE)"を置き換えます

ただし、フィルタはグローバルに適用され、適用すると両方のフィルタに影響します。

これを回避する方法(特定のwp_get_archives呼び出しに特定のフィルタを適用する)または上記のようにアーカイブ出力を達成する別の方法はありますか?

1
Igor Skoldin

カスタムパラメータを使用します。wpse__current_yearと呼びます。これは、trueは現在の年を含みます)およびfalseは現在の年を除外します) 。それを組み込むことができます

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

それに応じてフィルタを修正することができます

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