Posts 2 Posts плагин для связи постов в WordPress

Сегодня  я хочу рассказать вам про один замечательный плагин  с говорящим названием Posts 2 Posts.
Если коротко этакой универсальный способ двухсторонние связи любых двух типов постов (post_type), по схеме один ко многим без использования таксономий.

Это нечто похожее на модуль References  в Drupal 7 если он вам знаком, но  другой.

Это нечто среднее между метками у постов и отношением дочерняя — родительская у станиц:

2014-12-30 11-24-01 Skrinshot e`krana

Если вы еще не поняли что не использовать Posts 2 Posts было самой большой ошибкой в вашей  жизни приведу пример.

Допустим  у вас есть задача  создать два вида материалов, бренды и продукты этих брендов (техника/машины), при этом  как страница бренда  так и продукта насыщены разнообразной информацией (миниатюра, полное и краткое описание, метаполя, галереи и прочие) , нам нужно  как то связать бренд с продуктом на странице бренда вывести некоторую выборку товаров например и при этом дать контент менеджеру такой интерфейс чтоб он был максимально прост , можно было отследить связи не углубляясь в недры админки, и при этом не хранить в голове кучу взаимосвязей на гране взрыва мозга при этом не давая потенциальной возможности что либо сломать.

Тут то нам и понадобится Posts 2 Posts сам плагин после активации практически не дает каких либо дополнительных фитч коме своего api благодаря которому вот такой простенький код:

if (function_exists("_p2p_load")) {
function vp_post_to_post()
{
p2p_register_connection_type(array(
'name' => 'machine_to_brand',
'from' => 'machine',
'to' => 'brand'
));
}

add_action('p2p_init', 'vp_post_to_post');
}

 

создаст связанность machine  с типом потов  brand + метабоксы на страницах редактирования обоих типов постов + создаст возможность писать дополнительные параметры  WP_Query с помощью которых можно выводить связанные посты.

Wordpress Posts 2 Posts

так же есть гибкой настройки метебокса в админке, можно настроить подписи ко всему что только можно , можно  создать лимиты на количество связей, выпадающий список или даже кастомный метабокс.

Так же имеется ряд дополнительных возможностей  например создавать дополнительные поля с помощью аргумента field:

p2p_register_connection_type( array(
'name' => 'posts_to_pages',
'from' => 'post',
'to' => 'page',

'fields' => array(
'count' => array(
'title' => 'Count',
'type' => 'text',
),
'role' => array(
'title' => 'Role',
'type' => 'select',
'values' => array( 'VALUE 1', 'VALUE 2', 'VALUE 3' )
),
'special' => array(
'title' => 'Special',
'type' => 'checkbox'
),
'colors' => array(
'title' => 'Colors',
'type' => 'checkbox',
'values' => array(
'green'=>__('Green','my-textdomain'),
'white'=>__('White','my-textdomain') ),
'default' => 'blue'
),
)
) );

Каждое из эти этих полей мы можем в последствии получить в цикле WordPress при помощи p2p_get_meta() иногда это бывает полезно.

while( $myposts->have_posts() ) : $connected->the_post();
    the_title();
    echo '<br>';
    echo 'Количество тип: ' . p2p_get_meta( get_post()->p2p_id, 'count', true );
    echo '<br>';
    echo 'Тип: ' . p2p_get_meta( get_post()->p2p_id, 'type', true );
endwhile;

Сортировка связей, здесь проще :

p2p_register_connection_type( array(
'name' => 'posts_to_pages',
'from' => 'post',
'to' => 'page',
'sortable' => 'any'
) );

sortable — параметр может принимать значения ‘from’, ‘to’, ‘any’, по умолчанию  false.

Связать пользователя с постом :

p2p_register_connection_type( array(
    'name' => 'multiple_authors',
    'from' => 'article',
    'to' => 'user',
    'to_query_vars' => array( 'role' => 'editor' )
) );

 

Объектный синтаксис

// создать связь
p2p_type( 'connection_name' )->connect( $from, $to, array(
    'date' => current_time('mysql')
) );

// удалить
p2p_type( 'connection_name')->disconnect( $from, $to );

Стоит так же сказать пару слов об авторе плагина это  Silviu-Cristian Burcă это ведущий разработчик  WP-CLI с 2011 по 2014 год, автор более 30 плагинов репозитория WordPress, спикер и соорганизатор WordCamp  в Трансильвании, активный коммитер 3.1 версии WordPress (это кстати один из лучших на мой взгляд релизов, в плане создания функциональности, тот самый в котором довели до юзабильного состояния суперадминистраторов)

Безусловно это классный продукт, но по заявлению автора, он не будет далее развивать этот продукт, и целиком возложил эту миссию на сообщество, которое должно заняться этим по средствам комитов в github, честно говоря не знаю даже что там может  нуждаться в моем коммите, но русскую локализацию думаю я отправлю в ближайшее время.

В любом случае такой продукт не останется без внимания и подежки, однозначно можно брать в продакшн

4 Комментариев

    • Безусловно , я так понял что он с итерпрайзами сейчас работает и счастлив. Ну и молодец всяческих ему успехов, а плагин хороший настолько сделан по кодексу что я все время его ловлю себя на мысли что рассматриваю его как часть ядра

  1. Здравствуй, Владимир!
    На счет плагина «Posts-2-Posts»: у него имеется возможность заполнять динамические данные дополнительных полей при связке с постами:

    p2p_register_connection_type( array(
    ‘name’ => ‘posts_to_pages’,
    ‘from’ => ‘post’,
    ‘to’ => ‘page’,
    ‘fields’ => array(
    ‘count’ => array(
    ‘title’ => ‘Title field’,
    ‘type’ => ‘text’,
    ‘default_cb’ => ‘my_get_count’,
    ),
    )
    ) );
    function my_get_count( $connection, $direction ) {
    global $post;
    $key = ( ‘from’ == $direction ) ? ‘p2p_to’ : ‘p2p_from’;
    $post = get_post( $connection->$key );
    setup_postdata( $post );
    return get_the_excerpt();
    }

    Проблема в том, что этот callback ‘default_cb’ работает полноценно для типов полей ‘text’ и ‘textarea’. Но когда необходимо подгрузить данные для полей ‘select’, ‘checkbox’ и ‘radio’, то он перестает работать. Логика для этих полей предусмотрена так, чтобы изначально данные были прописаны статично, а динамически можно было сделать атрибут selected или checked.

    Можешь дать совет, как реализовать динамический вывод данных для полей ‘select’?

    • честно говоря мало что понял, но по логике вещей, то что вам нужно делается как то вот так:

      p2p_register_connection_type( array(
      ‘name’ => ‘posts_to_pages’,
      ‘from’ => ‘post’,
      ‘to’ => ‘page’,
      ‘fields’ => array(
      ‘count’ => array(
      ‘title’ => ‘Title field’,
      ‘type’ => ‘text’,
      ‘default_cb’ => ‘my_get_count’,
      ),
      ‘role’ => array(
      ‘title’ => ‘Role’,
      ‘type’ => ‘select’,
      ‘values’ => array( ‘engineer’, ‘support’, ‘manager’ ),
      ‘default_cb’ => ‘my_get_count_2’,
      ),
      )
      ) );

      function my_get_count_2( $connection, $direction ) {
      global $post;
      $key = ( ‘from’ == $direction ) ? ‘p2p_to’ : ‘p2p_from’;
      $meta = get_post_meta( $connection->$key, "role" );

      return $meta;
      }

      function my_get_count( $connection, $direction ) {
      global $post;
      $key = ( ‘from’ == $direction ) ? ‘p2p_to’ : ‘p2p_from’;
      $post = get_post( $connection->$key );
      setup_postdata( $post );

      return get_the_excerpt();
      }

      но это не точно, я не до конца понял что требуется

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *