Làm cách nào để tạo mối quan hệ giữa hai loại bài đăng tùy chỉnh?


16

Tôi muốn xây dựng cơ sở dữ liệu phim truyền hình bằng WordPress. Tôi đã làm theo một số hướng dẫn và tôi có hai loại bài tùy chỉnh: một cho movies, một cho và series. Tôi theo bài này cho cấu trúc .

Câu hỏi của tôi là: làm thế nào tôi có thể tạo mối quan hệ giữa các loại phim và loạt bài đăng?


Trước hết, bạn KHÔNG tạo toàn bộ cơ sở dữ liệu, bạn chỉ đang tạo Loại bài đăng tùy chỉnh của WordPress. Và trong phạm vi WordPress, bạn có nhiều cơ hội để phân loại chúng, sắp xếp chúng, v.v. Và tất cả chúng đều được thực hiện với một mối quan hệ nội bộ tốt. Vì vậy, mối quan hệ mà bạn đang nói đến đã có sẵn, bạn chỉ cần thực hiện nó theo cách bạn cần. Vì vậy, tôi sẽ đề nghị bạn triển khai post_type theo chỉ dẫn và sau đó chỉnh sửa câu hỏi bằng truy vấn thực sự của bạn.
Hồi giáo Mayeenul

@MayeenulIslam, "implement the post_type as directed"ý bạn là gì?
CoalaArmy

Theo chỉ dẫn trong chuỗi liên kết được cung cấp của bạn hoặc bằng cách sử dụng một trình tạo đơn giản như: Trình tạo loại bài đăng này .
Hồi giáo Mayeenul

@MayeenulIslam: Tôi không tin rằng "mối quan hệ mà bạn đang nói đến đã có". Theo mặc định, không có mối quan hệ trực tiếp giữa các loại bài đăng khác nhau.
s_ha_dum

@s_ha_dum Xin lỗi, tôi đã bỏ lỡ một phần câu hỏi của anh ấy khi anh ấy nói rằng anh ấy có hai post_types. Đó là sai lầm của tôi. Tôi đang cố gắng làm cho anh ta làm rõ với chi tiết của mình. Tôi đã bỏ lỡ rằng các chi tiết đã có. :( Tôi đang nói về mối quan hệ bên trong của phân loại học và loại bài tùy chỉnh nếu được xác định.
Mayeenul Hồi giáo

Câu trả lời:


22

Sử dụng Plugin

Một số plugin rất tốt cho các mối quan hệ:

Sử dụng Metabox

Bạn có thể xây dựng một mối quan hệ đơn giản bằng cách sử dụng metaboxes:

add_action( 'admin_init', 'add_meta_boxes' );
function add_meta_boxes() {
    add_meta_box( 'some_metabox', 'Movies Relationship', 'movies_field', 'series' );
}

function movies_field() {
    global $post;
    $selected_movies = get_post_meta( $post->ID, '_movies', true );
    $all_movies = get_posts( array(
        'post_type' => 'movies',
        'numberposts' => -1,
        'orderby' => 'post_title',
        'order' => 'ASC'
    ) );
    ?>
    <input type="hidden" name="movies_nonce" value="<?php echo wp_create_nonce( basename( __FILE__ ) ); ?>" />
    <table class="form-table">
    <tr valign="top"><th scope="row">
    <label for="movies">Movies</label></th>
    <td><select multiple name="movies">
    <?php foreach ( $all_movies as $movie ) : ?>
        <option value="<?php echo $movie->ID; ?>"<?php echo (in_array( $movie->ID, $selected_movies )) ? ' selected="selected"' : ''; ?>><?php echo $movie->post_title; ?></option>
    <?php endforeach; ?>
    </select></td></tr>
    </table>
}

add_action( 'save_post', 'save_movie_field' );
function save_movie_field( $post_id ) {

    // only run this for series
    if ( 'series' != get_post_type( $post_id ) )
        return $post_id;        

    // verify nonce
    if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    // check autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // check permissions
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;

    // save
    update_post_meta( $post_id, '_movies', array_map( 'intval', $_POST['movies'] ) );

}

Và sau đó, để lấy mối quan hệ phim làm danh sách cho các bài đăng loạt:

$series = new WP_Query( array(
    'post_type' => 'movies',
    'post__in' => get_post_meta( $series_id, '_movies', true ),
    'nopaging' => true
) );

if ( $series-> have_posts() ) { while ( $series->have_posts() ) {
    $series->the_post();
    ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ></a></li>
    <?php
} }

3
Tôi thích ý tưởng với metaboxes (cố gắng tránh các plugin)!
CoalaArmy

Nếu không tạo một bài đăng khác, chúng ta có thể thêm vào đây làm thế nào để tạo một permalink từ mối quan hệ cha mẹ / con cái này không? Ví dụ : http://domain.com/series-name/movie-name?
Xtremefaith

@Xtremefaith điều này có thể được thực hiện với mã khác. Có một plugin tôi đã tạo cho các danh mục. Có lẽ bạn có thể sử dụng như một tài liệu tham khảo. wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

Tôi khuyên dùng plugin Bài viết 2 , mà tôi mới bắt đầu sử dụng.

Nó cho phép bạn tạo mối quan hệ nhiều-nhiều giữa các bài đăng và loại trang, nghĩa là bạn có thể liên kết moviesđến seriesvà bất kỳ CPT nào khác bạn có thể tạo.

Plugin này cũng cho phép bạn tạo siêu dữ liệu kết nối , cho phép bạn có được chi tiết tốt hơn khi tạo kết nối của mình. Nó khá linh hoạt trong cách sử dụng, cho phép kiểm soát các metabox của quản trị viên, các loại kết nối và các cách để hiển thị các kết nối của bạn ở mặt trước. Cuối cùng, nó là tài liệu tốt .


Tôi sẽ xem nó.
CoalaArmy

Tôi đang tìm kiếm sth. tương tự và đã thử các giải pháp khác nhau. Tôi phải nói rằng bài này (Bài 2) là hoàn hảo, nó có thể không phải là thứ mà một người 'không phải lập trình viên' sẽ tìm kiếm, nhưng nếu bạn đang tìm kiếm nhiều hơn cho sth. giống như một thư viện để sử dụng trong mẫu của bạn, hơn thế này là hoàn hảo, tài liệu tốt, tích hợp tốt, có được nó! ;)
Larzan

Tôi đã làm một plugin nhỏ cho bài quan hệ nhưng wordpress.org/plugins/softmixt-relations
Softmixt

2

Thật không may, plugin Bài viết 2 Bài viết không được dùng nữa và không còn được duy trì. Có một plugin thay thế mới cho Mối quan hệ MB đó . Nó lấy cảm hứng từ P2P và cung cấp một API tương tự để tạo mối quan hệ giữa các bài đăng, thuật ngữ và người dùng.

MB Mối quan hệ hỗ trợ các mối quan hệ hai chiều theo mặc định và sử dụng bảng tùy chỉnh để lưu trữ các mối quan hệ (như P2P) để có hiệu suất tốt hơn (so với bài đăng meta).

Thật đáng để xem qua plugin.

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.