WordPress как на ладони

Перемещение записей у которых есть вхождение укзанной фразы в заголовке в указанную рубрику

Имеем:

Например, есть 3 категории:

  • Макияж
  • Волосы
  • Маникюр

Есть 3 записи:

  • Как красить волосы
  • Фразцузский маникюр своими руками
  • Как правильно наносить основу под макияж

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

Задача:

Записи, у которых ЗАГОЛОВОК содержит ключевую фразу "волосы" положить в категорию "Волосы", а ту категорию, которая сейчас установлена - снять, чтобы запись находилась только в одной категории (например была категория "Макияж", а стала "Волосы"). То есть в данном случае запись "Как красить волосы" перекладываем в категорию "Волосы", остальные записи пропускаем.

Это пример. По факту на живом сайте несколько ТЫСЯЧ записей, 30 категорий и порядка 100 ключевых фраз (некоторые фразы могут состоять из 2-3 слов), по которым нужно отсеивать записи. Надо это учесть, чтобы при запуске скрипта всё не легло (возможно я буду как-то поэтапно запускать).

Заметки к вопросу:
shevan 7.6 лет назад

попробуй плагин batch-move / только где-нибудь в тестовом варианте сначала /

там вроде можно отфильтровать записи по ключу. если получится, отпишешь.

0
Гость
7.6 лет назад
  • 0
    Kama9616

    Вот код который вам поможет:

    /**
     * Перемещение записей у которых есть вхождение указанной фразы в заголовке в указанную рубрику.
     *
     * Для запуска добавьте в любой 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;
    }
    

    Как использовать:

    1. Скопируй его в файл темы functions.php
    2. Измени параметры под нужные. В частности массив $movedata
    3. Пройди по ссылке: http://example.com?move_posts_to_cat
    4. Смотри что получилось.

    ВАЖНО:

    Обязательно сделай дамп базы данных перед запуском.

    ЗАМЕТКИ:

    Код можно запускать много раз, он сам себе не мешает...

    Если записей очень много, и код не может обработать все за раз, то нужно использовать параметры offset и limit. Будем обрабатывать по сто записей, для этого по очереди переходим по следующим ссылкам:

    http://example.com?move_posts_to_cat&limit=100&offset=0
    http://example.com?move_posts_to_cat&limit=100&offset=100
    http://example.com?move_posts_to_cat&limit=100&offset=200
    http://example.com?move_posts_to_cat&limit=100&offset=300
    и т.д. пока скрипт что-то выводит...
    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация