Jak połączyć Google Merchant Center z Magento

Opublikował:‌ WG Admin
Kategorie: Rozszerzenia

Były sobie w Polsce porównywarki cenowe... Całkiem możliwe, że w ten sposób będziemy mówić gdy Google na dobre rozkręci w Polsce swoją nową usługę - Google Merchant Center.

Dlaczego spytacie? A po co płacić porównywarką za kliki, jeżeli wyszukiwarkowy gigant proponuje to samo ale wyświetlając produkt bezpośrednio na stronie z wynikami wyszukiwania? Możliwe, że się mylę ale osobiście nie znam osoby, która szuka produktu wchodząc bezpośrednio na strony porównywarek - wszystko zaczyna się (i prawdopodobnie będzie się kończyć) właśnie na stronie z wynikami.

Cała gałąź tego "biznesu" będzie musiała w jakiś sposób sobie z tym problemem poradzić, ale podejrzewam, że ich udział w rynku będzie stopniowo malał na rzecz Google.

Jako że jest to nowość na polskim podwórku, trzeba się do tych zmian przygotować i uzbroić nasze sklepy w plik (XML lub txt) z listą produktów do indeksacji. Oczywiście w repozytorium rozszerzeń znajdziemy kilka płatnych wtyczek, które nas przeprowadzą przez cały proces, ale osobiście wolę rozwiązania OpenSource, których liczba w przypadku systemu Magento sukcesywnie się kurczy.

Szukając w internecie darmowego rozwiązania natrafiłem na dość ciekawą stronę, na której znajduje się częściowe rozwiązanie omawianego zagadnienia: www.crearecommerce.co.uk/blog/magento-tutorials/products-in-google-updated.php

Opracowany przez autora skrypt działa i tworzy nam plik tekstowy, który możemy wyeksportować do usługi Google jednak żaden produkt nie zostanie zaindeksowany z powodu błędów... Trochę "podrasowałem" skrypt i dostosowałem go do polskich warunków.

Ale od początku (krok po kroku):

  1. Logujemy się do do usługi Google Merchant Center: www.google.com/merchants/‎ i tworzymy na nim konto podając wszelkie konieczne dane.
  2. Następnie konfigurujemy koszty wysyłki, czas realizacji itp.
  3. Łączymy nasze konto z platformą Google AdWords (za jego pomocą będziemy promować produkty w wyszukiwarce Google oraz Google Zakupy)
  4. Kolejny krok to testowy import listy produktów wykorzystujący plik, którego generowanie przedstawię za chwilę...
  5. Gdy Google zaakceptuje plik, możemy go zaimportować "na czysto"
  6. Po imporcie musimy poczekać... do kilku dni aż mechanizm sprawdzi i zaindeksuje nasze produkty
  7. Po zakończonym procesie pozostaje nam promowanie produktów w AdWords.

Tyle jeżeli chodzi o panel i jego działanie. Przejmy teraz do obsługi naszego sklepu i wygenerowania pliku z produktami.

Na początek proponuję stworzyć w głownym katalogu sklepowym nowy folder o nazwie np. "eksport" i w nim umieścić nasz skrypt php.

