Ответы в темах

Просмотр 1 ответа (всего 1)
  • Функционал редиректа для постов в WordPress реализован из коробки. При изменении slug записи блога через панель управления, WordPress добавляет новую запись в таблицу БД wp_postmeta. У этой записи поле meta_key равно _wp_old_slug, а поле meta_value равно старому slug поста. И когда запрашивается пост, WordPress выполняет запрос к этой таблице БД, чтобы проверить, есть ли посты, у которых изменился slug. И если есть — выполняет редирект.

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

    
    /**
     * Filters term data before it is updated in the database.
     *
     * @since 4.7.0
     *
     * @param array  $data     Term data to be updated.
     * @param int    $term_id  Term ID.
     * @param string $taxonomy Taxonomy slug.
     * @param array  $args     Arguments passed to wp_update_term().
     */
    $data = apply_filters( 'wp_update_term_data', $data, $term_id, $taxonomy, $args );

    `
    Здесь есть массив $data, который содержит новый slug, и есть идентификатор таксономии $term_id — так что можно выполнить запрос к БД и получить старый slug (см. подходящие хуки в wp-includes/taxonomy.php). Если они не совпадают — нужно записать в БД старый slug, чтобы в будущем выполнять редирект.

    У меня получилось примерно так https://tokmakov.msk.ru/blog/item/391, но там было массовое изменение slug для постов, рубрик и меток — не то, что нужно, но дает общее представление способа реализации.

Просмотр 1 ответа (всего 1)