source

커스텀 투고 타입의 연간/월간 아카이브

manysource 2023. 3. 26. 11:36

커스텀 투고 타입의 연간/월간 아카이브

내 워드프레스 사이트에는 커스텀 포스트 타입 "news"가 있습니다.각 투고에 메타데이터를 추가하기 위해 고급 커스텀 필드 플러그인을 사용하고 있습니다.

뉴스 항목의 배열을 아카이브로 만들고 싶다.

[2013]
    [January] => 5
[2012]
    [January] => 20
    [February] => 10
[2011]
    [April] => 30

다음 방법으로 이 작업을 수행할 수 있었습니다.

    global $wpdb;
    $news = $wpdb->get_results(
        "SELECT wp_posts.post_date, COUNT(wp_posts.ID) as count
         FROM $wpdb->posts
         WHERE
         wp_posts.post_type = 'news' AND
         wp_posts.post_status = 'publish' AND
         wp_posts.post_date <= CURDATE() AND
         wp_posts.post_date >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR)
         GROUP BY YEAR(wp_posts.post_date), MONTH(wp_posts.post_date)
         ORDER BY wp_posts.post_date DESC", 
         ARRAY_A);

    $archive = array();
    foreach ($news as $post):
        $year = date('Y', strtotime($post['post_date']));      
        $month = date('m', strtotime($post['post_date']));     
        $month_name = date('F', strtotime($post['post_date']));
        $post['url'] = 'NOT SURE ABOUT URL';
        $archive[$year][$month_name] = $post;
    endforeach;

다음을 사용하여 특정 연도 및 월에 연결할 수 있어야 합니다.http://example.com/2012/그리고.http://example.com/2012/10/.

커스텀 포스트 타입의 「news」를 사용하고 있기 때문에, 어떻게 하면 좋은지 알 수 없습니다.

필요한 작업을 수행하려면 커스텀 포스트 타입의 연도/월/etc 포스트 데이터를 캡처할 수 있도록 Wordpress 개서를 수정해야 합니다.

이 조작은, 다음의 코드로 실시할 수 있습니다.

/**
 * Custom post type date archives
 */

/**
 * Custom post type specific rewrite rules
 * @return wp_rewrite             Rewrite rules handled by Wordpress
 */
function cpt_rewrite_rules($wp_rewrite) {
    $rules = cpt_generate_date_archives('news', $wp_rewrite);
    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
    return $wp_rewrite;
}
add_action('generate_rewrite_rules', 'cpt_rewrite_rules');

/**
 * Generate date archive rewrite rules for a given custom post type
 * @param  string $cpt        slug of the custom post type
 * @return rules              returns a set of rewrite rules for Wordpress to handle
 */
function cpt_generate_date_archives($cpt, $wp_rewrite) {
    $rules = array();

    $post_type = get_post_type_object($cpt);
    $slug_archive = $post_type->has_archive;
    if ($slug_archive === false) return $rules;
    if ($slug_archive === true) {
        $slug_archive = $post_type->name;
    }

    $dates = array(
        array(
            'rule' => "([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})",
            'vars' => array('year', 'monthnum', 'day')),
        array(
            'rule' => "([0-9]{4})/([0-9]{1,2})",
            'vars' => array('year', 'monthnum')),
        array(
            'rule' => "([0-9]{4})",
            'vars' => array('year'))
        );

    foreach ($dates as $data) {
        $query = 'index.php?post_type='.$cpt;
        $rule = $slug_archive.'/'.$data['rule'];

        $i = 1;
        foreach ($data['vars'] as $var) {
            $query.= '&'.$var.'='.$wp_rewrite->preg_index($i);
            $i++;
        }

        $rules[$rule."/?$"] = $query;
        $rules[$rule."/feed/(feed|rdf|rss|rss2|atom)/?$"] = $query."&feed=".$wp_rewrite->preg_index($i);
        $rules[$rule."/(feed|rdf|rss|rss2|atom)/?$"] = $query."&feed=".$wp_rewrite->preg_index($i);
        $rules[$rule."/page/([0-9]{1,})/?$"] = $query."&paged=".$wp_rewrite->preg_index($i);
    }
    return $rules;
}

