Сброс постоянных ссылок на всех сайтах в сети WordPress (Multisite)

23 ноября, 2021
Как правильно сбросить постоянные ссылки на всех сайтах в сети WordPress (Multisite) если у Вас есть пользовательские типы записей (Custom Post Type)
Быстрая навигация по записе

Достаточно часто сталкиваемся с ситуацией, когда что-то нарушает структуру постоянных ссылки на всех сайтах в сети WordPress (Multisite установка), например, когда происходит ошибка активацией плагина по всей сети.

На одном сайте из сети это достаточно легко исправить, вручную зайдя в Настройки → Постоянные ссылки, в результате чего будут сброшены и восстановлены правила перезаписи, но если в сети несколько десятков сайтов, то это уже не практично и нужен способ сделать это автоматически для всех сайтов.

Типичный подход

Большинство попыток, которые мы видели, работали примерно так:

				
					/*
 * Это пример НЕПРАВИЛЬНОГО способа сбросить постоянные ссылки, не используйте его!
 * Используйте лучший способ, описанный ниже.
 */

function wplb_wrong_flush_rewrite_rules_on_multisite() {

    global $wp_rewrite;
    $sites = wp_get_sites( array( 'limit' => false ) );

    foreach ( $sites as $site_id ) {
        switch_to_blog( $site_id );
        $wp_rewrite->init();
        flush_rewrite_rules(); // Нельзя так делать после вызова switch_to_blog().
        restore_current_blog();
    }
    $wp_rewrite->init();

}
				
			

Функция отработает для основных типов записей POST и PAGE, но никак не повлияет на работу пользовательских типов записей CPT, а всё потому, что в работе функции switch_to_blog() есть несколько ограничений, и плагины – одна из таких вещей.

Итак, если кратко:

Если Вы используете мультисайт и у Вас есть пользовательские типы записей (CPT), которые регистрируются с помощью сторонних плагинов, то использование функции flush_rewrite_rules() бессмысленно!

Лучший способ

Достаточно просто удалить значение опции rewrite_rules, так как она будет автоматически сгенерирована заново при следующей загрузке сайта.

				
					$sites = get_sites( array(
    'number'  => 10000,
    'public'  => 1,
    'deleted' => 0,
) );

foreach ( $sites as $site ) {
    switch_to_blog( $site->blog_id );
    delete_option( 'rewrite_rules' );
    restore_current_blog();
}
				
			

На этом всё. Спасибо.

Оставить комментарий

Нужна помощь с WordPress WooCommerce плагинами темой оптимизацией ?

Упрощаем сложное, создаем впечатляющее!
100% без риска
Нет обязательств по найму
Бесплатная оценка
Давайте составим техническое задание!100% без рискаНет обязательств по наймуБесплатная оценка стоимости
Здравствуйте! Я асистент на основе искусственного интеллекта. Вы можете общаться со мной, как с человеком — задавайте вопросы, описывайте свои идеи и требования.

С удовольствием помогу вам составить техническое задание для вашего WordPress проекта.

Выберите подходящий вариант или опишите свою задачу в свободной форме, и я помогу вам составить четкий план действий, для оценки стоимости нашими разработчиками! 😊

Поможем вывести Ваш бизнес на новый уровень!

Проснувшись однажды утром после беспокойного сна, Грегор Замза обнаружил

Добро пожаловать!

Авторизуйтесь, чтобы продолжить

или

* Если аккунта у Вас еще нет, то он будет создан автоматически