Вопрос или проблема
Назначьте родительскую категорию всем записям, которые уже назначены дочерней категории.
Все мои посты на сайте назначены подкатегориям, но не родительским категориям:
Есть ли способ массово назначить посты их родительским категориям тоже?
На моем сайте больше 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);
}
}
Ответ или решение
Для того чтобы массово назначить родительские категории всем постам, которые уже находятся в дочерних категориях на вашем веб-сайте, можно воспользоваться специальным скриптом, который будет выполнен один раз. Следуйте этим шагам:
-
Создайте резервную копию: Прежде чем вносить изменения в базу данных, настоятельно рекомендуется создать резервную копию вашего веб-сайта и базы данных.
- Вставьте код в файл
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);
}
}
-
Объяснение кода:
assign_parent_terms_to_posts
: Эта функция выбирает все посты и проверяет, имеют ли они дочерние категории. Если у дочернего термина есть родитель, она назначает его в качестве термина для поста.run_assign_parent_terms_once
: Данная функция прикрепляет первую к ней, чтобы убедиться, что она выполнится только один раз. Если опцияassign_parent_terms_completed
уже установлена, функция не будет выполняться повторно.
-
Запустите код: После добавления кода в
functions.php
, зайдите в админ-панель WordPress. Скрипт выполнится автоматически при первом входе. - Удаление кода: После того как ярлык будет запущен и все посты будут скорректированы, рекомендуется удалить этот код из
functions.php
, чтобы избежать ненужного выполнения в будущем.
Следуя этим шагам, вы сможете массово назначить родительские категории для всех ваших постов и оптимизировать структуру категорий на вашем сайте.