제가 하드코드 되어 있다는 걸 아시겠죠?news에의$rules = cpt_generate_date_archives('news', $wp_rewrite);코드의 일부입니다.필요에 따라 변경할 수 있습니다.

이 코드를 사용하면, http://yoursite.com/news/2013/02/ 에 액세스 해, 그 특정의 투고 타입의 아카이브 리스트를 취득할 수 있습니다.

완성도를 높이기 위해 매월 아카이브 위젯을 생성하는 방법을 포함하겠습니다.

/**
 * Get a montlhy archive list for a custom post type
 * @param  string  $cpt  Slug of the custom post type
 * @param  boolean $echo Whether to echo the output
 * @return array         Return the output as an array to be parsed on the template level
 */
function get_cpt_archives( $cpt, $echo = false )
{
    global $wpdb; 
    $sql = $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_type = %s AND post_status = 'publish' GROUP BY YEAR($wpdb->posts.post_date), MONTH($wpdb->posts.post_date) ORDER BY $wpdb->posts.post_date DESC", $cpt);
    $results = $wpdb->get_results($sql);

    if ( $results )
    {
        $archive = array();
        foreach ($results as $r)
        {
            $year = date('Y', strtotime( $r->post_date ) );
            $month = date('F', strtotime( $r->post_date ) );
            $month_num = date('m', strtotime( $r->post_date ) );
            $link = get_bloginfo('siteurl') . '/' . $cpt . '/' . $year . '/' . $month_num;
            $this_archive = array( 'month' => $month, 'year' => $year, 'link' => $link );
            array_push( $archive, $this_archive );
        }

        if( !$echo )
            return $archive;
        foreach( $archive as $a )
        {
            echo '<li><a href="' . $a['link'] . '">' . $a['month'] . ' ' . $a['year'] . '</a></li>';
        }
    }
    return false;
}

이 기능을 사용하려면 사용자 지정 포스트 유형의 슬래그만 제공하십시오.get_cpt_archives( 'news' )그러면 고유한 연도/날짜/링크 배열이 반환됩니다. 즉, 다음과 같습니다.

Array
(
    [0] => Array
        (
            [month] => February
            [year] => 2013
            [link] => http://yoursite.com/news/2013/02
        )

    [1] => Array
        (
            [month] => January
            [year] => 2013
            [link] => http://yoursite.com/news/2013/01
        )

)

이러한 루프를 사용하여foreach원하는 대로 출력할 수 있습니다.

또는 다음을 사용할 수 있습니다.get_cpt_archives( 'news', true )각 아이템을 자동으로 에코합니다.<li>특정 아카이브에 링크합니다.

출력 포맷이 원하는 대로 되지 않기 때문에 조금 조정하여 표시해야 합니다.

Year
    Month
    Month
Year
    Month

필요한 포맷을 지정합니다.

이게 도움이 됐으면 좋겠어요.

오래된 포스트인 것은 알지만, OP가 요구하는 것을 보다 간결하게 실행할 수 있는 방법이 있습니다.

function cpt_add_rewrite_rules()
{
    $cpt = 'news';

    add_rewrite_rule($cpt.'/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})?$',
        'index.php?post_type='.$cpt.'&year=$matches[1]&monthnum=$matches[2]&day=$matches[3]',
        'top');

    add_rewrite_rule($cpt.'/([0-9]{4})/([0-9]{1,2})?$',
        'index.php?post_type='.$cpt.'&year=$matches[1]&monthnum=$matches[2]',
        'top');

    add_rewrite_rule($cpt.'/([0-9]{4})?$',
        'index.php?post_type='.$cpt.'&year=$matches[1]',
        'top');
}

add_filter('init', 'cpt_add_rewrite_rules');

언급URL : https://stackoverflow.com/questions/14486792/custom-post-type-yearly-monthly-archive