Перемещение записей у которых есть вхождение укзанной фразы в заголовке в указанную рубрику
Имеем:
Например, есть 3 категории:
- Макияж
- Волосы
- Маникюр
Есть 3 записи:
- Как красить волосы
- Фразцузский маникюр своими руками
- Как правильно наносить основу под макияж
Все эти записи раскиданы по разным категориям, могут даже все находиться в одной и той же категории.
Задача:
Записи, у которых ЗАГОЛОВОК содержит ключевую фразу "волосы" положить в категорию "Волосы", а ту категорию, которая сейчас установлена - снять, чтобы запись находилась только в одной категории (например была категория "Макияж", а стала "Волосы"). То есть в данном случае запись "Как красить волосы" перекладываем в категорию "Волосы", остальные записи пропускаем.
Это пример. По факту на живом сайте несколько ТЫСЯЧ записей, 30 категорий и порядка 100 ключевых фраз (некоторые фразы могут состоять из 2-3 слов), по которым нужно отсеивать записи. Надо это учесть, чтобы при запуске скрипта всё не легло (возможно я буду как-то поэтапно запускать).
попробуй плагин batch-move / только где-нибудь в тестовом варианте сначала /
там вроде можно отфильтровать записи по ключу. если получится, отпишешь.
Вот код который вам поможет:
/** * Перемещение записей у которых есть вхождение указанной фразы в заголовке в указанную рубрику. * * Для запуска добавьте в любой URL параметр запроса 'move_posts_to_cat': http://example.com?move_posts_to_cat * если записей очень много, и код не может обработать все за раз, то нужно использовать параметры offset и limit так: * * Будем обрабатывать максимум по сто записей, для этого по очереди переходим по следующим ссылкам: * * 1. http://example.com?move_posts_to_cat&limit=100&offset=0 * 2. http://example.com?move_posts_to_cat&limit=100&offset=100 * 3. http://example.com?move_posts_to_cat&limit=100&offset=200 * 4. http://example.com?move_posts_to_cat&limit=100&offset=300 * 5. и т.д. пока скрипт что-то выводит... * * v 0.1 */ if( isset($_GET['move_posts_to_cat']) ){ // run $movedata = array( // фраза в заголовке => название категории 'волосы' => 'Волосы', 'Запись с' => 'Дочерняя рубрика', ); $args = array( 'taxonomy' => 'category', 'post_type' => array('post'), 'offset' => (int) @ $_GET['offset'] ?: 0, // отступ сверху у запроса, сколько записей пропустить 'limit' => (int) @ $_GET['limit'] ?: 0, // ограничение на поиск записей ); move_posts_to_cat( $movedata, $args ); } function move_posts_to_cat( $movedata = array(), $args = array() ){ global $wpdb; wp_suspend_cache_addition( true ); // отключим кэширование $defargs = array( 'taxonomy' => 'category', 'post_type' => array('post'), 'offset' => 0, 'limit' => 0, ); $rg = (object) array_merge( $defargs, $args ); $rg->post_type = (array) $rg->post_type; $sql_limit = ''; if( $rg->offset || $rg->limit ){ if( $rg->offset && ! $rg->limit ) $rg->limit = 99999999999999; $sql_limit = "LIMIT $rg->offset, $rg->limit"; } $out = array(); // обрабатываем foreach( $movedata as $skey => $termname ){ // проверим есть ли указанная рубрика $term = get_term_by( 'name', $termname, $rg->taxonomy ); if( ! $term ){ $out[] = 'Рубрика не найдена: '. $termname; continue; } // получим записи для обработки $pids = $wpdb->get_col( "SELECT ID FROM $wpdb->posts WHERE post_title LIKE '%". esc_sql($wpdb->esc_like($skey)) ."%' AND post_status = 'publish' AND post_type IN ('". implode("','", $rg->post_type) ."') $sql_limit" ); if( ! $pids ) $out[] = 'Записей для перемещения нет.'; foreach( $pids as $pid ){ $termids = wp_set_object_terms( $pid, intval($term->term_id), $rg->taxonomy, $append = false ); if( is_wp_error($termids) ){ $out[] = 'Ошибка при перемещении записи '. $pid .': '. $termids->get_error_message(); // сообщение ошибки } else{ $out[] = 'Запись '. $pid .' перемещена в рубрику: '. $term->name; } } } echo $out ? '<ol><li>'. implode('</li><li>', $out) .'</li></ol>' : 'Ничего не перемещено'; exit; }Как использовать:
ВАЖНО:
Обязательно сделай дамп базы данных перед запуском.
ЗАМЕТКИ:
Код можно запускать много раз, он сам себе не мешает...
Если записей очень много, и код не может обработать все за раз, то нужно использовать параметры offset и limit. Будем обрабатывать по сто записей, для этого по очереди переходим по следующим ссылкам: