Верх страницы
Обложка к записи WP All Import: Атрибуты на русском языке в запросах XPath
Время для прочтения: 1 мин. 19 сек.

WP All Import: Атрибуты на русском языке в запросах XPath

XPath не позволяет делать запросы на кириллице вида {param[@name="Руль"]}, но мы попробуем обойти это ограничение.

Решение в лоб

Самым простым решением данной проблемы является отключение предварительной обработки XML.

Для этого просто добавьте этот код в файл functions.php вашей дочерней темы (или через плагин типа Code Snippets)

add_filter( 'is_xml_preprocess_enabled', '__return_false' );

После того как этот код будет добавлен, загрузите XML файл импорта, и запросы, подобные этому, станут возможными:

{param[@name="Тип снаряжения"]}
{param[@name="Рулевая колонка"]}
{param[@name="Педали"]}

Если же вам необходимо сохранить функционал предварительной обработки XML, есть другие решения.

Сценарий 1

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

Структура файла

<?xml version="1.0" encoding="utf-8"?>
<products>
	<product>
		<title>Product A</title>
		<sku>PRODA</sku>
		<price>10</price>
		<param name="Рулевая колонка">Example value here</param>
		<param name="Педали">Another value here</param>
	</product>
</products>

Код функции

function map_params( $names, $values, $key ) {
	if ( empty( $key ) ) return ''; 

	$result = '';
	$names_arr = explode( ",", $names );
	$values_arr = explode( ",", $values );

	if ( ! empty( $names_arr ) ) {
		foreach ( $names_arr as $i => $name ) { 
			if ( trim( pmxi_convert_encoding( $name, "UTF-8" ) ) == $key ) {
				$result = isset( $values_arr[ $i ] ) ? trim( $values_arr[ $i ] ) : '';
				break;
			}
		}
	}
	return $result;
}

Пример использования

[map_params({param/@name},{param},"Рулевая колонка")]

Сценарий 2

Если значения содержат запятые, то для их запроса необходимо использовать хук wpallimport_xml_row.

Структура файла

<?xml version="1.0" encoding="utf-8"?>
<products>
	<product>
		<title>Product A</title>
		<sku>PRODA</sku>
		<price>10</price>
		<param name="Рулевая колонка">Example, values, here</param>
		<param name="Педали">More, values, here</param>
	</product>
</products>

Код функции

function add_param_nodes( $node ) {
    $results = $node->xpath( 'param' );
	  $att = 'name';
    if ( !empty( $results ) ) {
        foreach( $results as $result ) {
			$atts = (string) $result->attributes();
			$atts = trim( pmxi_convert_encoding( $atts, "UTF-8" ) );
			if ( ! empty( $atts ) && $atts == 'Возраст' ) {
				$node->addChild( 'Возраст', $result->__toString() );
			} elseif ( ! empty( $atts ) && $atts == 'Пол' ) {
				$node->addChild( 'Пол', $result->__toString() );
			} elseif ( ! empty( $atts ) && $atts == 'Размер' ) {
				$node->addChild( 'Размер', $result->__toString() );
			}
		}
    }
    return $node;
}
add_filter( 'wpallimport_xml_row', 'add_param_nodes' );

Пример использования

Этот код добавляет 2 новых элемента XPath, которые можно использовать в шаблоне импорта:

{Рулеваяколонка[1]}
{Педали[1]}

Альтернативное решение

Вы можете преобразовать имя атрибута в HTML-сущности и запросить его таким образом. Например, для запроса «Рулевая колонка» можно использовать следующий XPath:

Источник: WP All Import — use XPath Query based on Cyrillic attribute value.

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

4 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Сергей
Сергей
10 месяцев назад

Спасибо, добрый человек! Сколько я времени убил в попытках понять почему атрибуты не грузятся! И отдельное спасибо за Cyr-To-Lat!

Dan Zakirov
Dan Zakirov
8 месяцев назад

Просто шикарно, правда у меня по началу не работало но потом произошли таинственные перемены, и всё стало как в лучших домах Лондона и Парижа

Предыдущая запись
Следующая запись

Давайте дружить
в Телеграме

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы