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.

Источник: https://www.kobzarev.com/wordpress/wpai-cyrillic-attributes/

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

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: