flexbe banner 468x60flexbe banner 728x90flexbe banner 930x180skillbox banner 468x60skillbox banner 728x90skillbox banner 930x180jivo banner 468x60jivo banner 728x90jivo banner 930x180

Как сделать post-to-post связь в WordPress?

1. Использование плагинов

Если вы хотите реализовать связь между постами без программирования, можно использовать готовые плагины:

  • Advanced Custom Fields (ACF)
    ACF позволяет создать произвольное поле (поле «Post Object») и связывать посты. Вот как это сделать:
    1. Установите и активируйте плагин ACF.
    2. Создайте группу полей с типом поля «Post Object» или «Relationship».
    3. Привяжите группу полей к нужным типам записей.
    4. Отобразите связи в шаблонах, используя функцию 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();

Выбор подхода зависит от сложности проекта. Если нужна простота, используйте плагины. Если важно высокое кастомное решение, можно прибегнуть к созданию мета-полей или пользовательских таблиц.

skillbox banner 480x320skillbox banner 728x90skillbox banner 120x600jivo banner 480x320jivo banner 728x90jivo banner 120x600beget banner 480x320beget banner 728x90beget banner 120x600

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 5 / 5. Количество оценок: 1

Оценок пока нет. Поставьте оценку первым.

Похожие посты

Как из стандартного типа записи post удалить «uncategorized» из ссылки в WordPress?

При создании записей в WordPress без указания категории по умолчанию им присваивается категория «Без рубрики» («Uncategorized»). Это приводит к появлению лишней части ссылки, например: https://example.com/bez-rubriki/nazvanie-zapisi. Если вы хотите убрать «bez-rubriki» из URL, то вам потребуется немного модифицировать настройки и добавить пользовательский код. В этой статье я покажу, как это сделать и избежать ошибок 404. Шаг…
Подробнее

Как на WordPress сделать архивную страницу со всеми авторами и структуру ссылок домен/authors/author

Чтобы сделать архивную страницу в WordPress, которая перечисляет всех авторов и предоставляет доступ к их страницам профилей через структуру ссылок вида домен/authors/author, нужно выполнить следующие шаги: 1. Создание пользовательской страницы для архива авторов Создайте файл шаблона: В вашей активной теме создайте файл page-authors.php. Это будет специальная страница, отображающая список всех авторов. Добавьте код для вывода…
Подробнее

Как сделать функцию для редиректа со старых ссылок сайта на новые в WordPress?

Для создания функции редиректа в WordPress со старых ссылок на новые, можно использовать файл .htaccess или написать специальный код в functions.php темы. Рассмотрим оба варианта: 1. Редирект через .htaccess Если вам нужно выполнить редиректы для множества старых URL, проще всего это сделать через файл .htaccess в корне вашего сайта. Для этого откройте или создайте файл…
Подробнее