programing

get_adjacent_post()를 커스텀 투고 유형 간에 동작시킵니다.

batch 2023. 4. 1. 08:38
반응형

get_adjacent_post()를 커스텀 투고 유형 간에 동작시킵니다.

사용.get_adjacent_post,previous_post_link,그리고.next_post_link같은 포스트 타입의 아이템만 인식되는 것 같습니다.커스텀 투고 타입이 2개 있는데, 이전 투고 타입과 다음 투고 타입을 모두 링크할 수 있는 방법이 있습니까?

이 질문은 인터넷 전체에 걸쳐서 명확한 답변이 없는 것으로 보입니다.그래서 오리지널에서 나만의 기능을 만들어 냈습니다.get_adjacent_post필요한 사람을 위해 맞춤 제작했습니다.

기능

이것을 기능에서 제외해 주세요.php

/*
 * Replacement for get_adjacent_post()
 *
 * This supports only the custom post types you identify and does not
 * look at categories anymore. This allows you to go from one custom post type
 * to another which was not possible with the default get_adjacent_post().
 * Orig: wp-includes/link-template.php 
 * 
 * @param string $direction: Can be either 'prev' or 'next'
 * @param multi $post_types: Can be a string or an array of strings
 */
function mod_get_adjacent_post($direction = 'prev', $post_types = 'post') {
    global $post, $wpdb;

    if(empty($post)) return NULL;
    if(!$post_types) return NULL;

    if(is_array($post_types)){
        $txt = '';
        for($i = 0; $i <= count($post_types) - 1; $i++){
            $txt .= "'".$post_types[$i]."'";
            if($i != count($post_types) - 1) $txt .= ', ';
        }
        $post_types = $txt;
    }

    $current_post_date = $post->post_date;

    $join = '';
    $in_same_cat = FALSE;
    $excluded_categories = '';
    $adjacent = $direction == 'prev' ? 'previous' : 'next';
    $op = $direction == 'prev' ? '<' : '>';
    $order = $direction == 'prev' ? 'DESC' : 'ASC';

    $join  = apply_filters( "get_{$adjacent}_post_join", $join, $in_same_cat, $excluded_categories );
    $where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type IN({$post_types}) AND p.post_status = 'publish'", $current_post_date), $in_same_cat, $excluded_categories );
    $sort  = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );

    $query = "SELECT p.* FROM $wpdb->posts AS p $join $where $sort";
    $query_key = 'adjacent_post_' . md5($query);
    $result = wp_cache_get($query_key, 'counts');
    if ( false !== $result )
        return $result;

    $result = $wpdb->get_row("SELECT p.* FROM $wpdb->posts AS p $join $where $sort");
    if ( null === $result )
        $result = '';

    wp_cache_set($query_key, $result, 'counts');
    return $result;
}

사용.

기본 사용

// Custom post types can be array() or string
$post1 = mod_get_adjacent_post('prev', array('post', 'custom1', 'custom2'));
$post2 = mod_get_adjacent_post('next', 'custom2');

사전/다음 링크 작성용

<?php
$prev = mod_get_adjacent_post('prev', array('post', 'custom1', 'custom2'));
$next = mod_get_adjacent_post('next', array('post', 'custom1', 'custom2'));
?>

<?php if($prev) : ?>
    <a href="<?php echo get_permalink($prev->ID)?>">&laquo; Go back in time</a>
<?php endif; ?>

<?php if($next) : ?>
    <a href="<?php echo get_permalink($next->ID)?>">Next: <?php echo $next->post_title; ?> &raquo;</a>
<?php endif; ?>

변수를 포함하려면 코드를 수정할 수 있습니다.$in_same_cat그리고.$excluded_categories하지만 만약 그렇게 하신다면get_adjacent_post그래서 하는 거니까.

이전 답변은 더 이상 작동하지 않습니다.이것 좀 봐

좀 더 간단한 새로운 걸 생각해냈죠

  • 이것을 당신의 함수에 붙여 넣으세요.php
function custom_posttype_get_adjacent_ID($direction = 'next', $type = 'post', $current) {

    // Get all posts with this custom post type
    $posts = get_posts('posts_per_page=-1&order=DESC&post_type='.$type);

    $postsLength = sizeof($posts)-1;
    $currentIndex = 0;
    $index = 0;
    $result = 0;

    // Iterate all posts in order to find the current one
    foreach($posts as $p){
        if($p->ID == $current) $currentIndex = $index;
        $index++;
    }
    if($direction == 'prev') {
        // If it's 'prev' return the previous one unless it's the first one, in this case return the last. 
        $result = !$currentIndex ? $posts[$postsLength]->ID : $posts[$currentIndex - 1]->ID;
    } else {
        // If it's 'next' return the next one unless it's the last one, in this case return the first. 
        $result = $currentIndex == $postsLength ? $posts[0]->ID : $posts[$currentIndex + 1]->ID;
    }
    return $result;
}

next-prev post ID가 필요한 경우 다음과 같은 기능을 사용하십시오.

custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID());

코멘트:

  • 자유롭게 교환해 주세요.get_the_ID()원하는 경우 현재 게시물 ID를 입력합니다.
  • 첫 번째 파라미터는 'next' 또는 'prev'가 될 것으로 예상되면 다시 'next'로 돌아갑니다.
  • 두 번째 매개 변수는 사용자 지정 게시 유형 이름이어야 합니다.다음 페이지에서 찾을 수 있습니다.register_post_type()기능.그것은 'post'로 되돌아간다.
  • 마지막 매개 변수가 비어 있으면 작동하지 않습니다.

예:

다음 또는 이전 투고 퍼머링크를 사용하는 경우 다음과 같이 사용할 수 있습니다.

<?php echo get_permalink(custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID())); ?>

태그를 사용하면 다음과 같이 됩니다.

<a href="<?php echo get_permalink(custom_posttype_get_adjacent_ID('prev', 'project', get_the_ID())); ?>">Previous Project</a>

많은 테스트를 할 수 없었기 때문에, 만약 문제가 있는 경우는 가르쳐 주세요.수리를 시도하거나 개선하도록 하겠습니다.

언급URL : https://stackoverflow.com/questions/10376891/make-get-adjacent-post-work-across-custom-post-types

반응형