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

10

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

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

В Google наиболее релевантные результаты указывают на этот плагин прямо сейчас. Какие долгосрочные альтернативы существуют? Что бы использовал опытный веб-разработчик WordPress для разработки системы управления книгами / авторами / названиями с помощью WordPress сегодня, если плагин P2P будет готов?

drake035
источник
Какой код вы использовали для создания пользовательских типов записей? Вы можете добавить поддержку для создания пользовательских типов таксономии, используя этот код 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 .

Bjorn
источник
Одинокие ссылки и рекомендации плагинов считаются некачественными ответами. Причина проста: если ссылка исчезла, ответ (и этот сайт) страдает от гниения ссылок.
Кайзер
3
Решения без ссылок могут со временем устареть, и это хуже, чем мертвые ссылки, потому что некоторые люди могут тратить время, пытаясь реализовать эти устаревшие решения, не зная, что они больше не работают. К тому же ACF и его сайт, вероятно, прослужат очень долго. Наконец, большое спасибо Bjorn за эту фантастическую альтернативу.
drake035
2

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

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

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

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

Джефф Роуз
источник