다른 CPT를 함께 연결하는 방법?


11

이 질문이 여기에 있기를 바랍니다.

필자는 사용자 지정 분류법 사용법 (도서 / 저자 / 제목, 영화 / 배우 / 감독 등)의 인기있는 자습서 예제와 같이 서로 다른 사용자 정의 게시물 유형을 함께 연결하는 것이 일반적으로 필요하다고 생각했습니다. 개인적으로 "Posts 2 Posts"를 사용하지만 지원이 중단되었습니다.

Google에서 가장 관련성이 높은 결과는 지금이 플러그인을 가리 킵니다. 어떤 장기 대안이 있습니까? P2P 플러그인이 완료되면 노련한 WordPress 웹 개발자는 오늘날 WordPress로 책 / 저자 / 제목 관리 시스템을 설계하는 데 무엇을 사용합니까?


맞춤 게시물 유형을 만드는 데 어떤 코드를 사용 했습니까? 이 코드 wordpress.stackexchange.com/a/128544/9884
Brad Dalton

1
나는 여전히 많은 사람들이 p2p를 사용한다고 생각하므로 누군가가 github에서 포크로 유지 관리 할 수 ​​있기 때문에 언제든지 실패하는 것을 볼 수는 없습니다. 그러나 지원이 중단 된 경우 scribu가 새로운 작업을 수행 중이거나 기능이 핵심으로 진행되고 있음을 의미한다고 가정합니다. 나는 그것을 사용하지 않는 이유로 보지 않습니다.
sanchothefat

1
나는 확실하지 않다. P2P는 WP 플러그인 페이지에서 55,000 회의 다운로드 만 받았으며 생각했던 것보다 훨씬 인기가 없습니다. 그리고 왜 CPT를 함께 연결하는 것이 매우 기본적이고 일반적인 요구처럼 들리기 때문에 이유를 이해하지 못합니다. 기본적으로 무언가를 해결하는 플러그인은 어떻게 55,000 다운로드 만 할 수 있습니까? 그것은 저쪽에 있습니다. 유일한 설명은 그것을 해결할 수있는 또 다른 좋은 방법이 있다는 것입니다.
drake035

3
이 플러그인을 계속 사용할 수 있고 어떻게 든 플러그인이 실패하면 리 포크를 포크하여 직접 관리 할 수 ​​있습니다. github.com/scribu/wp-posts-to-posts.git 리포지토리에서 인용 :If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
WordPress의 HABTM이 정말 재미 있다고 생각하기 때문에이 질문을 찬성하고 별표를 표시했습니다. 즉, 플러그인이 너무 많이 사라지지 않을 것이라고 Mark Jaquith는 자발적으로 지원합니다 . 그리고 일부 WP 플러그인은 300000 다운로드 또는 기타 항목을 가질 수 있지만 github에는 별 472 개가 없습니다. 그것을 유지하기 위해, 그것은 중요한 숫자입니다!

답변:


13

프로그래머로서 게시물 유형을 연결하기 위해 자체 코드를 작성하기 시작했습니다. 빠른 방법은 아니지만 쉽지는 않지만 많은 재미가 있습니다.

게시물 유형

우리는 두 가지 간단한 포스트 유형을 생성하여 시작 AuthorBooks:

add_action('init', 'p2p2_register_author');
add_action('init', 'p2p2_register_book');

