Làm thế nào để kết nối các CPT khác nhau lại với nhau?


10

Tôi hy vọng câu hỏi này có vị trí của nó ở đây.

Tôi đã luôn nghĩ rằng việc kết nối các loại bài đăng tùy chỉnh khác nhau với nhau là một nhu cầu khá phổ biến, như trong các ví dụ hướng dẫn phổ biến về sử dụng phân loại tùy chỉnh (sách / tác giả / tên sách, phim / diễn viên / đạo diễn, v.v.). Cá nhân tôi sử dụng "Bài viết 2 Bài viết", nhưng hỗ trợ đã dừng.

Trên Google, kết quả phù hợp nhất chỉ đến plugin này ngay bây giờ. Những lựa chọn thay thế dài hạn tồn tại? Nhà phát triển web WordPress dày dạn sẽ sử dụng gì để thiết kế hệ thống quản lý sách / tác giả / tên sách với WordPress ngay hôm nay, nếu plugin P2P kết thúc?


Mã nào bạn đã sử dụng để tạo các loại bài tùy chỉnh? Bạn có thể thêm hỗ trợ để tạo các loại phân loại tùy chỉnh bằng cách sử dụng mã wordpress.stackexchange.com/a/128544/9884
Brad Dalton

1
Tôi nghĩ rằng một số lượng lớn người vẫn sử dụng p2p vì vậy tôi không thể thấy nó bị hỏng bất cứ lúc nào vì ai đó chỉ có thể rẽ nhánh và duy trì nó trên github. Nếu sự hỗ trợ đã bị hủy bỏ tuy nhiên tôi cho rằng điều đó chỉ có nghĩa là scribu đang làm việc trên một cái gì đó mới hoặc chức năng có thể được đưa vào cốt lõi. Tôi không thấy nó là một lý do để không sử dụng nó.
sanchothefat

1
Tôi không chắc lắm về sancho. P2P chỉ có 55.000 lượt tải xuống trên trang WP plugin, ít phổ biến hơn tôi nghĩ. Và tôi không hiểu tại sao, một lần nữa bởi vì việc kết nối CPT với nhau nghe có vẻ như là một nhu cầu rất cơ bản và phổ biến. Làm thế nào một plugin chỉ giải quyết một cái gì đó rất cơ bản có thể chỉ có 55.000 lượt tải xuống? Đó là ngoài tôi. Giải thích duy nhất là có một cách tốt khác để giải quyết nó do đó là câu hỏi của tôi.
Drainke035

3
Bạn có thể tiếp tục sử dụng plugin này và nếu plugin nào đó bị lỗi bằng cách nào đó, bạn có thể rẽ nhánh repo và tự duy trì nó: github.com/scribau/wp-posts-to-posts.git Trích dẫn từ repo:If you want to help maintain the plugin, fork it on github and open pull requests.
Scuba Kay

4
Nâng cao và đánh dấu sao câu hỏi này vì tôi nghĩ HABTM trong WordPress thực sự thú vị. Điều đó nói rằng, tôi sẽ không đổ mồ hôi cho plugin đi quá nhiều, Mark Jaquith đã tình nguyện giúp nó tiếp tục . Và trong khi một số plugin WP có thể có 300000 lượt tải xuống hoặc bất cứ thứ gì, không nhiều plugin có 472 sao trên github. Để giữ cho nó sống, đó là con số đáng kể!
Sẽ

Câu trả lời:


12

Là một lập trình viên, tôi sẽ bắt đầu viết mã của riêng mình để kết nối các loại bài đăng của mình. Đó không phải là một cách nhanh chóng, nó không dễ dàng, nhưng nó rất nhiều niềm vui.

Các loại bài

Chúng tôi bắt đầu bằng cách tạo hai loại bài đăng đơn giản 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' )
        )
    );
}

Không có gì lạ mắt ở đó. Trên thực tế, đó là từ Codex !

Siêu dữ liệu

Hãy tiếp tục bằng cách thêm một metabox cho tác giả của chúng tôi vào loại bài đăng sách của chúng tôi:

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

Ở đây bạn có thể thấy một chức năng gọi lại p2p2_book_author_metaboxsẽ là những gì bên trong metabox của chúng tôi.

Nội dung của metabox

Hãy tạo chức năng:

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

Đây là nơi phép màu xảy ra. Trước tiên, chúng tôi sẽ truy vấn cơ sở dữ liệu cho các tác giả và sau đó chúng tôi điền vào một <select>kết quả truy vấn của chúng tôi. Kiểm tra Codex để biết thêm về WP_Query. Bây giờ bạn có thể đi đến loại bài đăng sách của bạn và xem danh sách thả xuống của bạn:

Thả xuống của chúng tôi

Lưu nội dung của chúng tôi

Dĩ nhiên, chúng tôi muốn lưu lựa chọn của mình để chúng tôi thêm một chức năng khác sẽ lưu metabox cho chúng tôi:

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
}

Bây giờ đi và lưu một cuốn sách với một tác giả! Tác giả của cuốn sách sẽ được lưu trong wp_postmetabảng cơ sở dữ liệu và giá trị được chọn của danh sách thả xuống sẽ là trong meta.

Một cột tác giả cho cuốn sách

Hãy mở rộng khu vực quản trị cho sách của chúng tôi. Chúng tôi sẽ bắt đầu bằng cách thay đổi các cột:

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

Hàm này đảm bảo chúng ta chỉ thấy tiêu đề cột và p2p2_ Author. Cột hộp kiểm cb là cần thiết cho chức năng chỉnh sửa hàng loạt của WordPress. Bây giờ chúng tôi cần thêm một số thông tin vào cột của chúng tôi. Chúng tôi thêm chức năng này:

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
}

Công tắc dành cho mọi cột bạn vừa thêm vào chức năng trước đó. Bạn điền vào nó bằng cách lặp lại những gì bạn muốn hiển thị. Chúng tôi nhận được bài đăng đó là tác giả của cuốn sách của chúng tôi và tạo ra một permalink đẹp cho 'trang hồ sơ' của anh ấy / cô ấy. Đây là những gì nó trông giống như:

Cột tác giả của chúng tôi

Còn tiếp

Chúng tôi đã kết nối hai loại bài đăng trong phần phụ trợ của trang web WordPress của chúng tôi, nhưng chúng tôi không thể thấy một điều của nó trong frontend. Nó sẽ cần nhiều công việc hơn để thực hiện điều này, nhưng khả năng là hơi vô tận. Chúng ta có thể:

  1. Sắp xếp sách theo tác giả
  2. Hiển thị danh sách các sách trên trang tác giả
  3. Hiển thị danh sách các cuốn sách khác của tác giả trên trang sách
  4. Tạo một metabox lạ mắt với hình ảnh của tác giả
  5. Tạo một cột trong trang quản trị tác giả cho những cuốn sách anh ấy / cô ấy đã viết
  6. Và nhiều hơn nữa...

Tôi sẽ tiếp tục làm việc với câu trả lời này, vì tôi cần giải pháp này cho mình. Tuy nhiên, tôi sẽ ngừng làm việc ngay bây giờ. Tôi sẽ bắt đầu cập nhật câu trả lời này vào ngày mai.


Cảm ơn bạn đã chia sẻ trả lời tuyệt vời của bạn. Làm thế nào bạn sẽ hiển thị một danh sách các cuốn sách được viết bởi tác giả?
William

4

Tôi sẽ không lo lắng về điều đó quá nhiều, vì một vài nhà phát triển tuyệt vời đã tình nguyện tiếp tục hỗ trợ . Tuy nhiên, nếu bạn muốn sử dụng một cái gì đó khác, hãy kiểm tra trường quan hệ ACF .


Liên kết đơn và đề xuất plugin được coi là câu trả lời kém chất lượng. Lý do rất đơn giản: Nếu liên kết không còn, câu trả lời (và trang web này) bị thối liên kết.
kaiser

3
Các giải pháp không liên kết cũng có thể trở nên lỗi thời theo thời gian và điều này tệ nhất là các liên kết chết vì một số người có thể lãng phí thời gian để cố gắng thực hiện các giải pháp lỗi thời này mà không biết rằng chúng không còn hiệu quả nữa. Bên cạnh đó ACF và trang web của nó có thể sẽ tồn tại trong một thời gian rất dài. Cuối cùng cảm ơn rất nhiều Bjorn cho sự thay thế tuyệt vời này.
Drainke035

2

Vì câu hỏi ban đầu là "Bạn sẽ làm gì nếu P2P biến mất?" Tôi có một suy nghĩ / đề nghị. Tôi thực sự cần thiết, bởi vì nếu bạn đang xây dựng một plugin, việc bảo người dùng cài đặt một plugin khác không phải lúc nào cũng khả thi.

Một phương pháp đơn giản là sử dụng Post Meta. Ví dụ. Trong post_meta của Tác giả, bạn có thể lưu trữ sách. Hoặc là các mục duy nhất hoặc một mục được phân tách bằng dấu phẩy hoặc một mảng được tuần tự hóa. Sau đó, trên cuốn sách, bạn lưu trữ thông tin nghịch đảo của Tác giả.

Một cách khác là thêm một bảng DB mới (nhíu mày) để lưu trữ các mối quan hệ và thông tin thích hợp khác.

Không biết mức độ hiệu quả của một trong hai giải pháp, nhưng chúng hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.