Як з'єднати різні CPT разом?


11

Я сподіваюся, що це питання має своє місце тут.

Я завжди вважав, що з'єднання різних типів пошти разом є досить поширеною потребою, як, наприклад, у популярних навчальних прикладах використання користувальницької систематики (книги / автори / заголовки, фільми / актори / режисери тощо). Я особисто використовую "Постів 2 дописів", але підтримка припинилася.

У Google найбільш релевантні результати вказують на цей плагін саме зараз. Які довгострокові альтернативи існують? Що б використовував досвідчений веб-розробник WordPress для розробки системи управління книгою / автором / заголовком із WordPress сьогодні, якщо плагін P2P буде закінчений?


Який код ви використовували для створення спеціальних типів публікацій? Ви можете додати підтримку для створення власних типів таксономії, використовуючи цей код wordpress.stackexchange.com/a/128544/9884
Бред Далтон

1
Я думаю, що величезна кількість людей як і раніше використовує p2p, тому я не можу побачити, що вона вийде з ладу в будь-який час, тому що хтось може просто розщедритися і підтримувати її на github. Якщо підтримка була відхилена, я вважаю, що це просто означає, що scribu працює над чимось новим, або функціональність може пробитися в основу. Я не вважаю це причиною не використовувати його.
sanchothefat

1
Я не такий впевнений, санчо. P2P має лише 55 000 завантажень на сторінці плагінів WP, набагато менш популярних, ніж я думав. І я не розумію, чому, знову ж таки тому, що з'єднання 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
Це питання було схвалено та знято, оскільки я думаю, що HABTM у WordPress - це справді цікаво. Тим НЕ менше, я б не потею плагін йде занадто багато, Марк Jaquith зголосився допомогти зберегти її . І хоча деякі плагіни WP можуть мати 300000 завантажень чи що завгодно, не багато з них мають 472 зірки на github. За те, щоб зберегти це в живих, це число, яке рахується!
Чи буде

Відповіді:


13

Як програміст, я почав би писати власний код для підключення моїх публікацій. Це не швидкий шлях, це непросто, але це дуже весело.

Типи публікацій

Ми почнемо з створення двох типів просто пост, Authorа Books:

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. І багато іншого ...

Я продовжуватиму працювати над цією відповіддю, оскільки мені самому потрібно це рішення. Однак я поки що припиняю працювати. Я розпочну оновити цю відповідь завтра.


Дякуємо, що поділилися чудовою відповіддю Як би ви показали список книг, написаних автором?
Вільям

4

Я не надто хвилювався б з цього приводу, оскільки пара чудових розробників зголосилася продовжувати підтримку . Однак якщо ви хочете скористатися чимось іншим, ознайомтесь із полем відносин ACF .


Самотні посилання та рекомендації щодо плагінів вважаються відповідями низької якості. Причина проста: Якщо посилання відсутнє, відповідь (і цей сайт) страждає від гниття посилань.
кайзер

3
Рішення без посилань також можуть з часом застаріти, і це найгірше, ніж мертві посилання, оскільки деякі люди можуть витрачати час на спроби впровадити ці застарілі рішення, не знаючи, що вони більше не працюють. Крім того, ACF та його веб-сайт, ймовірно, прослужать дуже довго. Нарешті дякую Бьорну за цю фантастичну альтернативу.
drake035

2

Оскільки оригінальне запитання - "Що б ви зробили, якби P2P пішов?" У мене є думка / пропозиція. Мені насправді потрібен, тому що якщо ви будуєте плагін, кажучи користувачам встановити інший плагін, це не завжди можливо.

Одним з простих методів було б використання Post Meta. Наприклад. У post_meta автора, ви можете зберігати книги. Або як унікальні записи, або окремий запис, розділений комами, або серіалізований масив. Потім у книзі ви зберігаєте зворотну інформацію про авторів.

Іншим було б додати нову таблицю БД (нахмурившись), яка зберігає відносини та іншу відповідну інформацію.

Поняття не має, наскільки ефективне будь-яке рішення на масштабі, але вони працюють.

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