Сегодня я хочу рассказать вам про один замечательный плагин с говорящим названием Posts 2 Posts.
Если коротко этакой универсальный способ двухсторонние связи любых двух типов постов (post_type), по схеме один ко многим без использования таксономий.
Это нечто похожее на модуль References в Drupal 7 если он вам знаком, но другой.
Это нечто среднее между метками у постов и отношением дочерняя — родительская у станиц:
Если вы еще не поняли что не использовать 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 с помощью которых можно выводить связанные посты.
так же есть гибкой настройки метебокса в админке, можно настроить подписи ко всему что только можно , можно создать лимиты на количество связей, выпадающий список или даже кастомный метабокс.
Так же имеется ряд дополнительных возможностей например создавать дополнительные поля с помощью аргумента 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, честно говоря не знаю даже что там может нуждаться в моем коммите, но русскую локализацию думаю я отправлю в ближайшее время.
В любом случае такой продукт не останется без внимания и подежки, однозначно можно брать в продакшн
Автор давно забил на ВП вообще, а не только на этот продукт http://scribu.net/blog/left-wordpress.html
Безусловно , я так понял что он с итерпрайзами сейчас работает и счастлив. Ну и молодец всяческих ему успехов, а плагин хороший настолько сделан по кодексу что я все время его ловлю себя на мысли что рассматриваю его как часть ядра
Здравствуй, Владимир!
На счет плагина «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();
}
но это не точно, я не до конца понял что требуется
А есть похожее решение сейчас?
не то что бы я сейчас следу, но кажется этот все и ещё познание все ещё работает