Как соединить разные CPT вместе?


10

Я надеюсь, что этот вопрос имеет свое место здесь.

Я всегда думал, что объединение различных пользовательских типов постов - довольно распространенная потребность, как в популярных примерах использования пользовательских таксономий (книги / авторы / названия, фильмы / актеры / режиссеры и т. Д.). Я лично пользуюсь "Posts 2 Posts", но поддержка прекратилась.

В 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 действительно интересен. Тем не менее, я бы не потел, чтобы плагин слишком долго уходил , Марк Хакит вызвался помочь ему продолжать работу . И хотя некоторые плагины WP могут иметь 300000 скачиваний или что-то еще, не многие имеют 472 звезды на github. Для того, чтобы поддерживать это, это число, которое имеет значение!
— Будет ли

Ответы:


12

Как программист, я бы начал писать свой собственный код, чтобы связать свои типы постов. Это не быстрый способ, это не легко, но это очень весело.

Типы сообщений

Мы начнем с создания двух типов просто пост, 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 и его сайт, вероятно, прослужат очень долго. Наконец, большое спасибо Bjorn за эту фантастическую альтернативу.
— drake035

2

Поскольку первоначальный вопрос «Что бы вы сделали, если бы P2P ушел?» У меня есть мысль / предложение. Я действительно нуждался в этом, потому что, если вы создаете плагин, указание пользователям установить другой плагин не всегда жизнеспособно.

Одним из простых способов было бы использовать Post Meta. Например. В post_meta автора вы можете хранить книги. Либо в виде уникальных записей, либо отдельной записи, разделенной запятыми, либо сериализованного массива. Затем в книге вы храните обратную информацию об авторе (авторах).

Другой вариант - добавить новую таблицу БД (нахмурившуюся), в которой хранятся отношения и другая соответствующая информация.

Не знаю, насколько эффективно любое решение в масштабе, но они работают.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.