Kod:  Zaznacz wszystko  |  Linenumbers on/off
  1. <?php // Code updated 31/01/2014
  2.  
  3. @apache_setenv('no-gzip', 1);
  4. @ini_set('zlib.output_compression', 0);
  5. @ini_set('implicit_flush', 1);
  6.  
  7. function flush_buffers(){
  8. }
  9.  
  10. define('SAVE_FEED_LOCATION','google_simple.txt');
  11. require_once '../app/Mage.php'; // get our magento connection from the app folder
  12. Mage::app(); // or use Mage::app('default'); for eariler versions of magento
  13. Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND); // fix for catalog price rules
  14. try {
  15. $handle = fopen(SAVE_FEED_LOCATION, 'w');
  16. $heading = array('id','numer MPN','tytuł','opis','link','link do zdjęcia','cena','marka','typ produktu','stan dostępność','kategoria produktów google');
  17. $feed_line= implode("\t", $heading)."\r\n";
  18. $categories=array(7,8);
  19. fwrite($handle, $feed_line);
  20. $products = Mage::getModel('catalog/product')->getCollection();
  21. $products->joinField(
  22.     'qty',
  23.     'cataloginventory/stock_item',
  24.     'qty',
  25.     'product_id=entity_id',
  26.     '{{table}}.stock_id=1',
  27.     'left'
  28. );
  29. $products->addAttributeToFilter('qty', array('neq' => 0));
  30. $products->addAttributeToFilter('type_id','simple');
  31. $products->addAttributeToFilter('status', 1);
  32. $products->addAttributeToFilter('visibility', 4);
  33. $products->addAttributeToSelect('sku');
  34. $products->addAttributeToSelect('name');
  35. $products->addAttributeToSelect('description');
  36. $products->addAttributeToSelect('short_description');
  37. $products->addAttributeToSelect('url');
  38. $products->addAttributeToSelect('image');
  39. $products->addAttributeToFilter('price');
  40. $products->addAttributeToSelect('special_price');
  41. $products->addAttributeToSelect('manufacturer');
  42. $products->joinField('category_id',
  43.     'catalog/category_product',
  44.     'category_id',
  45.     'product_id=entity_id',
  46.     null,
  47.     'left'
  48. );
  49. $products->addAttributeToFilter('category_id', array('in' => array(1,2,3)));
  50.  
  51. $count = count($products);
  52. echo "Writing $count Products<br/>";
  53.  
  54. foreach($products as $product) {
  55. $product_data = array();
  56.  
  57. $product_data['sku'] = $product->getSku();
  58.  
  59. $product_data['mpn'] = $product->getSku(); // Thanks to jennifer for this
  60. //$product_data['qty'] = $product->getQty();
  61. $product_data['title'] = $product->getName();
  62. $description = str_replace('<p>&#160;</p>','',$product->getDescription());
  63. if($description == "" || empty($description) || !$description){
  64. echo "short<br/>";
  65. $product_data['description'] = str_replace('<p>&#160;</p>','',iconv("UTF-8","UTF-8//IGNORE",$product->getShortDescription()));
  66. } else {
  67. echo "long<br/>";
  68. $product_data['description'] = iconv("UTF-8","UTF-8//IGNORE",$description); // removes most the utf8 errors (doesnt like row if empty too!)
  69. }
  70. //$product_data['Deeplink'] = "http://".$_SERVER['HTTP_HOST']."/".$product->getUrlPath(); // thanks to hamish for this
  71. $product_data['Deeplink'] = $product->getProductUrl(); // thanks to <cite>webmaster128 for this one</cite>
  72. $product_data['image_link'] = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'catalog/product'.$product->getImage();
  73.  
  74. if($product->getSpecialPrice() != NULL){ // update to check for special price or discount
  75. $product_data['price'] = round($product->getSpecialPrice(),2).'PLN';
  76. } else {
  77. $product_data['price'] = round($product->getPrice(),2).'PLN';
  78. }
  79.  
  80. $brand = $product->getResource()->getAttribute('manufacturer')->getFrontend()->getValue($product);
  81.  
  82. if($brand != "No"){
  83. $product_data['brand'] = $product->getResource()->getAttribute('manufacturer')->getFrontend()->getValue($product);
  84. } else {
  85. if(Mage::app()->getStore()->getName() == "Default Store View"){
  86. $product_data['brand'] = $product->getName();
  87. } else {
  88. $product_data['brand'] = Mage::app()->getStore()->getName();
  89. }
  90. }
  91. $product_data['product_type'] = '';
  92. $product_data['condition'] = 'nowy';
  93. $product_data['availability'] = 'w magazynie'; // thanks to jennifer for this
  94.  
  95. foreach($product->getCategoryIds() as $_categoryId){
  96. $category = Mage::getModel('catalog/category')->load($_categoryId);
  97. $product_data['product_type'] .= $category->getName().', ';
  98. }
  99. $product_data['product_type'] = rtrim($product_data['product_type'],', ');
  100.  
  101. echo "Added Successfully ".$product->getName()." (".$product_data["sku"].")<br/>";
  102.  
  103. $thecat = "";
  104. $product_data["google_product_category"] = $thecat;
  105.  
  106. foreach($product_data as $k=>$val){
  107. $bad=array('"',"\r\n","\n","\r","\t");
  108. $good=array(""," "," "," ","");
  109. $product_data[$k] = str_replace($bad,$good,$val);
  110. }
  111.  
  112. $feed_line = implode("\t", $product_data)."\r\n";
  113. fwrite($handle, $feed_line);
  114. fflush($handle);
  115.  
  116. }
  117.  
  118. fclose($handle);
  119.  
  120. }
  121. catch(Exception $e){
  122. die($e->getMessage());
  123. }

Powyższy kod generuje TYLKO produkty proste (simple) o stanie magazynowym większym niż 0 o nazwie: google_simple.txt

Dodatkowo możemy zawęzić obszar indeksacli do kilku kategorii, które nas będą interesować. Do tego celu wykorzystywana jest 54 linijka kodu:

$products->addAttributeToFilter('category_id', array('in' => array(1,2,3)));

w której podajemy id kategorii nadpisując wartości (1,2,3). 

Po wszelkich modyfikacjach i umieszczeniu pliku w katalogu musimy mu nadać odpowiednie prawa aby mógł połączyć się z bazą danych sklepu oraz stworzyć i zapisać plik z danymi (atrybuty najlepiej ustawić dla całego katalogu) - 777. Po tych czynnościach nie pozostaje nam nic innego jak odpalić nasz plik i czekać na efekty w postaci pliku txt z danymi produktów.

Wasze komentarze:

comments powered by Disqus

Komentowanie - zasady

Autorzy komentarzy zamieszczonych w serwisie webground.pl publikują swoje opinie wyłącznie na własną odpowiedzialność.

Właściciel serwisu webground.pl nie ponosi żadnej odpowiedzialności za treści umieszczone przez użytkowników portalu