Сегодня на одном из сайтов, где было настроено автоматическое создание product-display рулсами при сохранении нового продукта, было обнаружено, что в процессе эксплуатации сайта не ко всем продуктам добавлялись дисплеи(из-за слабого хостинга). Надо было это исправить в кротчайшие сроки, поэтому приведённый ниже код возможно несколько варварский и топорный, но всё же может кому сгодится:
Можно просто его выполнить а можно на будущее создать правило, например по крону
event -> cron
action -> php
<?php
$commerce_type = "product";// Тип продукта commerce
$node_type = "product_display"; // Тип ноды(дисплей для продукта)
$commerce = commerce_product_load_multiple(array(), array('type' => $commerce_type)); // Массив всех продуктов
$nodes = node_load_multiple(array(), array('type' => $node_type));// Массив нод-дисплеев
$arr = array(); // Пустой массив
foreach($nodes as $node){
$arr[] = $node->field_produkt['und'][0]['product_id'];// Получаем массив идентификаторов продуктов, которые есть в дисплеях
}
foreach($commerce as $item){ // Проходимся в цикле по продуктам
if(array_search($item->product_id, $arr)){}
else{ // Если нет совпадения, то...
$node = new stdClass(); // ...создаём новую ноду-дисплей, где...
$node->type = $node_type;//тип ноды-дисплея
$node->title = $item->title; //Заголовок (я беру из заголовка самого продукта)
$node->language = LANGUAGE_NONE; // Отношение к языку
$node->uid = 1; // uid автора
$node->status = 1; // Опубликовано или нет
$node->promote = 0; // Помещать на главную или нет
$node->field_produkt['und'][0]['value'] = $item->product_id; // Зачение поля-отношения к продукту (у меня машинное поле называется 'field_produkt', у Вас может быть что-то другое)
node_save($node); // Сохраняем ноду
}
}
?>