Esportare da Drupal Commerce il data feed per Google Merchant Center

Google-Shopping-Ads

Dell’importanza di Google Shopping nella strategia di un e-commerce di successo ne avevo parlato qui in passato, presentando anche una soluzione plug and play per Ubercart.

Sul versante Drupal Commerce, per poter generare il feed di dati che permette al comparatore di importare i prodotti esiste un modulo contrib: commerce_gmerchant però nell’esperienza che ho accumulato lavorando con il prodotto sviluppato dai Commerce Guys è che ogni progetto fa storia a sè e si porta dietro le proprie peculiarità che difficilmente si riesce a razionalizzare a pochi denominatori comuni.
In parole povere: quasi impossibile creare un modulo che vada bene per tutti.

Meglio fare a mano, perchè con due strumenti semplici è possibile tramite Views esportare i dati, da importare in Google Merchant Center, adattando un vista creata appositamente per questo scopo, che interroga il database in base alla struttura dei dati e dei field presenti nel nostro store. Gli strumenti sono questi:

  • views_data_export: consente di estrarre i dati in diversi formati tra cui CSV, XLS, DOC, TXT, XML
  • image_url_formatter: consente di formattare gli output di un qualsiasi image field come una semplice url assoluta.

A questi due moduli, se ne aggiunge un terzo: views_php che viene in aiuto di tutti quei builder che hanno poca dimestichezza con la creazione di moduli custom: consente di inserire porzioni di PHP nei field della views che esporta i dati.
Però mi sento di sconsigliare questo tipo di pratiche. E bene sempre lasciare il “codice” fuori dal database.
Meglio agire in modo mirato su due hook che permettono con precisione quasi chirurgica di intervenire prima che la query venga eseguita, hook_views_query_alter, e prima che avvenga il render dei dati, hook_views_pre_render.

Questo esempio mostra come intervenire sulle condizioni della query.

function hook_views_query_alter(&$view, &$query) {
  // (Example assuming a view with an exposed filter on node title.)
  // If the input for the title filter is a positive integer, filter against
  // node ID instead of node title.
  if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {
    // Traverse through the 'where' part of the query.
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // If this is the part of the query filtering on title, chang the
        // condition to filter on node ID.
        if ($condition['field'] == 'node.title') {
          $condition = array(
            'field' => 'node.nid', 
            'value' => $view->exposed_raw_input['title'], 
            'operator' => '=',
          );
        }
      }
    }
  }
}

Questo invece come inserire delle informazioni aggiuntive al rendere della views.

function hook_views_pre_render(&$view) {
  $products_view = array('products', 'expired_products');  
  $results = &$view->result;
  foreach ($results as $key => $result) {
    if ($view->name == 'products') {
      $field_expiry_date = $result->_field_data['nid']['entity']->field_deal_expire;
      $expiry_date = _products_get_remaining_time($field_expiry_date['und'][0]['value']);
      $results[$key]->field_field_deal_expire[0]['rendered']['#markup'] = $expiry_date;
    }    
  }
}

Rispondi