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

Вопрос или проблема

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

Все мои посты на сайте назначены подкатегориям, но не родительским категориям:

вставьте описание изображения здесь

Есть ли способ массово назначить посты их родительским категориям тоже?

вставьте описание изображения здесь

На моем сайте больше 3к постов, поэтому мне нужно найти быстрый способ сделать это. Я не нашел ни одного плагина, который мог бы помочь. Есть какие-либо предложения?

Будьте осторожны и запускайте это только один раз

$_query = new WP_Query( array(
    'post_type' => 'post',
    'posts_per_page' => -1,
 ) );
function complete_parent_category( $term_id, $dep=array() ) {
    $category = get_term( $term_id, 'category' );
    $dep[ $category->term_id ] = $category->slug;
    if( $category->parent ) {
      $dep = complete_parent_category( $category->parent, $dep );
    }
    return $dep;
}
echo '<pre>';
while( $_query->have_posts() ) {
  $_query->next_post();
  echo '<br /><strong>'.$_query->post->post_title .'</strong> |>> ';
  $cat_post = array();
  $cats = get_the_category( $_query->post->ID );
  if( count( $cats ) ) {
    foreach ($cats as $cat) {
      $cat_post[ $cat->term_id ] = $cat->slug;
      if( $cat->parent == 0 ) continue; 
      $category_object = get_term( $cat, 'category' );
      $cat_post = complete_parent_category( $cat->parent, $cat_post );
    }
  }
  if( count( $cats ) == count( $cat_post ) ) return;
  $data = array(
      'ID'           => $_query->post->ID,
      'post_category' => array_keys($cat_post),
  );
  wp_update_post( $data );
}

wp_reset_postdata();

exit();

Вставьте это в файл functions.php. Функция будет запущена, когда вы получите доступ к админ панели WordPress. Функция выполняется только один раз, потому что после первого запуска в базе данных устанавливается опция assign_parent_terms_completed. При последующих запусках функция проверяет эту опцию и не выполняется, если она установлена.

function assign_parent_terms_to_posts() {
    // Получить все посты
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1
    );
    $query = new WP_Query($args);

    // Если есть посты, пройтись по каждому из них
    if($query->have_posts()) {
        while($query->have_posts()) {
            $query->the_post();

            // Получить дочерние термины, назначенные посту
            $child_terms = get_the_terms(get_the_ID(), 'category');

            // Пройтись по каждому дочернему термину
            foreach($child_terms as $child_term) {
                // Если у термина есть родитель
                if(isset($child_term -> parent) && $child_term -> parent != 0) {
                    // Назначить родительский термин посту
                    wp_set_post_terms(get_the_ID(), array($child_term -> parent), 'category', true);
                }
            }
        }
    }
    wp_reset_postdata(); // Сбросить данные поста
}

// Присоединить функцию к действию 'admin_init'
add_action('admin_init', 'run_assign_parent_terms_once');

function run_assign_parent_terms_once() {
    // Проверить, была ли функция уже запущена
    if(!get_option('assign_parent_terms_completed')) {
        assign_parent_terms_to_posts();
        // Отметить функцию как запущенную
        update_option('assign_parent_terms_completed', true);
    }
}

Ответ или решение

Для того чтобы массово назначить родительские категории всем постам, которые уже находятся в дочерних категориях на вашем веб-сайте, можно воспользоваться специальным скриптом, который будет выполнен один раз. Следуйте этим шагам:

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

  2. Вставьте код в файл functions.php вашей темы: Этот код будет выполнять нужную задачу при каждом входе в админ-панель, однако он будет исполняться только один раз благодаря установке опции.
function assign_parent_terms_to_posts() {
    // Получаем все посты
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1
    );
    $query = new WP_Query($args);

    // Если посты есть, перебираем каждый из них
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();

            // Получаем дочерние термины, назначенные посту
            $child_terms = get_the_terms(get_the_ID(), 'category');

            // Перебираем каждый дочерний термин
            foreach ($child_terms as $child_term) {
                // Если у термина есть родитель
                if (isset($child_term->parent) && $child_term->parent != 0) {
                    // Назначаем родительский термин посту
                    wp_set_post_terms(get_the_ID(), array($child_term->parent), 'category', true);
                }
            }
        }
    }
    wp_reset_postdata(); // Сбрасываем данные поста
}

// Защищаем выполнение функции
add_action('admin_init', 'run_assign_parent_terms_once');

function run_assign_parent_terms_once() {
    // Проверяем, была ли функция уже выполнена
    if (!get_option('assign_parent_terms_completed')) {
        assign_parent_terms_to_posts();
        // Устанавливаем опцию для того, чтобы функция не выполнялась снова
        update_option('assign_parent_terms_completed', true);
    }
}
  1. Объяснение кода:

    • assign_parent_terms_to_posts: Эта функция выбирает все посты и проверяет, имеют ли они дочерние категории. Если у дочернего термина есть родитель, она назначает его в качестве термина для поста.
    • run_assign_parent_terms_once: Данная функция прикрепляет первую к ней, чтобы убедиться, что она выполнится только один раз. Если опция assign_parent_terms_completed уже установлена, функция не будет выполняться повторно.
  2. Запустите код: После добавления кода в functions.php, зайдите в админ-панель WordPress. Скрипт выполнится автоматически при первом входе.

  3. Удаление кода: После того как ярлык будет запущен и все посты будут скорректированы, рекомендуется удалить этот код из functions.php, чтобы избежать ненужного выполнения в будущем.

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

Оцените материал
Добавить комментарий

Капча загружается...