Что такое динамические связи между записями WordPress и зачем они нужны
В WordPress по умолчанию записи (посты) и страницы существуют отдельно, без явных связей между собой. Однако на практике часто возникает необходимость связывать записи друг с другом — например, показывать связанные статьи, товары, проекты или другие типы контента. Такие связи делают сайт более удобным для пользователей и улучшают внутреннюю перелинковку, что положительно влияет на SEO.
Динамические связи между записями — это не просто статические ссылки, а гибкие взаимосвязи, которые можно создавать и изменять программно или через интерфейс. Например, связь может быть как «родитель – потомок», так и «похожие записи» или «записи из одной категории с дополнительными условиями».
Реализация таких связей требует знания WordPress API, использования мета-полей, таксономий или даже кастомных таблиц. В этой статье мы рассмотрим несколько способов создания динамических связей, а также полезные плагины и примеры кода для их реализации.
Использование плагина Posts 2 Posts для создания связей между записями
Один из самых популярных и простых способов создать динамические связи — плагин Posts 2 Posts. Он позволяет создавать отношения «многие ко многим» между записями, страницами и кастомными типами записей.
Плагин не поддерживается официально уже несколько лет, но до сих пор работает стабильно и широко используется.
Установка и настройка Posts 2 Posts
Плагин доступен на GitHub: https://github.com/scribu/wp-posts-to-posts. Для установки скачайте и загрузите папку плагина в директорию wp-content/plugins, затем активируйте в админке.
Далее в файле functions.php темы или в отдельном плагине добавьте регистрацию связи:
function wplinks_register_post_connections() {
if ( ! function_exists( 'p2p_register_connection_type' ) ) {
return;
}
p2p_register_connection_type( array(
'name' => 'articles_to_projects',
'from' => 'post',
'to' => 'project', // кастомный тип записи
'cardinality' => 'many-to-many',
'admin_box' => array(
'show' => 'both',
'context' => 'advanced'
),
) );
}
add_action( 'p2p_init', 'wplinks_register_post_connections' );После этого в админке постов и проектов появится мета-бокс для создания связей. Вы можете выбирать связанные записи вручную — эти связи динамические и можно управлять ими через API.
Вывод связанных записей в шаблоне
Чтобы вывести связанные записи, используйте следующий код в шаблоне:
function wplinks_show_connected_projects() {
global $post;
$connected = new WP_Query( array(
'connected_type' => 'articles_to_projects',
'connected_items' => $post,
'nopaging' => true,
) );
if ( $connected->have_posts() ) {
echo '<ul>';
while ( $connected->have_posts() ) {
$connected->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
}
wp_reset_postdata();
}Этот код можно вставить в single.php или в любой другой шаблон для вывода связанных элементов.
Создание связей через кастомные мета-поля и ACF
Если вам не подходит Posts 2 Posts или вы хотите более современный и поддерживаемый способ, используйте плагин Advanced Custom Fields (ACF). С помощью поля «Связь» (Relationship) можно выбирать связанные записи прямо в админке.
Преимущество ACF — визуальный интерфейс, поддержка разных типов полей и гибкость.
Настройка связи в ACF
В админке ACF создайте группу полей для нужного типа записи. Добавьте поле Relationship, в настройках укажите типы записей, которые можно выбирать.
Например, для поста можно добавить поле «Связанные проекты», которое позволит выбирать несколько записей типа «project».
Вывод связанных записей в шаблоне
function wplinks_show_related_projects_acf() {
$projects = get_field('related_projects'); // ключ поля из ACF
if ( $projects ) {
echo '<ul>';
foreach ( $projects as $project ) {
echo '<li><a href="' . get_permalink($project->ID) . '">' . get_the_title($project->ID) . '</a></li>';
}
echo '</ul>';
}
}Такой способ очень удобен, если нужно вручную связывать записи без дополнительного программирования.
Динамические связи на основе таксономий и пользовательских запросов
Иногда достаточно использовать таксономии, чтобы связать записи по общим терминам (например, категориям, тегам или кастомным таксономиям). При этом связи будут динамическими и не требуют ручного ввода.
Например, вывод связанных записей, которые имеют ту же категорию:
function wplinks_show_related_by_category() {
global $post;
$categories = wp_get_post_categories( $post->ID );
if ( ! empty( $categories ) ) {
$args = array(
'category__in' => $categories,
'post__not_in' => array( $post->ID ),
'posts_per_page' => 5
);
$related = new WP_Query( $args );
if ( $related->have_posts() ) {
echo '<ul>';
while ( $related->have_posts() ) {
$related->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
}
wp_reset_postdata();
}
}Однако такой способ менее гибкий — нет явных связей, только общие таксономии.
Реализация кастомных связей через пользовательские таблицы
Для сайтов с большим объемом данных и сложными связями можно создавать отдельные таблицы в базе данных для хранения связей между записями. Это повышает производительность и дает полный контроль.
Для работы с такими таблицами можно использовать стандартные WPDB методы, например:
global $wpdb;
$table_name = $wpdb->prefix . 'wplinks_connections';
// Создание таблицы (один раз)
function wplinks_create_links_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wplinks_connections';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
post_from bigint(20) unsigned NOT NULL,
post_to bigint(20) unsigned NOT NULL,
PRIMARY KEY (id),
KEY post_from (post_from),
KEY post_to (post_to)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
// Добавление связи
function wplinks_add_connection($from, $to) {
global $wpdb;
$table_name = $wpdb->prefix . 'wplinks_connections';
$wpdb->insert( $table_name, array(
'post_from' => $from,
'post_to' => $to
) );
}
// Получение связанных записей
function wplinks_get_connections($post_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'wplinks_connections';
$results = $wpdb->get_col( $wpdb->prepare(
"SELECT post_to FROM $table_name WHERE post_from = %d",
$post_id
) );
return $results;
}Такой подход требует знаний SQL и аккуратности, но отлично подходит для сложных проектов.
Полезные плагины для управления внутренними ссылками и связями
Кроме описанных способов, можно использовать плагины, которые автоматизируют создание внутренних ссылок и связей между записями:
- Clearfy Pro — инструмент для оптимизации и управления ссылками на WordPress.
- WPRemark — плагин для управления комментариями и внутренними ссылками.
Эти плагины помогут дополнительно улучшить внутреннюю структуру сайта и упростить работу с ссылками.
Выводы и рекомендации по созданию динамических связей
При выборе способа создания связей ориентируйтесь на задачи и масштаб проекта. Для простых случаев подойдет ACF или таксономии, для более продвинутых — Posts 2 Posts или кастомные таблицы.
Обязательно продумывайте, как пользователи будут управлять связями и как они должны отображаться на сайте. Тестируйте производительность и удобство админки.
И не забывайте о SEO — грамотная внутренняя перелинковка повышает видимость сайта и улучшает поведенческие факторы.