function p2p2_register_author(){
    $labels = array(
        'name'               => 'Author',
        'singular_name'      => 'Author',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Author',
        'edit_item'          => 'Edit Author',
        'new_item'           => 'New Author',
        'all_items'          => 'All Authors',
        'view_item'          => 'View Authors',
        'search_items'       => 'Search Authors',
        'not_found'          => 'No authors found',
        'not_found_in_trash' => 'No authors found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Authors'
    );

    register_post_type(
        'Author',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'author' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}
function p2p2_register_book(){
    $labels = array(
        'name'               => 'Books',
        'singular_name'      => 'Book',
        'add_new'            => 'Add New',
        'add_new_item'       => 'Add New Book',
        'edit_item'          => 'Edit Book',
        'new_item'           => 'New Book',
        'all_items'          => 'All Books',
        'view_item'          => 'View Book',
        'search_items'       => 'Search Books',
        'not_found'          => 'No books found',
        'not_found_in_trash' => 'No books found in Trash',
        'parent_item_colon'  => '',
        'menu_name'          => 'Books'
    );

    register_post_type(
        'Book',
        array (
            'labels'             => $labels,
            'public'             => true,
            'publicly_queryable' => true,
            'show_ui'            => true,
            'show_in_menu'       => true,
            'query_var'          => true,
            'rewrite'            => array( 'slug' => 'book' ),
            'capability_type'    => 'post',
            'has_archive'        => true,
            'hierarchical'       => false,
            'menu_position'      => null,
            'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
        )
    );
}

거기에는 멋진 것이 없습니다. 사실, 그것은 코덱스 에서 온 것입니다 !

메타 박스

저자의 메타 박스를 책 게시 유형에 계속 추가해 보겠습니다.

add_action('admin_init', 'p2p2_add_author_metabox');

function p2p2_add_author_metabox(){
    add_meta_box( 
        'book_author', 
        __('Book Author', 'bandpress'), 
        'p2p2_book_author_metabox', 
        'book', 
        'side', 
        'default', 
        array( 'id' => 'p2p2_author') 
    );
}

여기에서 p2p2_book_author_metabox메타 박스 안에 있는 콜백 함수 를 볼 수 있습니다 .

메타 박스의 내용

함수를 만들어 봅시다 :

function p2p2_book_author_metabox($post, $args){
    wp_nonce_field( plugin_basename( __FILE__ ), 'p2p2_book_author_nonce' );
    $author_id = get_post_meta($post->ID, 'p2p2_book_author', true);

    echo "<p>Select the author of the book</p>";
    echo "<select id='p2p2_book_author' name='p2p2_book_author'>";
    // Query the authors here
    $query = new WP_Query( 'post_type=author' );
    while ( $query->have_posts() ) {
        $query->the_post();
        $id = get_the_ID();
        $selected = "";

        if($id == $author_id){
            $selected = ' selected="selected"';
        }
        echo '<option' . $selected . ' value=' . $id . '>' . get_the_title() . '</option>';
    }
    echo "</select>";
}

여기 마법이 일어나는 곳이 있습니다. 먼저 저자를 위해 데이터베이스를 쿼리 한 다음 <select>쿼리 결과를 채 웁니다 . 에 대한 자세한 내용 은 코덱스 를 확인하십시오 WP_Query. 이제 책 게시물 유형으로 이동하여 드롭 다운을 볼 수 있습니다.

드롭 다운

컨텐츠 저장

물론 선택 항목을 저장하여 메타 박스를 저장할 다른 함수를 추가하려고합니다.

add_action('save_post', 'p2p2_save_author_metabox', 1, 2);

function p2p2_save_author_metabox($post_id, $post){
    // Don't wanna save this now, right?
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;
    if ( !isset( $_POST['p2p2_book_author_nonce'] ) )
        return;
    if ( !wp_verify_nonce( $_POST['p2p2_book_author_nonce'], plugin_basename( __FILE__ ) ) )
        return;

    // We do want to save? Ok!
    $key = 'p2p2_book_author';
    $value = $_POST["p2p2_book_author"];
    if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
        update_post_meta( $post->ID, $key, $value );
    } else { // If the custom field doesn't have a value
        add_post_meta( $post->ID, $key, $value );
    }
    if ( !$value ) delete_post_meta( $post->ID, $key ); // Delete if blank
}

이제 저자와 함께 책을 저장하십시오! 이 책의 저자는 wp_postmeta데이터베이스 테이블에 저장되며 선택한 드롭 다운 값은 메타 값이됩니다.

책의 저자 열

우리 책의 관리 영역을 확장 해 봅시다. 열을 변경하여 시작하겠습니다.

add_filter('manage_edit-book_columns', 'p2p2_add_book_columns');

function p2p2_add_book_columns($columns){
    $new_columns['cb'] = '<input type="checkbox" />';

    $new_columns['title'] = _x('Title', 'column name', 'bandpress');

    $new_columns['p2p2_author'] = __('Author', 'bandpress');

    return $new_columns;
}

이 함수는 열 제목과 p2p2_author 만 볼 수있게합니다. cb 확인란 열은 WordPress의 대량 편집 기능에 필요합니다. 이제 열에 정보를 추가해야합니다. 이 기능을 추가합니다 :

add_action('manage_book_posts_custom_column', 'p2p2_fill_book_columns', 10, 2);

function p2p2_fill_book_columns($column_name, $id) {
    global $wpdb;
    switch ($column_name) {
        case 'p2p2_author':
            $author_id = get_post_meta($id, 'p2p2_book_author', true);
            $author = get_post($author_id);
            $permalink = get_permalink($author_id);
            echo "<a href='" . $permalink . "'>" . $author->post_title . "</a>";
            break;
        default:
            break;
    } // end switch
}

스위치는 이전 함수에서 방금 추가 한 모든 열에 대한 것입니다. 당신은 당신이 보여주고 싶은 것을 에코하여 그것을 채 웁니다. 우리는이 책의 저자 인 게시물을 받고 자신의 '프로필 페이지'에 대한 훌륭한 영구 링크를 만듭니다. 이것은 다음과 같습니다

저자 열

계속 되려면

우리는 WordPress 사이트의 백엔드에서 두 가지 게시물 유형을 연결했지만 프런트 엔드에서 해당 게시물을 볼 수 없습니다. 이를 달성하기 위해서는 더 많은 작업이 필요하지만 가능성은 다소 무한합니다. 우리는 할 수 있었다 :

  1. 저자별로 책 정렬
  2. 저자 페이지에 도서 목록 표시
  3. 책 페이지에 저자의 다른 책 목록 표시
  4. 저자의 사진으로 멋진 메타 박스 만들기
  5. 저자 관리 페이지에서 자신이 쓴 책에 대한 열을 만듭니다.
  6. 그리고 훨씬 더 ...

이 솔루션을 직접 필요로 하므로이 답변을 계속 진행할 것입니다. 그러나 지금은 작업을 중단합니다. 내일이 답변을 업데이트하겠습니다.


답장을 보내 주셔서 감사합니다. 저자가 쓴 책 목록을 어떻게 보여 주겠습니까?
William

4

명의 위대한 개발자가 지원을 계속하기 위해 자발적으로 참여 했기 때문에 걱정하지 않아도 됩니다. 그러나 다른 것을 사용하려면 ACF 관계 필드를 확인하십시오 .


고독한 링크와 플러그인 권장 사항은 품질이 좋지 않은 것으로 간주됩니다. 그 이유는 간단합니다. 링크가 사라지면 응답 (및이 사이트)에 링크가 손상 될 수 있습니다.
카이저

3
링크없는 솔루션은 시간이 지남에 따라 더 이상 사용되지 않을 수 있으며, 일부 사람들은 더 이상 작동하지 않는다는 사실을 모르고 이러한 더 이상 사용되지 않는 솔루션을 구현하는 데 시간을 낭비 할 수 있기 때문에 연결이 끊어진 링크보다 최악입니다. ACF와 그 웹 사이트는 오래 지속될 것입니다. 마지막으로이 환상적인 대안에 대해 많은 Bjorn에게 감사드립니다.
drake035

2

원래 질문은 "P2P가 사라지면 어떻게 하시겠습니까?"입니다. 생각 / 제안이 있습니다. 플러그인을 빌드하는 경우 사용자에게 다른 플러그인을 설치하도록 지시하는 것이 항상 실행 가능한 것은 아니기 때문에 실제로 필요했습니다.

간단한 방법 중 하나는 Post Meta를 사용하는 것입니다. 예를 들어. Post_meta of Author에서 책을 저장할 수 있습니다. 고유 항목 또는 단일 쉼표로 구분 된 항목 또는 직렬화 된 배열입니다. 그런 다음 책에 저자의 역 정보를 저장합니다.

또 다른 방법은 관계 및 기타 관련 정보를 저장하는 새 DB 테이블을 추가하는 것입니다.

어느 솔루션이 어느 정도 규모인지는 잘 모르겠지만 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.