1. Использование плагинов
Если вы хотите реализовать связь между постами без программирования, можно использовать готовые плагины:
- Advanced Custom Fields (ACF)
ACF позволяет создать произвольное поле (поле «Post Object») и связывать посты. Вот как это сделать:- Установите и активируйте плагин ACF.
- Создайте группу полей с типом поля «Post Object» или «Relationship».
- Привяжите группу полей к нужным типам записей.
- Отобразите связи в шаблонах, используя функцию
get_field()
.
- Pods Framework
Плагин позволяет легко создавать связи между записями, таксономиями и даже пользовательскими таблицами. Отличается гибкостью. - Toolset Types
Еще один мощный плагин для работы с пользовательскими типами записей и связями.
2. Создание произвольного мета-поля
Можно использовать мета-поля для хранения ID связанных постов.
Шаги:
- Добавьте поле в мета-боксе для записи, где можно выбрать другой пост:
function add_custom_metabox() {
add_meta_box(
'post_relationship_metabox',
'Связь с другим постом',
'render_post_relationship_metabox',
'post',
'side',
'default'
);
}
add_action('add_meta_boxes', 'add_custom_metabox');
function render_post_relationship_metabox($post) {
$connected_post_id = get_post_meta($post->ID, '_connected_post', true);
?>
<label for="connected_post">Выберите связанный пост:</label>
<select name="connected_post" id="connected_post">
<option value="">Нет</option>
<?php
$posts = get_posts(['post_type' => 'post', 'posts_per_page' => -1]);
foreach ($posts as $p) {
$selected = ($p->ID == $connected_post_id) ? 'selected' : '';
echo "<option value='{$p->ID}' $selected>{$p->post_title}</option>";
}
?>
</select>
<?php
}
function save_post_relationship_metabox($post_id) {
if (isset($_POST['connected_post'])) {
update_post_meta($post_id, '_connected_post', sanitize_text_field($_POST['connected_post']));
}
}
add_action('save_post', 'save_post_relationship_metabox');
- Используйте мета-данные для получения связанного поста:
$connected_post_id = get_post_meta($post->ID, '_connected_post', true);
if ($connected_post_id) {
$connected_post = get_post($connected_post_id);
echo "Связанный пост: <a href='" . get_permalink($connected_post) . "'>{$connected_post->post_title}</a>";
}
3. Использование пользовательских таблиц
Для сложных структур данных можно создать отдельную таблицу в базе данных для хранения связей.
Шаги:
- Создайте таблицу в базе данных, например, через
register_activation_hook
:
global $wpdb;
$table_name = $wpdb->prefix . 'post_relationships';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id_a mediumint(9) NOT NULL,
post_id_b mediumint(9) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
- Добавляйте связи между постами программно:
global $wpdb;
$wpdb->insert(
$wpdb->prefix . 'post_relationships',
['post_id_a' => $post_id_a, 'post_id_b' => $post_id_b]
);
- Извлекайте данные для отображения:
$results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}post_relationships WHERE post_id_a = $post_id_a");
foreach ($results as $row) {
$connected_post = get_post($row->post_id_b);
echo "Связанный пост: <a href='" . get_permalink($connected_post) . "'>{$connected_post->post_title}</a>";
}
4. WP_Query с таксономиями
Если посты можно объединить по категориям, используйте таксономии:
- Создайте кастомную таксономию:
function create_custom_taxonomy() {
register_taxonomy('post_relationship', 'post', [
'label' => 'Связь постов',
'hierarchical' => false,
'show_ui' => true,
'show_in_rest' => true,
]);
}
add_action('init', 'create_custom_taxonomy');
- Привяжите несколько постов к одной терминологии таксономии.
- Используйте
WP_Query
для выборки связанных постов:
$related_posts = new WP_Query([
'post_type' => 'post',
'tax_query' => [
[
'taxonomy' => 'post_relationship',
'field' => 'term_id',
'terms' => wp_get_post_terms($post->ID, 'post_relationship', ['fields' => 'ids']),
],
],
]);
while ($related_posts->have_posts()) {
$related_posts->the_post();
echo "<a href='" . get_permalink() . "'>" . get_the_title() . "</a>";
}
wp_reset_postdata();
Выбор подхода зависит от сложности проекта. Если нужна простота, используйте плагины. Если важно высокое кастомное решение, можно прибегнуть к созданию мета-полей или пользовательских таблиц.