Как сделать что бы WordPress сравнивал посты по post_name при импорте с xml?

Здравствуйте!
Ситуация такая: нужно импортировать множество записей в сайт на WordPress через .xml файлы с помощью плагина WordPress Importer.
Проблема в том что этот плагин что бы избежать дублирования постов сравнивает их заголовки (post_title) и дату создания (post_date) с заголовками и датой существующих постов на сайте.
А мне нужно что бы такая проверка проводилась по названию записи (post_name). Т. е. если название любого существующего поста совпадает с импортируемым то пост не будет добавлен.
Я попробовал внести изменения в файл плагина (его код: pastie.org/9749118#51), но это не дало результата.
Я пробовал заменить в строке 557
$post_exists = post_exists( $post['post_title'], '', $post['post_date'] );

на
$post_exists = post_exists( $post['post_name'], '', $post['post_date'] );

Это не дало результата.
Пожалуйста, подскажите что нужно изменить в коде плагина что бы он сравнивал посты только по post_name.
Вот фрагмент который по моему мнению нужно отредактировать:
pastie.org/9749126#3,5
  • Вопрос задан
  • 2611 просмотров
Решения вопроса 1
Просто заменив post_title на post_name - ничего не получится. Вот код функции post_exist wpseek.com/function/post_exists Вам нужно сделать точно такую же, только с другим именем, и чтобы проверка была не post_title в теле этой функции, а post_name. Тогда переменная $post_exist у вас будет отражать реальное существование поста по имени. А сейчас вы передаете имя, но функция сравнивает его с тайтлом.

приблизительно, добавляете такую функцию (можно в файл плагина, раз уж Вы взялись его курочить)
function post_exists_by_name($name, $content = '', $date = '') {
	global $wpdb;

	$post_name = wp_unslash( sanitize_post_field( 'post_name', $name, 0, 'db' ) );
	$post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
	$post_date = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) );

	$query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
	$args = array();

	if ( !empty ( $date ) ) {
		$query .= ' AND post_date = %s';
		$args[] = $post_date;
	}

	if ( !empty ( $name ) ) {
		$query .= ' AND post_name = %s';
		$args[] = $post_name;
	}

	if ( !empty ( $content ) ) {
		$query .= 'AND post_content = %s';
		$args[] = $post_content;
	}

	if ( !empty ( $args ) )
		return (int) $wpdb->get_var( $wpdb->prepare($query, $args) );

	return 0;
}


после чего, в плагине, в строке 557 (как вы написали) проверка будет выглядеть следующим образом

$post_exists = post_exists_by_name( $post['post_name'], '', $post['post_date'] );


только обратите внимание, что Вы еще передаете дату.. то есть существующие будут только те, что имеют одинаковое имя, и !!точно!! совпадающую дату. Если дата для одинаковости не критична, то просто

$post_exists = post_exists_by_name( $post['post_name] );


Писал быстро, возможно что то проглядел, пытался передать идею. Надеялся на Ваше знание php и Wordpress, раз полезли в код плагинов ;)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы