Як створити зв’язок між двома типовими публікаціями?


16

Я хочу створити базу даних телесеріалів за допомогою WordPress. Я дотримувався деяких навчальних посібників, і у мене є два спеціальні типи публікацій: один для movies, один для та series. Я дотримувався цієї посади для структури .

Моє запитання: як я можу встановити взаємозв'язок між фільмами та видами серій?


Перш за все, ви НЕ створюєте цілу базу даних, ви просто створюєте користувальницький тип повідомлення WordPress. І в межах WordPress у вас є багато можливостей класифікувати їх, сортувати їх і т. Д. І всі вони зроблені з хорошими внутрішніми стосунками. Отже, стосунки, про які ви говорите, вже є, ви просто повинні їх реалізувати так, як вам потрібно. Отже, я б запропонував вам реалізувати пост_тип відповідно до вказівки, а потім відредагувати питання за допомогою реального запиту.
Mayeenul Islam

@MayeenulIslam, "implement the post_type as directed"що ти маєш на увазі?
CoalaArmy

Як вказано у наданому потоці посилань або за допомогою простого генератора, такого як: цей Генератор типів публікацій .
Mayeenul Islam

@MayeenulIslam: Я не переконаний, що "стосунки, про які ти говориш, вже є". За замовчуванням між різними типами публікацій немає прямого зв’язку.
s_ha_dum

@s_ha_dum Вибачте, я пропустив частину його запитання, де він уже сказав, що у нього є два пост_типи. Це моя помилка. Я намагаюся змусити його уточнити своєю деталлю. Я пропустив, що деталь вже є. :( Я говорю про внутрішній взаємозв'язок таксономії та користувацького типу публікації, якщо визначено.
Mayeenul Islam

Відповіді:


22

Використання плагіна

Деякі дуже хороші плагіни для стосунків:

Використання Metabox

Ви можете побудувати просту взаємозв'язок за допомогою метабокс:

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

}

А потім, щоб отримати стосунки з фільмами як список для публікацій серій:

$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
Мені подобається ідея з метабоксами (намагаються уникати плагінів)!
CoalaArmy

Не створюючи іншої публікації, чи можемо ми додати до цього, як створити постійну посилання з цих стосунків батько / дитина? Наприклад: http://domain.com/series-name/movie-name?
Xtremefaith

@Xtremefaith це можна зробити за допомогою іншого коду. Я створив плагін для категорій. Можливо, ви можете використовувати як орієнтир. wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

Я рекомендую плагін Posts 2 Posts , який я тільки почав використовувати.

Це дозволяє створити багато-на-багато відносин між публікаціями та типами сторінок, тобто ви можете посилатися moviesна seriesбудь-які інші CPT, які ви можете створювати.

Цей плагін також дозволяє створити метадані підключення, що дозволить отримати більш детальну деталізацію під час створення ваших з'єднань. Він досить гнучкий у використанні, що дозволяє контролювати адміністративні метабокси, типи з'єднань та способи відображення ваших з'єднань на передній частині. Нарешті, це добре документально підтверджено .


Я погляну на це.
CoalaArmy

Шукав що-небудь. подібні та випробувані різні рішення. Я мушу сказати, що ця (повідомлення 2 публікації) була ідеальною, можливо, це не те, що шукав би непрограміст, але якщо ви шукаєте більше для чого-небудь. як бібліотека для використання у вашому шаблоні, ніж це просто ідеально, добре документовано, добре інтегровано, отримайте це! ;)
Ларзан

Я зробив невеликий плагін для поштових зв’язків, але wordpress.org/plugins/softmixt-relations
Softmixt

2

На жаль, плагін Posts 2 Posts застарілий і більше не підтримується. Існує новий альтернативний плагін для цих відносин MB . Він натхненний P2P і надає аналогічний API для створення зв’язків між публікаціями, термінами та користувачами.

MB Relationships підтримує двосторонні відносини за замовчуванням та використовує власну таблицю для зберігання відносин (наприклад, P2P) для кращої продуктивності (ніж постмета).

Варто поглянути на плагін.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.