Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Marketing - Référencement _ Google Merchant ou Google Products ou encore Google Shopping

Écrit par : yyoossssii 22 Oct 2010, 14:01

Bonjour,

Je suis tombé sur cet article:
http://actu.abondance.com/2010/10/google-shopping-disponible-en-france.html
ou encore
http://googlexxl.blogspot.com/2010/10/google-shopping-en-france.html

Est-ce que quelqu'un connait?
Y a t'il une contribution pour le fichier XML?

http://www.google.fr/products
http://www.google.fr/merchants/merchantdashboard

Pour céer le fichier les instructions sont la:
http://www.google.com/support/merchants/bin/answer.py?hl=fr&answer=188478

Yossi

Écrit par : milie000 22 Oct 2010, 14:11

Bonjour

je suis egalement a la recherche d une contribution pour le xml. Si jamais vous trouvez je suis preneuse.

Merci

Écrit par : dvf 23 Oct 2010, 14:23

cool

ben il y a le contrib export universel

cela sent le google checkout aussi

c'est bon sa smile.gif

Écrit par : yyoossssii 23 Oct 2010, 21:23

Bonsoir,

Non, il n'y rien de semblable dans export universel.

Merci quand meme.

J'ai essayé de faire quelque chose tous seul, mais google n'a pas trop aimé...

Voici le code:

Code
<?php


require('includes/application_top.php');

Header( 'Content-Type: text/xml' );

define ('DISPLAY_PRICE_WITH_TAX', true);

echo '<?xml version="1.0" encoding="ISO-8859-1"?>';
echo '<catalogue lang="FR" date="'.  strftime(DATE_FORMAT_SHORT). '">';

// On v?rifie la langue utilis?e dans le catalogue
$language_code = (isset($HTTP_GET_VARS['language']) && tep_not_null($HTTP_GET_VARS['language'])) ? $HTTP_GET_VARS['language'] : DEFAULT_LANGUAGE;

// Requ?te pour identifier les cat?gories existantes dans le catalogue
$included_categories_query = tep_db_query("SELECT c.categories_id, c.parent_id, cd.categories_name FROM " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd WHERE c.categories_id = cd.categories_id AND cd.language_id = FLOOR($languages_id)");

$inc_cat = array();

// Identification du nom de la cat?gorie, et l'id de la cat?gorie parent
while ($included_categories = tep_db_fetch_array($included_categories_query)) {
$inc_cat[] = array (
    'id' => $included_categories['categories_id'],
    'parent' => $included_categories['parent_id'],
    'name' => $included_categories['categories_name']);
}

$cat_info = array();
for ($i=0; $i<sizeof($inc_cat); $i++)
   $cat_info[$inc_cat[$i]['id']] = array (
   'parent'=> $inc_cat[$i]['parent'],
   'name'  => $inc_cat[$i]['name'],
   'path'  => $inc_cat[$i]['id'],
   'link'  => '' );

for ($i=0; $i<sizeof($inc_cat); $i++) {
$cat_id = $inc_cat[$i]['id'];
while ($cat_info[$cat_id]['parent'] != 0){
   $cat_info[$inc_cat[$i]['id']]['path'] = $cat_info[$cat_id]['parent'] . '_' . $cat_info[$inc_cat[$i]['id']]['path'];
   $cat_id = $cat_info[$cat_id]['parent'];
   }
$link_array = split('_', $cat_info[$inc_cat[$i]['id']] ['path']);
for ($j=0; $j<sizeof($link_array); $j++) {
   $cat_info[$inc_cat[$i]['id']]['link'] .= '&nbsp;<a href="' . tep_href_link(FILENAME_DEFAULT, 'cPath=' . $cat_info[$link_array[$j]]['path']) . '"><nobr>' . $cat_info[$link_array[$j]]['name'] . '</nobr></a>&nbsp;&raquo;&nbsp;';
   }
}

// Requ?te identifiant les produits disponibles dans le catalogue
$products_query = tep_db_query("SELECT p.*, pd.products_name, pd.products_description, pc.categories_id FROM " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " pc WHERE p.products_id = pd.products_id AND p.products_id = pc.products_id AND p.products_status = 1 AND pd.language_id = FLOOR($languages_id) ORDER BY pc.categories_id, pd.products_name");

$product_num = 0;

while($products = tep_db_fetch_array($products_query)) {

if (intval($products['manufacturers_id']) > 0) {
  $manufacturers_query = tep_db_query("SELECT manufacturers_name FROM " . TABLE_MANUFACTURERS . " WHERE manufacturers_id = " . $products['manufacturers_id']);
  $manufacturers_result = tep_db_fetch_array($manufacturers_query);
  $products['manufacturers_name'] = $manufacturers_result['manufacturers_name'];
}

$special_query = tep_db_query("SELECT specials_new_products_price  FROM " . TABLE_SPECIALS . " WHERE products_id = " . $products['products_id']);
if ($special_result = tep_db_fetch_array($special_query))
  $products['products_price'] = $special_result['specials_new_products_price'];

$product_num++;

echo '<etat>neuf</etat>';
echo '<descriptif><![CDATA['. substr(strip_tags(str_replace(array('<BR>','<br>'), "</P>\n<P>",html_entity_decode($products['products_description']))),0,245) .'...]]></descriptif>';
echo '<g:identifiant><![CDATA['. $products['products_id'] .']]></g:identifiant>';

echo '<lien><'. HTTP_SERVER . DIR_WS_HTTP_CATALOG . FILENAME_PRODUCT_INFO . '?products_id=' . $products['products_id'] .']]></lien>';
  echo '<g:prix><'.  $products['products_price'] .'><g:prix>';
echo '<titre><![CDATA['. $products['products_name'] .']]></titre>';


}

echo '</catalogue>';

require(DIR_WS_INCLUDES . 'application_bottom.php');
?>

Écrit par : dvf 24 Oct 2010, 12:27

MAIS SI GOOGLE , tu le fais en 3 sec avec universel export

Mon script étant personaliser , je peux pas poster car c est plus compatible avec la version en ligne


Écrit par : yyoossssii 24 Oct 2010, 22:17

Merci dvf.

J'ai travaillé sur universel export tu as raison, c'est plus simple, voici le code:

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.vaisonet.com
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("Google Marchant");
  
  
  $header = 'Content-Type: text/html; charset=utf-8';
  $header2 = 'Content-Disposition: "inline; google-merchant.txt"';
  



$head = "titre\t&#233tat\tdescriptif\tid\tlien\tprix\n";

  
$output .= netoyage_html($products['products_name'], 80) . "\t";
$output .= "neuf\t";
$output .= netoyage_html($products['products_description'], 160) ."\t";
$output .= $product_num ."\t";
$output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre ."\t";
$output .= $regular_price ."\n";



    
  $foot = '';

?>



Yossi

Écrit par : Acuponctus 26 Oct 2010, 18:49

Bonsoir et merci pour ce code.

pour ma part j'ai donc entrepris l'installation de cette contrib pour utiliser google merchant.
cependant je ne trouve pas l'endroit ou les fichiers sont créés ?

dans le répertoire export pour les fichiers txt ?
si c'est oui ca ne met rien dedans ?
a la racine ?

non plus.

faut il créer un fichier vide dans un premier temps ?

Merci

Écrit par : yyoossssii 26 Oct 2010, 21:03

Bonsoir Acuponctus.

Il faut dabord installer la contribution http://www.oscommerce.com/community/contributions,5092.

Ensuite il faut créer un fichier google.php avec le code ci-dessous et le mettre dans catalog/includes/modules/ExU.

Puis ouvre Export Universel dans ton admin, choisi le format "Google Marchant" dans la liste et le tour est joué!

Yossi

Écrit par : Jesam 27 Oct 2010, 08:46

yyoossssii avec le code que tu fournis je n'arrive pas à insérer des produits.
J'ai créé à la main un fichier texte et là je peux bien insérer mes produits dans Google Merchant.
Par contre, compte tenue de mes descriptions et des informations complémentaires que je souhaite passer, j'aimerais créer un fichier XML, et là je bute

J'obtiens bien un tel fichier mais compte tenu de mes connaissances je n'arrive pas bien à le construire.

Code
<?php
/*
$Id: export.php, version 1.3 Mardi 18 Mars 2008 Vaisonet Exp $

Contribution Export universel

http://www.vaisonet.com
Copyright © 2008 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("Google Merchant");
  
// les promotions sont elles 1->solde,2->autre promotions
if ($reduc) $sale = 2;
  
  $header = 'Content-Type: text/xml';


  
  $head = '<?xml version="1.0" encoding="ISO-8859-1"?>' .chr(10) . '<catalogue lang="'.$lang_export.'" date="'.  date('Y-m-d H:i'). '" GMT="+1" version="2.0">'.chr(10);
  
  $output .= '<item>';
  $output .= '<product place="'.$product_num.'">'."\n";
  $output .= '<gid>'. $products['products_id'] .'</gid>'.chr(10);
  $output .= '<title>'. $products['products_name'] .'</title>'.chr(10);
  $output .= '<link>'.  tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre .'</link>'.chr(10);
  $output .= '<price>'. $regular_price .' EUR'.'</price>'.chr(10);
  $output .= '<description>'. substr(strip_tags(str_replace(array('<BR>','<br>'), "</P>\n<P>",html_entity_decode($products['products_description']))),0,245) .'></description>'.chr(10);
  $output .= '<condition>'.' neuf'.'</condition>'.chr(10);
  $output .= '<brand>'.$products['manufacturers_name'].'</brand>'.chr(10);
  $output .= '<image_link>'. HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] .'</image_link>'.chr(10);
  
  $output .= '<shipping>'."\n";
  $output .= '<country>'.'FR'.'</country>'.chr(10);
  $output .= '<service>'.'Lettre Max'.'</service>'.chr(10);
  $output .= '<price>'.'4,00'.'</price>'.chr(10);
  $output .= '</shipping>';
  
  
  $output .= '</product>';
  $output .= '</item>';
  
  $foot = '</catalogue>';
?>


Problèmes rencontrés
1/ Je veux mettre dans les 2 premières lignes
<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0
xmlns:g=“http://base.google.com/ns/1.0”>

2/ si je remplace <condition> par <g:condition> le format n'est plus reconnu (je ne peux créer de fichier XML)

Merci pour l'aide

Écrit par : Garga 27 Oct 2010, 09:32

Bonjour,

as tu essayé http://addons.oscommerce.com/info/1513?
Je suis en train de test donc je peu pas te certifier que ca fonctionne.

Écrit par : Acuponctus 27 Oct 2010, 10:36

Bonjour yyoossssii

la contrib est installée
le fichier google merchant aussi
il s'affiche bien dans le menu déroulant, et lorsque je choisi en cache j'indique google-merchant.txt
mais la question est la suivante :
a quel emplacement est créé le fichier ?

http://www.monsite.fr/export/google-merchant.txt ?

si c'est le cas ca ne créé rien du tout et ne me mets pas de message d'erreur.

Écrit par : Jesam 27 Oct 2010, 11:05

En bas de ta fenêtre tu as Url générée : du genre http://www.nomdusite/export.php?format=google-merchant.php&p=code&language=fr&libre=

Tu ouvres une nouvelle fenêtre dans ton navigateur et colle l'URL. Tu vois ainsi si c'est correct.

Ensuite pour rapidement comtrôler, copie uniquement les données de ton 1er article dans un fichier texte, que tu upload depuis Google Merchant, Fichier de données. Puis importation manuelle. Tu attends 2 minutes environ et tu vois si ton produit est importé ou si tu as des erreurs dans le code du fichier.

Tiens nous au courant, pour moi avec le fichier texte issu du code ci-dessus ça ne fonctionne pas.

Écrit par : Acuponctus 27 Oct 2010, 13:40

oui j'ai bien ceci :
www.gtrucmuch.com/export.php?format=google-txt.php&p=trucmuch&language=fr&cache=true&fichier=google-merchant.txt

j'ai une page blanche avec la fonction cache.
si j'ai bien compris, ca doit générer un fichier qui porte le nom google-merchant.txt

ma question est ou est ce fichier généré ?

Écrit par : Jesam 27 Oct 2010, 14:41

Pourquoi parles-tu de fonction cache ?

Tu colles l'url sur un nouvel onglet de ton navigateur et tu dois avoir plein de texte sur ta page.

Ensuite pour contrôler, ne prends que ton premier article et tu fais un copier/coller dans un fichier texte pour vérifier que les données sont bien prises en compte par GG Merchant.

Écrit par : Jesam 27 Oct 2010, 16:15

Voici donc le fichier pour générer un XML pour Google Merchant.
Il y a plusieurs points à retoucher mais la génération du XML se fait sans problème

Code
<?php
/*
$Id: export.php, version 1.3 Mardi 18 Mars 2008 Vaisonet Exp $

Contribution Export universel pour Google Merchant
Réalisation Jesam 27/10/2010

http://www.vaisonet.com
Copyright © 2008 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("Google Merchant");
  
// les promotions sont elles 1->solde,2->autre promotions
if ($reduc) $sale = 2;
  
  $header = 'Content-Type: text/xml';


  
  $head = '<?xml version="1.0" encoding="ISO-8859-1"?>' .chr(10) . '<catalogue lang="'.$lang_export.'" date="'.  date('Y-m-d H:i'). '" GMT="+1" version="2.0">'.chr(10);
  
  
  
  
  $output .= '<item>';
  $output .= '<id>'. $products['products_id'] .'</id>'.chr(10);
  $output .= '<title>'. $products['products_name'] .'</title>'.chr(10);
  $output .= '<link>'.  tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre .'</link>'.chr(10);
  $output .= '<price>'. $regular_price .'</price>'.chr(10);
  $output .= '<description>'. substr(strip_tags(str_replace(array('<BR>','<br>'), "</P>\n<P>",html_entity_decode($products['products_description']))),0,245) .'></description>'.chr(10);
  $output .= '<condition>'.' new'.'</condition>'.chr(10);
  $output .= '<brand>'.$products['manufacturers_name'].'</brand>'.chr(10);
  $output .= '<image_link>'. HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] .'</image_link>'.chr(10);
  $output .= '<shipping>'."\n";
  $output .= '<country>'.'FR'.'</country>'.chr(10);
  $output .= '<service>'.'Lettre Max'.'</service>'.chr(10);
  $output .= '<price>'.'4,00'.'</price>'.chr(10);
  $output .= '</shipping>';

  
  
  $output .= '</item>';
  
  
  $foot = '</catalogue>';
?>


Ensuite je retouche à la main le fichier généré pour obtenir ceci (je ne mets qu'un article smile.gif
Code
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:g="http://base.google.com/ns/1.0">
  <channel>
    <title>Titre de mon site</title>
    <description>Description de mon site</description>
    <link>http://www.monsite.fr</link>
    <item>
  <g:id>182</g:id>
  <title>Recharge Tombow Roller Bleu</title>
  <g:link>http://www.monsite.fr/recharge-tombow-roller-bleu-p-182.html</g:link>
  <g:price>2.4999988</g:price>
  <g:description>- Recharges pour stylo roller Tombow, couleur bleu - Existe en taille XF-0,3mm, F-0,5mm, M-0,7mm</g:description>
  <g:condition>new</g:condition>
  <g:brand>TOMBOW</g:brand>
  <g:image_link>http://www.monsite.fr/images/tombow/Tombow-bk-lp03-16 (Custom).jpg</g:image_link>
  <g:shipping>
  <g:country>FR</g:country>
  <g:service>Lettre Max</g:service>
  <g:price>4,00</g:price>
  </g:shipping>
  </item>
  </channel>
</rss>


Vous voyez donc que j'ajoute à "la main" des g: et du texte dans le head et en foot.

Si certains savent comment l'intégrer dans le fichier php, ce serait parfait.

Écrit par : mickael34 28 Oct 2010, 20:02

Pour info, la technique en l'état de Yossi ne fonctionne pas.

Oui, le fichier est bien accepté dans Google Shopping et des produits sont bien présents.
Par contre chaque flux est soumis à une validation manuelle avant mise en ligne !

Je viens de recevoir un mail d'un technicien Google qui m'a contrôlé le flux et... refoulé !
Car pas d'images présentes avec ce fichier d'export ! Si vos fichiers n'ont pas d'images, GG ne vous l'acceptera pas lors du contrôle manuel du flux.

J'essaye de trouver la soluce et je poste le cas échéant.

Écrit par : kakashi 28 Oct 2010, 20:06

Voilà un élément qui pourra t'aider. C'est parfaitement validé par google. Mon seul problème c'est que le fichier ne boucle pas avec la contrib export universel. Pour le moment j'ai pas déterminé la raison.


Code
  $comp = array(" Google Achat");
    
  $header = 'Content-Type: text/xml';

  $head = '<?xml version="1.0" encoding="UTF-8"?>' .chr(10) . '<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">' .chr(10);
  
    $output = '<channel>'."n";  
      $output .= '<title>' . STORE_NAME .' </title>'."n";  
      $output .= '<description>' . STORE_NAME .'</description>'."n";
      $output .= '<link>' . HTTP_SERVER .'</link>'."n";
      $output .= '<item '. $products['products_id'] .'>'."n";  
        $output .= '<g:id>'. $products['products_id'] .'</g:id>'.chr(10);          
        $output .= '<title>'. $products['products_name'] .'</title>'.chr(10);
        $output .= '<g:link>'.  tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre .'</g:link>'.chr(10);
        $output .= '<g:price>'. $regular_price .' EUR</g:price>'.chr(10);
        $output .= '<g:description>'. substr(strip_tags(str_replace(array('<BR>','<br />'), "</P>n<P>",utf8_encode(html_entity_decode($products['products_description'])))),0,10000) .'...></g:description>'.chr(10);
        $output .= '<g:condition>new</g:condition>'.chr(10);
        $output .= '<gtin>'. $products['products_ean'] .'</gtin>'.chr(10);
        $output .= '<g:brand>'. $products['manufacturers_name'] .'</g:brand>'.chr(10);
        $output .= '<g:mpn>'. $products['products_model'] .'</g:mpn>'.chr(10);
        $output .= '<g:image_link>'. HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] .'</g:image_link>'.chr(10);
        $output .= '<g:product_type>'.$cat_info[$products['categories_id']]['name'] . '</g:product_type>'.chr(10);
        $output .= '<g:featured_product>'.$featured_product .'</g:featured_product>'.chr(10);
     $output .= '</item>'.chr(10);
   $output .= '</channel>

Écrit par : mickael34 28 Oct 2010, 20:29

Merci, je viens de renvoyer avec ton code :

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.vaisonet.com
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/


$comp = array(" Google Achat");
    
  $header = 'Content-Type: text/xml';

  $head = '<?xml version="1.0" encoding="UTF-8"?>' .chr(10) . '<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">' .chr(10);
  
    $output = '<channel>'."n";  
      $output .= '<title>' . STORE_NAME .' </title>'."n";  
      $output .= '<description>' . STORE_NAME .'</description>'."n";
      $output .= '<link>' . HTTP_SERVER .'</link>'."n";
      $output .= '<item '. $products['products_id'] .'>'."n";  
        $output .= '<g:id>'. $products['products_id'] .'</g:id>'.chr(10);          
        $output .= '<title>'. $products['products_name'] .'</title>'.chr(10);
        $output .= '<g:link>'.  tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre .'</g:link>'.chr(10);
        $output .= '<g:price>'. $regular_price .' EUR</g:price>'.chr(10);
        $output .= '<g:description>'. substr(strip_tags(str_replace(array('<BR>','<br />'), "</P>n<P>",utf8_encode(html_entity_decode($products['products_description'])))),0,10000) .'...></g:description>'.chr(10);
        $output .= '<g:condition>new</g:condition>'.chr(10);
        $output .= '<gtin>'. $products['products_ean'] .'</gtin>'.chr(10);
        $output .= '<g:brand>'. $products['manufacturers_name'] .'</g:brand>'.chr(10);
        $output .= '<g:mpn>'. $products['products_model'] .'</g:mpn>'.chr(10);
        $output .= '<g:image_link>'. HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] .'</g:image_link>'.chr(10);
        $output .= '<g:product_type>'.$cat_info[$products['categories_id']]['name'] . '</g:product_type>'.chr(10);
        $output .= '<g:featured_product>'.$featured_product .'</g:featured_product>'.chr(10);
     $output .= '</item>'.chr(10);
   $output .= '</channel>'."n";
  
?>


On verra !

Écrit par : Jesam 28 Oct 2010, 22:14

mickael34, je n'obtiens que des erreurs avec ton code.

Peux-tu détailler ton process pour obtenir ton fichier XML

Mon process, je colle l'url générée sur un nouvel onglet de mon navigateur et j'ai le texte sur la page. Puis je sauvegarde.
Puis

Écrit par : kakashi 28 Oct 2010, 22:36

attention à cette ligne de code si vous n'êtes pas en uft8

Code
        $output .= '<g:description>'. substr(strip_tags(str_replace(array('<BR>','<br />'), "</P>n<P>",utf8_encode(html_entity_decode($products['products_description'])))),0,10000) .'...></g:description>'.chr(10);
par
        $output .= '<g:description>'. substr(strip_tags(str_replace(array('<BR>','<br />'), "</P>n<P>",$products['products_description'])),0,10000) .'...></g:description>'.chr(10);



de plus à la fi n de la ligne il doit y avoir ceci "\n"; et non "n"; . je ne sais pourquoi ils ont disparu.

Sinon pour voir le résultat, editez la source du fichier généré ou enregistrer le sur serveur et rapatrier le sur l'ordi

il se peut aussi que cette ligne ne soit pas bonne car je l'ai inséré après le test.
Code
$output .= '<item '. $products['products_id'] .'>'."n";
remplacer par
$output .= '<item>'."\n";

pour ma part je n'arrive tj pas à afficher plus de 1 produit. et vous est ce la même chose ?

mickael34 : est ce que tu as tous tes produits qui sont exportés ?

Écrit par : mickael34 29 Oct 2010, 08:32

J'ai la contrib Export Universel.
Dans le dossier des comparateurs de prix de la contrib, je me créé un fichier google.php (le nom n'a pas d'importance) dans lequel je colle le dernier code que j'ai posté.
Je lance l'export (en suivant les indications de la contrib).
Cela me crée un fichier correcte pour l'import dans google shopping.

Cela dit, cela ne passe toujours pas la validation manuelle (je dis bien manuelle !!).
Je suis en relation avec un technicien de chez GG, je fais 2 petites modifs et leur renvoi.
Si cette fois ça passe, je poste le bon code.

@ +


Écrit par : Jesam 29 Oct 2010, 08:43

Pour kakashi

Citation
pour ma part je n'arrive tj pas à afficher plus de 1 produit. et vous est ce la même chose ?


Prend mon code, tu dois avoir tous tes articles.

Mais attention, si dans tes descriptifs, tu as des caractères non autorisés, genre & codé en &ndash; tu auras dans le fichier XML généré, un message d'erreur. Le message est assez clair, on trouve très facilement l'ID du produit incriminé.
Ce que j'ai fait dans ces cas, j'ai modifié depuis la base de données les caractères à changer.

Par contre on peut améliorer dans ce cas le script php en complètant str_replace.

Pour mickael34

Citation
Cela dit, cela ne passe toujours pas la validation manuelle (je dis bien manuelle !!).

De quelle validation manuelle parles-tu ? Ne serait ce pas l'importation manuelle ?

Avec le code que j'ai fourni et les modifs manuelles que j'ai décrites, je passe sans souci. J'ai envoyé 250 articles pour un site et plus de 2500 à l'instant pour un autre site.

Écrit par : mickael34 29 Oct 2010, 08:57

Non !

Attention, quand tu importes ton flux dans google shopping, tu vois apparaitre ton catalogue produit dans ton compte (si l'import c'est bien passé évidemment).

Par contre tes produits ne sont pas pour autant en ligne dès l'import effectué !

La validation de ton catalogue produit (la mise en ligne sur google shopping) se fait manuellement par un technicien !

Le code que j'ai mis en ligne importe sans pb mon catalogue produit par contre il ne passe pas la validation manuelle faite par le technicien.


PS : pour savoir si tes produits sont en ligne sur GG Shopping, tapes cette url :
http://www.google.fr/products?authorid=xxxxxxxxxx

xxxxxxx étant ton n° de compte GG Shopping

Écrit par : dvf 29 Oct 2010, 09:01

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.dvfstore.com (google export csv)
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("GOOGLE");
  
  $header = "Content-type: text/plain";

  $head = "id\ttitle\tprice\tlink\timage link\tdescription\tlivraison\tbrand\tfeatured_product\tcondition\tmanufacturer\tavailabilit\tgtin\tTVA\n";

  $output .= "go" . $products['products_id'] ."\t";
  $output .= netoyage_html($products['products_name'], 80) . "\t";
  $output .= $price ."\t";
  $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
  $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
  $output .= netoyage_html($products['products_description'], 250) . "\t";
  $output .= "EUR:::"  . $ship . "\t";
  $output .= $products['manufacturers_name'] . "\t";
  $output .= $promo . "\t";
  $output .= "new\t";
  $output .= $products['manufacturers2_name'] . "\t";
$output .= "en stock\t";
$output .= $products['products_barcodes']. "\t";
  $output .=  "FR::" . $vat . " :o " . "\n";
  $foot = '';

?>



A vous de virer tous les champs que vous n"avez pas. et de remplacer

car j'ai beaucoup modifier la contrib de base ...

Version Txt , + Simple que du xml trop stict



Écrit par : Jesam 29 Oct 2010, 09:22

Pour mickael34

Il faut compter environ 3 jours (info données sur les forums) pour voir ses produits validés.
En effet il y aurait une validation automatique + manuelle.

Mes premiers produits ont été insérés le 27/10 à 08h05, j'espère donc que demain tout sera validé biggrin.gif

La question que beaucoup se pose concerne l'information sur <g:condition> que l'on est obligé de mettre à new car neuf ne passe pas. Y a t'il une modif manuelle de son fichier par GG dans ce cas ?

J'ai repris ton code, mixé avec le mien, je génère à présent le bon fichier XML. Reste à ajouter quelques condition dans str_replace et ce sera parfait.

NB: par contre je dois rester en ISO et non en UT8 pour généré mon fichier.

Pour dvf

Perso je préfère le fichier XML beaucoup plus lisible et facilement modifiable, en effet j'ai "retouché" certains titres (et description) pour être mieux placé question référencement sur GG Merchant.

Écrit par : Acuponctus 29 Oct 2010, 09:26

Bonjour,
ok je vais tester les différentes modifs.

sinon combien de temps mets google à intégrer vos produits ?
pour un site ou j'ai envoyé seulement 22 produits, ca fait 10 jours et ca apparait toujours pas.
j'ai le sablier pour tous les produits (en attente d'évaluation) et pour products ads, c'est inclus dans l'index de recherche.
et pour un produit j'ai même la colonne Impr. avec la valeur 6, je comprends donc 6 impressions.

Bon WE

Écrit par : dvf 29 Oct 2010, 09:27

Types de codage pris en chargePartager Imprimer
Google Shopping prend en charge les codages UTF-8, UTF-16, Latin-1, Windows-1252 et ASCII. Si vous n'êtes pas sûr du codage de votre fichier, sélectionnez l'option Détection automatique.

Si vous utilisez le Bloc-notes pour enregistrer votre fichier, sélectionnez Enregistrer sous, puis choisissez ANSI ou UTF-8 dans Codage. Si votre fichier n'est pas codé dans l'un de ces types de codage, il ne sera pas traité.

Important : Si vous envoyez un fichier XML utilisant le codage Latin-1 ou UTF-16, veillez à le spécifier dans le fichier. Pour ce faire, dans la première ligne de votre fichier de données, remplacez <?xml version=" 1.0"?> par l'un des éléments suivants :

Pour le codage Latin-1 : <?xml version="1.0" encoding="ISO-8859-1"?>
Pour le codage UTF-16 : <?xml version="1.0" encoding="UTF-16"?>
selon vos formats donc

Écrit par : mickael34 29 Oct 2010, 09:44

Pour moi, ils ont mis 5 jours à me vérifier mon flux manuellement
(et pour le moment à me le refouler...)

Écrit par : dvf 29 Oct 2010, 09:49

nous on est intégrer depuis hier

http://img146.imageshack.us/img146/2212/googleln.jpg

mais on a beaucoup d "info en base

UPC/ean
Marques
Fabricants
Poids , ect ....

+ d'infos possible , google attend surement des informations complète...

On a fournit quelques milliers d'EAN. ect..

Écrit par : Jesam 29 Oct 2010, 10:04

Pour dvf

As-tu fais une action quelconque pour que les avis sur ta boutique apparaissent dans le GG Merchant : 4 avis sur le marchand

Ton fichier envoyé était-il en texte ou en XML. Si en XML avais-tu mis "neuf" ou "new" pour la condition du produit ?

Écrit par : dvf 29 Oct 2010, 10:33

moi je taff tjs en fichier plat c'est toujours plus simple pour tout le monde que de parser un flux xml. qui peut faire beaucou d'erreur facilement.

ah ces avis de gens qui postent que ceux qui sont pas content et qui ont 2 ans ////

c'est google qui attache.

Faudra du coup que je montre une campagne d'avis sur un comparateur pour avoir des notes dans google ;:)

Écrit par : Jesam 29 Oct 2010, 10:56

Citation
Faudra du coup que je montre une campagne d'avis sur un comparateur pour avoir des notes dans google ;:)


C'est la même réflexion que je me suis fait quand j'ai vu ces avis.


Écrit par : mickael34 29 Oct 2010, 11:39

Dvf, effectivement ton fichier est correct. Merci

GG vient de me valider le flux.
Mes produits sont en lignes.

Écrit par : dvf 29 Oct 2010, 12:34

attention à adapter le tout quand même car je vous ai juste donné le fichier d'export
j'ai fait des modifs dans l'export.php pour avoir les bonnes infos


Écrit par : mickael34 29 Oct 2010, 12:43

j'ai effectivement virer les infos dont je n'avais pas besoin : manufacturer2, code barre...

Écrit par : tofquer 4 Nov 2010, 08:33

Bonjour,

j'ai réussi à envoyer un fichier de données .txt sans installer UExport en utilisant une base de fichier csv pour un site comparateur. Mes produits sont bien pris en compte sur GGmerchant depuis le 30 octobre mais ils sont toujours en attente d'évaluation ?


Écrit par : Jesam 4 Nov 2010, 08:51

Pour un site:
Upload de 249 produits le 25 octobre.
Sur la page Rapport sur les performances (menu de gauche) en bas de page Rapport hebdomadaire, sous offres je suis à 249 (le nb de produits uploader) depuis hier et aucun n'est actif.

Je suis comme toi. Je ne comprend pas pourquoi c'est si long et qu'aucun produit après plus de 10 jours après l'upload ne soit actif.

Écrit par : mickael34 4 Nov 2010, 11:57

La validation de la mise en ligne des produits est faite manuellement par un technicien GG.
Donc effectivement c'est long surtout que c'est le début...

Dans mon secteur d'activité, nous sommes en France plusieurs dizaines de boutiques... Et actuellement nous sommes 2 à être référencé.
C'est la preuve que pour l'instant peu de boutiques sont présentes par rapport au nombre total.



Cela dit, pour ceux que que le tracking intéresse, dans mon code posté plus haut, j'ai modifié la ligne de l'url des produits par :

$output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . "?utm_source=google&utm_medium=cp&utm_campaign=google-merchant" . "\t";

En effet, GG Shopping m'annonce une quarantaine de clics/jour mais dans GG Analytics, ces clics sont "noyés" dans les visites venant de Google organic.

J'ai donc ajouter le tracking : ?utm_source=google&utm_medium=cp&utm_campaign=google-merchant
basé le l'outil de création d'url de google http://www.google.com/support/googleanalytics/bin/answer.py?answer=55578

afin de différencier les visites du référencement naturel et celle de GG Shopping (google-merchant).

Si ça peut interresser smile.gif

Écrit par : Acuponctus 4 Nov 2010, 22:10

Bonsoir,

effectivement c'est une très très bonne idée :

Citation
J'ai donc ajouter le tracking : ?utm_source=google&utm_medium=cp&utm_campaign=google-merchant


du cout je fais les modifs ce soir.

pour info j'ai un site avec 22 produits qui a mis 2 semaines pour être inséré
un autre avec 6000 produits qui viennent d'être validés, suite à un mail reçu, en 3 semaines
et un autre avec plus de 40000 produits qui est en attente.

c'est effectivement manuel, et c'est sans doute la raison pour laquelle c'est long

Bonne nuit

Écrit par : yyoossssii 5 Nov 2010, 11:16

Il faut un peu de patience, ils répondent sur ce mail: googlebase-support@google.com.

@mickael34: très bonne idée, merci

yossi

Écrit par : tofquer 8 Nov 2010, 08:39

Bonjour, smile.gif

Je viens de recevoir un email de GGMerchant refusant mes annonces en raison de quelques petites erreurs que je dois corriger et ensuite répondre au mail reçu pour demander à revoir le flux de mes produits.

1 semaine en gros d'attente, pour moi, pour que GGM regarde mes données.

Écrit par : optimum 15 Nov 2010, 11:15

bonjour,

tout d'abord merci à tous pour votre contrib... bien utile pour un newbie comme moi smile.gif

j'ai cependant un problème... le code de "dvf" marche bien, sauf que pour l'image, étant donné que j'ai pour chaque produit une petite image et une image plus grosse, il me prend la petite image, ce qui ne plait pas a Google apparement puisqu'il ne l'affiche pas dans mes fiches produits..

quelle modif puis-je faire sur le code pour que la grosse image soit prise en compte ?


Écrit par : Acuponctus 15 Nov 2010, 11:22

il faut simplement modifier le code afin qu'il prenne la grande image

Écrit par : optimum 15 Nov 2010, 11:27

merci beaucoup Acuponctus, le probleme est que je ne sais pas quel code il faut modifier pour que ca marche !

j'ai bien compris que le code de l'image était celui la "$output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";"

mais comment le modifier pour que ce soit la grosse image prise en compte?

Écrit par : Acuponctus 15 Nov 2010, 13:30

ca dépend de la base données
y a t il une contrib particulière pour les images gérées ?
peux tu mettre un exemple de la table products

Écrit par : xawaks 29 Nov 2010, 23:01

blink.gif

Salut à tous...

Je craque avec notre pote Google !!!

Il m'est absolument impossbile d'envoyer mes produit sur google merchant.

J'ai essayé diverses façons (flux rss, google base, google feeder, export universel) et à chaque fois il y a un problème.

Après de multiples tentatives, j'ai des produits mais le prix est HT...

Vous auriez une piste ?

Voici le fichier qui fonctionne ... presque wink.gif

Code
<?php
//  Title: Google Base / Froogle Data Feeder 2.5
//  Last Update: 12/25/09 by Jack_mcs at oscommerce-solution.com


/*************** BEGIN MASTER SETTINGS ******************/

define('SEO_ENABLED','false');    //Change to 'false' to disable if Ultimate SEO URLs is not installed
define('FEEDNAME', 'test.txt');       //from your googlebase account
define('DOMAIN_NAME', 'www.lxxxxx'); //your correct domain name (don't include www unless it is used)
define('FTP_USERNAME', 'googleFTP-username'); //created from within your googlebase account
define('FTP_PASSWORD', 'googleFTP-password'); //created from within your googlebase account
define('FTP_ENABLED', '0');      //set to 0 to disable
define('CONVERT_CURRENCY', '0'); //set to 0 to disable - only needed if a feed in a difference currecny is required
define('CURRENCY_TYPE', 'EUR');  //(eg. USD, EUR, GBP)
define('DEFAULT_LANGUAGE', 1);   //Change this to the id of your language.  BY default 1 is english
define('QUOTES_CATEGORY_NAME',''); //if the Quotes contribution is installed, enter the name of the quotes category here

define('OPTIONS_ENABLED', 1);
define('OPTIONS_ENABLED_AGE_RANGE', 0);
define('OPTIONS_ENABLED_ATTRIBUTES', 0);
define('OPTIONS_ENABLED_BRAND', 1);
define('OPTIONS_ENABLED_CONDITION', 1);
define('OPTIONS_ENABLED_CURRENCY', 0);
define('OPTIONS_ENABLED_FEED_LANGUAGE', 0);
define('OPTIONS_ENABLED_FEED_QUANTITY', 0);
define('OPTIONS_ENABLED_MADE_IN', 0);
define('OPTIONS_ENABLED_MANUFACTURER', 1);         //displays the manufacturer name
define('OPTIONS_ENABLED_PAYMENT_ACCEPTED', 0);
define('OPTIONS_ENABLED_PRODUCT_MODEL', 0); //displays the product model
define('OPTIONS_ENABLED_PRODUCT_TYPE', 0);
define('OPTIONS_ENABLED_SHIPPING', 0);
define('OPTIONS_ENABLED_INCLUDE_TAX', 0);
define('OPTIONS_ENABLED_UPC', 0);
define('OPTIONS_ENABLED_WEIGHT', 0);

//the following only matter if the matching option is enabled above.
define('OPTIONS_AGE_RANGE', '0-9');
define('OPTIONS_BRAND', '');
define('OPTIONS_CONDITION', 'New');  //possible entries are New, Refurbished, Used
define('OPTIONS_DEFAULT_CURRENCY', 'EUR');
define('OPTIONS_DEFAULT_FEED_LANGUAGE', 'fr');
define('OPTIONS_LOWEST_SHIPPING', ''); //this is not binary.  Custom Code is required to provide the shipping cost per product.  ###needs to be an array for per product.
define('OPTIONS_MADE_IN', 'USA');
define('OPTIONS_MANUFACTURERS_NAME_IGNORE', ''); //list if comma separated manufacturer names to be skipped - e.g. Matrox,Fox
define('OPTIONS_PAYMENT_ACCEPTED_METHODS', ''); //Acceptable values: cash, check, GoogleCheckout, Visa, MasterCard, AmericanExpress, Discover, wiretransfer
define('OPTIONS_TAX_RATE', 0); //default = 0 (e.g. for 17.5% tax use 17.5)
define('OPTIONS_WEIGHT_ACCEPTED_METHODS', 'kg'); //Valid units include lb, pound, oz, ounce, g, gram, kg, kilogram.

/*************** END MASTER SETTINGS ******************/

/*************** NO EDITS NEEDED BELOW THIS LINE *****************/

require_once('../includes/configure.php');

if (! function_exists("tep_not_null"))
{
  function tep_not_null($value) {
    if (is_array($value)) {
      if (sizeof($value) > 0) {
        return true;
      } else {
        return false;
      }
    } else {
      if (($value != '') && (strtolower($value) != 'null') && (strlen(trim($value)) > 0)) {
        return true;
      } else {
        return false;
      }
    }
  }
}

if(SEO_ENABLED=='true'){
  //********************
  // Modification for SEO
  // Since the ultimate SEO was only installed on the public side, we will include our files from there.
  require_once('../includes/filenames.php');
  require_once('../includes/database_tables.php');
  
  include_once('../' .DIR_WS_CLASSES . 'seo.class.php');
  $seo_urls = new SEO_URL(DEFAULT_LANGUAGE);

  function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
     global $seo_urls;
     return $seo_urls->href_link($page, $parameters, $connection, $add_session_id);
  }
}

//********************
//  Start TIMER
//  -----------
$stimer = explode( ' ', microtime() );
$stimer = $stimer[1] + $stimer[0];
//  -----------


$OutFile = "../feeds/" . FEEDNAME;
$destination_file = FEEDNAME;  
$source_file = $OutFile;
$imageURL = 'http://' . DOMAIN_NAME . '/images/';
if(SEO_ENABLED=='true'){
   $productURL = 'product_info.php'; // ***** Revised for SEO
   $productParam = "products_id=";   // ***** Added for SEO
}else{
   $productURL = 'http://' . DOMAIN_NAME . '/product_info.php?products_id=';
}

$already_sent = array();
$taxCalc = (OPTIONS_ENABLED_INCLUDE_TAX ? (OPTIONS_TAX_RATE/100) + 1 : 1);  //Do not edit

if(CONVERT_CURRENCY)
{
   if(SEO_ENABLED=='true'){
       $productParam="currency=" . CURRENCY_TYPE . "&products_id=";
   }else{
       $productURL = "http://" . DOMAIN_NAME . "/product_info.php?currency=" . CURRENCY_TYPE . "&products_id=";  //where CURRENCY_TYPE is your currency type (eg. USD, EUR, GBP)
   }
}

$feed_exp_date = date('Y-m-d', time() + 2505600 );

if (!($link=mysql_connect(DB_SERVER,DB_SERVER_USERNAME,DB_SERVER_PASSWORD)))
{
echo "Error when connecting itself to the data base";
exit();
}
if (!mysql_select_db( DB_DATABASE , $link ))
{
echo "Error the data base does not exist";
exit();
}

$quotes = '';
if (QUOTES_CATEGORY_NAME !== '') {
  $quotes = " and products.customers_email_address = '' and products.quotes_email_address = ''";
}  
  
$sql = "
SELECT concat( '" . $productURL . "' ,products.products_id) AS product_url,
products_model AS prodModel,
manufacturers.manufacturers_name AS mfgName,
manufacturers.manufacturers_id,
products.products_id AS id,
products_description.products_name AS name,
products_description.products_description AS description,
products.products_quantity AS quantity,
products.products_status AS prodStatus,
products.products_weight AS prodWeight,
FORMAT( IFNULL(specials.specials_new_products_price, products.products_price) * " . $taxCalc . ",2) AS price,
CONCAT( '" . $imageURL . "' ,products.products_image) AS image_url,
products_to_categories.categories_id AS prodCatID,
categories.parent_id AS catParentID,
categories_description.categories_name AS catName
FROM (categories,
categories_description,
products,
products_description,
products_to_categories)

left join manufacturers on ( manufacturers.manufacturers_id = products.manufacturers_id )
left join specials on ( specials.products_id = products.products_id AND ( ( (specials.expires_date > CURRENT_DATE) OR (specials.expires_date is NULL) OR (specials.expires_date = 0) ) AND ( specials.status = 1 ) ) )

WHERE products.products_id=products_description.products_id
AND products.products_id=products_to_categories.products_id
AND products_to_categories.categories_id=categories.categories_id
AND categories.categories_id=categories_description.categories_id " . $quotes . "
ORDER BY
products.products_id ASC
";

$quotes = '';
if (QUOTES_CATEGORY_NAME !== '') {
  $quotes = " and categories_description.categories_name NOT LIKE '" . QUOTES_CATEGORY_NAME . "' ";
}

$catInfo = "
SELECT
categories.categories_id AS curCatID,
categories.parent_id AS parentCatID,
categories_description.categories_name AS catName
FROM
categories,
categories_description
WHERE categories.categories_id = categories_description.categories_id " . $quotes;

function findCat($curID, $catTempPar, $catTempDes, $catIndex)
{
    if( (isset($catTempPar[$curID])) && ($catTempPar[$curID] != 0) )
    {
        if(isset($catIndex[$catTempPar[$curID]]))
        {
            $temp=$catIndex[$catTempPar[$curID]];
        }
        else
        {
            $catIndex = findCat($catTempPar[$curID], $catTempPar, $catTempDes, $catIndex);
            $temp = $catIndex[$catTempPar[$curID]];
        }
    }
    if( (isset($catTempPar[$curID])) && (isset($catTempDes[$curID])) && ($catTempPar[$curID] == 0) )
    {
        $catIndex[$curID] = $catTempDes[$curID];
    }
    else
    {
        $catIndex[$curID] = $temp . ", " . $catTempDes[$curID];
    }
    return $catIndex;

}

$catIndex = array();
$catTempDes = array();
$catTempPar = array();
$processCat = mysql_query( $catInfo )or die( $FunctionName . ": SQL error " . mysql_error() . "| catInfo = " . htmlentities($catInfo) );
while ( $catRow = mysql_fetch_object( $processCat ) )
{
    $catKey = $catRow->curCatID;
    $catName = $catRow->catName;
    $catParID = $catRow->parentCatID;
    if($catName != "")
    {
        $catTempDes[$catKey]=$catName;
        $catTempPar[$catKey]=$catParID;
    }
}

foreach($catTempDes as $curID=>$des)  //don't need the $des
{
    $catIndex = findCat($curID, $catTempPar, $catTempDes, $catIndex);
}

$_strip_search = array(
"![\t ]+$|^[\t ]+!m", // remove leading/trailing space chars
'%[\r\n]+%m'); // remove CRs and newlines
$_strip_replace = array(
'',
' ');
$_cleaner_array = array(">" => "&gt;", "&reg;" => "", "Æ" => "", "&trade;" => "", "ô" => "", "\t" => "", "    " => "", "<" => "&lt;", "&" => "&amp;");

if ( file_exists( $OutFile ) )
unlink( $OutFile );

$output = "link\ttitle\tdescription\texpiration_date\tprice\timage_link\tproduct_type\tid";
$attributesColumns = array();

//create optional section
if(OPTIONS_ENABLED == 1)
{
    if(OPTIONS_ENABLED_AGE_RANGE == 1)
        $output .= "\tage_range";
    if(OPTIONS_ENABLED_BRAND == 1)
        $output .= "\tbrand";
    if(OPTIONS_ENABLED_CONDITION == 1)
        $output .= "\tcondition";
    if(OPTIONS_ENABLED_CURRENCY == 1)
        $output .= "\tcurrency";
    if(OPTIONS_ENABLED_FEED_LANGUAGE == 1)
        $output .= "\tlanguage";
    if(OPTIONS_ENABLED_FEED_QUANTITY == 1)
        $output .= "\tquantity";
    if(OPTIONS_ENABLED_MADE_IN == 1)
        $output .= "\tmade_in";
    if(OPTIONS_ENABLED_MANUFACTURER == 1)
        $output .= "\tmanufacturer";
    if(OPTIONS_ENABLED_PAYMENT_ACCEPTED == 1)
        $output .= "\tpayment_accepted";
    if(OPTIONS_ENABLED_PRODUCT_MODEL == 1)
        $output .= "\tmpn";
    if(OPTIONS_ENABLED_PRODUCT_TYPE == 1)
        $output .= "\tproduct_type";
    if(OPTIONS_ENABLED_SHIPPING == 1)
        $output .= "\tshipping";
    if(OPTIONS_ENABLED_UPC == 1)
        $output .= "\tupc";
    if(OPTIONS_ENABLED_WEIGHT == 1)
        $output .= "\tweight";
    
  if (OPTIONS_ENABLED_ATTRIBUTES == 1)
  {  
    $products_options_name_query = mysql_query("select distinct popt.products_options_id, popt.products_options_name from products_options popt, products_attributes patrib where popt.language_id = '" . (int)1 . "' order by popt.products_options_name") or die(mysql_error());
    while ($products_options_name = mysql_fetch_object($products_options_name_query)) {
      $attributesColumns[] = $products_options_name->products_options_name;
      $name = strtolower($products_options_name->products_options_name);
      $name = str_replace(" ","_", $name);  
      $output .= "\tc:" . $name;
    }
    
    /*
    //If you want to only show particular attributes, comment out the above and uncomment this section.
    //Then enter two lines for each one you want to show. For example, if the atttributes you want to
    //show are named Color and Fabric, the entries would appear as follows:
    
    $attributesColumns[] = "Color";
    $attributesColumns[] = "Fabric";
    
    $output .= "\tc:" . strtolower("Color");
    $output .= "\tc:" . strtolower("Fabric");
    */  
  }
}
$output .= "\n";


$result=mysql_query( $sql )or die( $FunctionName . ": SQL error " . mysql_error() . "| sql = " . htmlentities($sql) );

//Currency Information
if(CONVERT_CURRENCY)
{
    $sql3 = "
    SELECT
    currencies.value AS curUSD
    FROM
    currencies
    WHERE currencies.code = '" . CURRENCY_TYPE . "'";

    $result3=mysql_query( $sql3 )or die( $FunctionName . ": SQL error " . mysql_error() . "| sql3 = " . htmlentities($sql3) );
    $row3 = mysql_fetch_object( $result3 );
}

$loop_counter = 0;

while( $row = mysql_fetch_object( $result ) )
{
    if (isset($already_sent[$row->id])) continue; // if we've sent this one, skip the rest of the while loop

    if( $row->prodStatus == 1 || (OPTIONS_ENABLED == 1 && $quantity == 1) )
    {
        if (CONVERT_CURRENCY)
        {
            $row->price = ereg_replace("[^.0-9]", "", $row->price);
            $row->price = $row->price *  $row3->curUSD;
            $row->price = number_format($row->price, 2, '.', ',');
        }
            
      if(SEO_ENABLED=='true'){
            $output .= tep_href_link($productURL,$productParam . $row->id) . "\t" .
            preg_replace($_strip_search, $_strip_replace, strip_tags( strtr($row->name, $_cleaner_array) ) ) . "\t" .
            preg_replace($_strip_search, $_strip_replace, strip_tags( strtr($row->description, $_cleaner_array) ) ) . "\t" .
            $feed_exp_date . "\t" .
            $row->price . "\t" .
            $row->image_url . "\t" .
            $catIndex[$row->prodCatID] . "\t" .
            $row->id;
      }else{
              $output .= $row->product_url . "\t" .
              preg_replace($_strip_search, $_strip_replace, strip_tags( strtr($row->name, $_cleaner_array) ) ) . "\t" .
              preg_replace($_strip_search, $_strip_replace, strip_tags( strtr($row->description, $_cleaner_array) ) ) . "\t" .
              $feed_exp_date . "\t" .
              $row->price . "\t" .
              $row->image_url . "\t" .
              $catIndex[$row->prodCatID] . "\t" .
              $row->id;
      }    

      //optional values section
      if(OPTIONS_ENABLED == 1)
      {
         if(OPTIONS_ENABLED_AGE_RANGE == 1)
            $output .= " \t " . OPTIONS_AGE_RANGE;
         if(OPTIONS_ENABLED_BRAND == 1)
            $output .= " \t " . OPTIONS_BRAND;
         if(OPTIONS_ENABLED_CONDITION == 1)
            $output .= " \t " . OPTIONS_CONDITION;
         if(OPTIONS_ENABLED_CURRENCY == 1)
            $output .= " \t " . OPTIONS_DEFAULT_CURRENCY;
         if(OPTIONS_ENABLED_FEED_LANGUAGE == 1)
            $output .= " \t " . OPTIONS_DEFAULT_FFEED_LANGUAGE;
         if(OPTIONS_ENABLED_FEED_QUANTITY == 1)
            $output .= " \t " . $row->quantity;
         if(OPTIONS_ENABLED_MADE_IN == 1)    
            $output .= " \t " . OPTIONS_MADE_IN;
         if(OPTIONS_ENABLED_MANUFACTURER == 1)
            $output .= " \t " . (in_array($row->mfgName,explode(",",OPTIONS_MANUFACTURERS_NAME_IGNORE)) ? '' : $row->mfgName);
         if(OPTIONS_ENABLED_PAYMENT_ACCEPTED == 1)
            $output .= " \t " . OPTIONS_PAYMENT_ACCEPTED_METHODS;
         if(OPTIONS_ENABLED_PRODUCT_MODEL == 1)
            $output .= " \t " . $row->prodModel;
         if(OPTIONS_ENABLED_PRODUCT_TYPE == 1)
         {
            $catNameTemp = strtolower($catName);
            $output .= " \t " . $row->catName;
         }
         if(OPTIONS_ENABLED_SHIPPING == 1)
            $output .= " \t " . OPTIONS_LOWEST_SHIPPING;
         if(OPTIONS_ENABLED_UPC == 1)
            $output .= " \t " . "Not Supported";
         if(OPTIONS_ENABLED_WEIGHT == 1)
            $output .= " \t " . $row->prodWeight . ' ' .OPTIONS_WEIGHT_ACCEPTED_METHODS;
        
         /******************* BEGIN HANDLING THE ATTRIBUTES ********************/
         if (OPTIONS_ENABLED_ATTRIBUTES == 1)
         {
            $products_attributes_query = mysql_query("select count(*) as total from products_options popt, products_attributes patrib where patrib.products_id='" . $row->id . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . (int)1 . "'");
            $products_attributes = mysql_fetch_object($products_attributes_query);
            if ($products_attributes->total > 0) {
              $products_options_name_query = mysql_query("select distinct popt.products_options_id, popt.products_options_name from products_options popt, products_attributes patrib where patrib.products_id='" . (int)$row->id . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . (int)1 . "' order by popt.products_options_name") or die(mysql_error());
        
              $trackTabs = '';
              
              while ($products_options_name = mysql_fetch_object($products_options_name_query)) {
                $products_options_array = array();      
                $products_options_query = mysql_query("select pov.products_options_values_id, pov.products_options_values_name, pa.options_values_price, pa.price_prefix from products_attributes pa, products_options_values pov where pa.products_id = '" . (int)$row->id . "' and pa.options_id = '" . $products_options_name->products_options_id . "' and pa.options_values_id = pov.products_options_values_id and pov.language_id = '" . (int)1 . "'");
                while ($products_options = mysql_fetch_object($products_options_query)) {
                  $products_options_array[] = array('id' => $products_options->products_options_values_id, 'text' => $products_options->products_options_values_name);
                }
        
                for ($a = 0; $a < count($attributesColumns); ++$a)
                {
                   if ($products_options_name->products_options_name == $attributesColumns[$a])
                   {
                     if ($a == 0)
                       $trackTabs = "\t";
                     else
                     {
                       if (empty($trackTabs))
                         $trackTabs = str_repeat("\t", $a);
                       $trackTabs .= "\t";  
                     }    
                  
                     $output .= $trackTabs;
                     foreach ($products_options_array as $arr)
                       $output .=  $arr['text'] . ',';
                     $output = substr($output, 0, -1);  
                   }
                }
              }
            }
         }
         /******************* END HANDLING THE ATTRIBUTES ********************/                  
      }
      $output .= " \n";
   }
  
   $already_sent[$row->id] = 1;
   $loop_counter++;

   if ($loop_counter>750) {
      $fp = fopen( $OutFile , "a" );
      $fout = fwrite( $fp , $output );
      fclose( $fp );
      $loop_counter = 0;
      $output = "";
   }
}

$fp = fopen( $OutFile , "a" );
$fout = fwrite( $fp , $output );
fclose( $fp );
echo "File completed: <a href=\"" . $OutFile . "\" target=\"_blank\">" . $destination_file . "</a><br>\n";
chmod($OutFile, 0777);


//Start FTP

function ftp_file( $ftpservername, $ftpusername, $ftppassword, $ftpsourcefile, $ftpdirectory, $ftpdestinationfile )
{
// set up basic connection
$conn_id = ftp_connect($ftpservername);
if ( $conn_id == false )
{
echo "FTP open connection failed to $ftpservername <BR>\n";
return false;
}

// login with username and password
$login_result = ftp_login($conn_id, $ftpusername, $ftppassword);

// check connection
if ((!$conn_id) || (!$login_result)) {
echo "FTP connection has failed!<BR>\n";
echo "Attempted to connect to " . $ftpservername . " for user " . $ftpusername . "<BR>\n";
return false;
} else {
echo "Connected to " . $ftpservername . ", for user " . $ftpusername . "<BR>\n";
}

if ( strlen( $ftpdirectory ) > 0 )
{
if (ftp_chdir($conn_id, $ftpdirectory )) {
echo "Current directory is now: " . ftp_pwd($conn_id) . "<BR>\n";
} else {
echo "Couldn't change directory on $ftpservername<BR>\n";
return false;
}
}

ftp_pasv ( $conn_id, true );
// upload the file
$upload = ftp_put( $conn_id, $ftpdestinationfile, $ftpsourcefile, FTP_ASCII );

// check upload status
if (!$upload) {
echo "$ftpservername: FTP upload has failed!<BR>\n";
return false;
} else {
echo "Uploaded " . $ftpsourcefile . " to " . $ftpservername . " as " . $ftpdestinationfile . "<BR>\n";
}

// close the FTP stream
ftp_close($conn_id);

return true;
}

if (FTP_ENABLED)
ftp_file( "uploads.google.com", FTP_USERNAME, FTP_PASSWORD, $source_file, "", $destination_file);

//End FTP


//  End TIMER
//  ---------
$etimer = explode( ' ', microtime() );
$etimer = $etimer[1] + $etimer[0];
echo '<p style="margin:auto; text-align:center">';
printf( "Script timer: <b>%f</b> seconds.", ($etimer-$stimer) );
echo '</p>';
//  ---------

?>


Merci de votre aide

Écrit par : Jesam 29 Nov 2010, 23:30

Je viens de voir ton post avant d'aller me coucher. M'a l'air bien complexe.

Pourquoi ne pas partir de l'export universel et du fichier transmis soit pour générer un fichier XML soit un fichier texte.

L'intérêt du fichier XML est que tu sais s'il y a des erreurs quand tu l'envoie à GG Merchant et tu peux corriger facilement.

Je serais toi, je reprendrais l'EU et le fichier pour export XML et tu nous dis ce qui ne vas pas, en commençant par générer un fichier simple et minimal.

Écrit par : Gnidhal 29 Nov 2010, 23:35

Je vois 2 lignes dans ton code :
33 : define('OPTIONS_ENABLED_INCLUDE_TAX', 0);
47 : define('OPTIONS_TAX_RATE', 0); //default = 0 (e.g. for 17.5% tax use 17.5)

donc passe la première variable à 1 et la seconde à 19.6 par exemple. Mais dans ce cas il faut envoyer des prix ttc
or ton code récupère le prix des produits en HT ($row->price) sans se soucier de la tva
Il n'utilise d'ailleurs pas les fonction natives osC, ce qui est dommage car il existe un tep_add_tax dans la bibliothèque osc de base.
Il manque dans ta requete la récup du tax_class_id dans la table products et la conversion de cet id en ratio via la table tax_rates. La classe currencies peut aussi mettre en forme tes prix plutôt que de convertir les affichages : (lignes 331 à 336)

Ces parties de code me semble complètement à revoir.

Écrit par : xawaks 29 Nov 2010, 23:39

Merci à vous deux pour les pistes...

Le soucis Gnidhal c'est que j'ai deux TVA (19,6 et 5,5) ben oui sinon c'est pas drôle wink.gif

Bon je vais re-regarder ça.

Écrit par : Gnidhal 30 Nov 2010, 00:06

ok, perso j'utilise ce code pour gg merchant :

Code
<?php
/*
$Id: g_merchant.php,v 1 20/11/2010 18:30:26:fxm - gnidhal Exp $

osCommerce, Open Source E-Commerce Solutions

Copyright © 2010 osCommerce

Released under the GNU General Public License
*/
function clean_desc($t){
   $t = nl2br($t);
   $t = strip_tags(preg_replace('`<br(\s?\/)?'.'>`i', "\n",html_entity_decode($t)));
   $t = htmlspecialchars($t);
   return $t;
}
require('includes/application_top.php');


define ('DISPLAY_PRICE_WITH_TAX', true);

  $content = '<?xml version="1.0" encoding="ISO-8859-1"?'.'>'."\n";
  $content .= '<rss version="2.0"
  xmlns:g="http://base.google.com/ns/1.0">'."\n";
  $content .= '  <channel>'."\n";
  $content .= '<title>Catalogue de '. HTTP_SERVER . DIR_WS_HTTP_CATALOG.'</title>'."\n";
  $content .= '<link>'. HTTP_SERVER . DIR_WS_HTTP_CATALOG.'</link>'."\n";
  $content .= '<description>Description du site</description>'."\n";

// On vérifie la langue utilisée dans le catalogue
$language_code = (isset($HTTP_GET_VARS['language']) && tep_not_null($HTTP_GET_VARS['language'])) ? $HTTP_GET_VARS['language'] : DEFAULT_LANGUAGE;


// Requête identifiant les produits disponibles dans le catalogue
$products_query = tep_db_query("SELECT p.*, pd.products_name, pd.products_description as description FROM " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd WHERE p.products_id = pd.products_id AND p.products_status = 1 AND pd.language_id = FLOOR($languages_id) ORDER BY p.products_price, pd.products_name ");

$product_num = 0;

while($products = tep_db_fetch_array($products_query)) {

if (intval($products['manufacturers_id']) > 0) {
  $manufacturers_query = tep_db_query("SELECT manufacturers_name FROM " . TABLE_MANUFACTURERS . " WHERE manufacturers_id = " . $products['manufacturers_id']);
  $manufacturers_result = tep_db_fetch_array($manufacturers_query);
  $products['manufacturers_name'] = $manufacturers_result['manufacturers_name'];
}

$special_query = tep_db_query("SELECT specials_new_products_price  FROM " . TABLE_SPECIALS . " WHERE products_id = " . $products['products_id']);
if ($special_result = tep_db_fetch_array($special_query))
  $products['products_price'] = $special_result['specials_new_products_price'];

$product_num++;
$content .= "<item>\n";
$content .= "\t<title>".$products['products_name']."</title>\n";
$content .= "\t<link>".tep_href_link("product_info.php?products_id=". $products['products_id'])."</link>\n";
$content .= "\t<description>".clean_desc($products['description'])."</description>\n";
$content .= "\t<g:image_link>".HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image']."</g:image_link>\n";
$content .= "\t<g:price>".preg_replace('`€`',' EUR',$currencies->display_price($products['products_price'], tep_get_tax_rate($products['products_tax_class_id'])))."</g:price>\n";
$content .= "\t<g:brand>".$products['manufacturers_name']."</g:brand>\n";
$content .= "\t<g:condition>new</g:condition>\n";
$content .= "\t<g:availability>in stock</g:availability>\n";
$content .= "\t<g:shipping_weight>".round($products['products_weight'])." kg</g:shipping_weight>\n";
$content .= "\t<g:id>".$products['products_model'].'_'.$products['products_id']."</g:id>\n";
$content .= "</item>\n";
}

$content .= "</channel>\n";
$content .= "</rss>\n";
/** Activer la ligne suivante pour écrire un fichier rss xml à la racine, attention uniquement PHP5!**/
//file_put_contents('g_merchant.xml', $content);
// tep_redirect('g_merchant.xml'); // optionnel
Header( 'Content-Type: text/xml' );
echo $content;
require(DIR_WS_INCLUDES . 'application_bottom.php');
?>

c'est réduit à l'essentiel mais ça fonctionne.

Attention si les descriptions sont longues, il faudra peut-être les tronquer.
Enfin les lignes 26 et 28 sont à personnaliser pour le site.

Écrit par : xawaks 30 Nov 2010, 00:27

Merci beaucoup Gnidhal...

Mais finalement je viens de trouver une magouille qui fonctionne.

Le seul hic, c'est que dans les descriptions, j'ai du html c'est à dire des trucs comme <br>, <div>, etc...

Comment faire pour les traduire ? ou du moins pour faire en sorte que le <br> devienne un saut de ligne ?

Cela fonctionne bien dans le flux RSS donc il doit bien avoir un truc, mais je vois pas lequel.

Merci encore, je touche au but wink.gif

Voici ma magouille qui marche :

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.dvfstore.com (google export csv)
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("GOOGLE");
  
  $header = "Content-type: text/plain";

  $head = "identifiant\ttitre\tprix\tlien\tlien image\tdescription\tetat\n";

  $output .= "go" . $products['products_id'] ."\t";
  $output .= netoyage_html($products['products_name'], 80) . "\t";
  $output .= $price ."\t";
  $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
  $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
  $output .= netoyage_html($products['products_description'], 250) . "\t";
  $output .= "neuf\n";
  $foot = '';

?>


Écrit par : xawaks 30 Nov 2010, 00:47

Bon,

j'ai trouvé (comme quoi...)

Code
  $output .= str_replace("<br>", "", $products['products_description']) . "\t";


Mais maintenant j'ai un autre soucis google me dit

Citation
Nombre de tabulations trop faible


argh !

Écrit par : xawaks 30 Nov 2010, 01:23

Bon ben voici une version qui va bien... En attendant d'avoir le retour de Google, cela me plait déjà plus...

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.dvfstore.com (google export csv)
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("GOOGLE");
  
  $header = "Content-type: text/plain";

  $head = "identifiant\ttitre\tprix\tlien\tlien image\tdescription\tetat\n";

  $output .= "go" . $products['products_id'] ."\t";
  $output .= netoyage_html($products['products_name'], 80) . "\t";
  $output .= $price ."\t";
  $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
  $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
  $output .= netoyage_html(substr(strip_tags(str_replace(array('<BR>','<br>'), " - ",html_entity_decode($products['products_description']))),0,245), 250) . "\t";
  $output .= "neuf\n";
  $foot = '';

?>


biggrin.gif

Écrit par : os78 5 Dec 2010, 11:28

bonjour Gnidhal
j'ai pas bien compris ce que fait exactement ta fonction

Citation
function clean_desc($t){
$t = nl2br($t);
$t = strip_tags(preg_replace('`<br(\s?\/)?'.'>`i', "\n",html_entity_decode($t)));
$t = htmlspecialchars($t);
return $t;
}

je sais que la 1eme ligne transforme \n en <br>
mais apres je ne sais plus
merci pour ta réponse

Écrit par : Gnidhal 5 Dec 2010, 22:11

oui, cette fonction est à adapter :
en 1 on remplace tous les \n en <br>
en 2 on vire tous les tags html et on remplace les <br> par des \n
Non ce n'est pas idiot, comme ça on est sur que TOUS les retours chariots sont remplacés par des \n wink.gif

Mais je ne suis pas sur du bien fondé de cette fonction qui est à adapter au contenu de chaque site.

Écrit par : os78 5 Dec 2010, 22:34

pourquoi
1 remplacer \n par <br> puis
2 refaire refaire encore l'inverse c'est a dire remplacer les <br> par \n

Écrit par : Gnidhal 6 Dec 2010, 10:16

smile.gif
c'est pas faux. C'est une précaution qui ne sert à rien ici. A la base c'est pour avoir un code html et supprimer les \n qui ne sont pas incluse dans le metacaractère "." dans les expressions régulières.
Mais ce que je voulais faire :
$t = preg_replace('[^.]', ' ',$t); ne fonctionne pas bien sur.
En réalité il faudrait remplacer tous les caractères qui peuvent multiplier les espaces car on se retrouve parfois avec des descriptions curieusement présentées.
genre :
$t = preg_replace('`[\s\t\r\n]+`', ' ',$t);
puis éliminer les double espace par
$t = preg_replace('`\s+`', ' ',$t);

Mais à vrai dire je cherche encore une fonction qui tiendrait compte de tous les cas.

Autre problème rencontré, si le catalogue produit est mal rédigé on peut se trouver avec des blocages de validation des fiches. Exemple dans le nom produit, si tu as :
CAPOT PLASTIQUE EN ABS
sera refusé car trop de mots en capitales.
Mais ré-écrire cela en auto devient un casse tête.
pour bien faire il faudrait :
Capot plastique en ABS
A part avoir un dictionnaire des termes qui doivent rester en capitales, je ne sais pas comment automatiser cette remise en forme.

Écrit par : tofquer 14 Dec 2010, 09:27

Bonjour, smile.gif

Effectivement, il ne faut pas mettre des caractères majuscules plus qu'il ne faut. Mon fichier a été refusé en partie à cause de ça. J'ai du reprendre tous mes titres produits qui posaient problème un par un wacko.gif , ça prend du temps.

Voici l'information reçue de GG shopping

Capitalisation excessive

Certains de vos titres d'offre sont capitalisés, ce qui est contraire
au Règlement de Google Shopping. La typographie de vos titres et
descriptions doit être régulière, sans capitalisation excessive ni
caractères superflus.


Écrit par : stbo 10 Jan 2011, 12:57

Bonjour,
je suis a la recherche de ce fichier qui se creer tout seul.

si quelqu'un a une idée.

J'ai essayer mais cela ne prends que la page d'accueil et pas tous mes produits.

Écrit par : oneill 12 Jan 2011, 04:47

Mes produits sont uploadés sans erreur depuis 12 jours mais ils ne sont toujours pas validés. C'est long non ?


@ stbo
Il y a des scripts dans ce sujet.

Écrit par : Jesam 12 Jan 2011, 09:36

Pour un de mes sites j'ai transmis le fichier au 2ème jour de l'apparition de GG Merchant, j'ai attendu 10 jours.

J'ai actuellement pour deux autres déposés les fichiers il y a 2 mois et j'attends toujours...

Écrit par : oneill 12 Jan 2011, 10:07

Ah d'accord !! shock.gif shock.gif

Merci

Écrit par : stbo 12 Jan 2011, 14:14

Bonjour,
J'ai essayer les scripts mais sans succès.
Faut il les faire par pages ou les un script pour tout le site ?

J'ai essayé sur la racine du site et il me donne que la page d'accueil ..

Écrit par : stbo 13 Jan 2011, 14:51

Bonjour,

Après plusieurs jours de recherche j'ai decidé de faire le fichier a la min comme le prevoit google.

C'est long, j'ai mis un seul produit pout voir combien de temps il met à valider cela fait 3 jours pour shopping et 12 h pour produit act...

A voir


Écrit par : HPL 25 Jan 2011, 09:26

Bonjour

J'ai suivi avec attention toutes vos discussions à propos d'export universel pour google shopping mais je suis bloqué sur quelque chose de totalement stupide.

Je fais des tests en local et je ne cesse d'avoir l'erreur


Warning: opendir(/store3/includes/modules/ExU) [function.opendir]: failed to open dir: No such file or directory in C:\wamp\www\gestion\ExU.php on line 78

Warning: readdir() expects parameter 1 to be resource, boolean given in C:\wamp\www\gestion\ExU.php on line 80

Warning: closedir() expects parameter 1 to be resource, boolean given in C:\wamp\www\gestion\ExU.php on line 91

C'est la première fois que j'ai cette erreur, quelqu'un a une idée pour pouvir réparer ceci ?

Merci d'avance.

Écrit par : pierre39 27 Jan 2011, 18:42

Bonjour,

Mon catalogue etait en attente depuis plus de 3 semaines, je les ai contacté via le formulaire de contact http://www.google.com/support/merchants/bin/request.py?contact_type=processing
j'ai reçu une réponse presque immédiate que mes produits avaient été validés et qu'ils seraient en ligne sous 24H.
Le lendemain tout mes produits étaient bien actif, merci Google.

Écrit par : Julietta 13 Feb 2011, 19:40

Bonsoir à tous

Je viens de tester la version .txt de DVF... Le fichier est bien généré mais ce que je ne comprends pas c'est qu'étant donné qu'il s'agit d'un fichier .txt que j'enregistre puis transmet à Google Merchant cela veut dire qu'à chaque modification : ajout, suppression de produits... Je dois transmettre à nouveau le fichier ?

En effet, on ne peut pas donner l'Url à Google Merchant ? Ou alors j'ai rien compris...

Citation (dvf @ 29 Oct 2010, 09:01) *
Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.dvfstore.com (google export csv)
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

   $comp = array("GOOGLE");
  
   $header = "Content-type: text/plain";

   $head = "id\ttitle\tprice\tlink\timage link\tdescription\tlivraison\tbrand\tfeatured_product\tcondition\tmanufacturer\tavailabilit\tgtin\tTVA\n";

   $output .= "go" . $products['products_id'] ."\t";
   $output .= netoyage_html($products['products_name'], 80) . "\t";
   $output .= $price ."\t";
   $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
   $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
   $output .= netoyage_html($products['products_description'], 250) . "\t";
   $output .= "EUR:::"  . $ship . "\t";
   $output .= $products['manufacturers_name'] . "\t";
   $output .= $promo . "\t";
   $output .= "new\t";
   $output .= $products['manufacturers2_name'] . "\t";
  $output .= "en stock\t";
  $output .= $products['products_barcodes']. "\t";
   $output .=  "FR::" . $vat . " :o " . "\n";
   $foot = '';

?>



A vous de virer tous les champs que vous n"avez pas. et de remplacer

car j'ai beaucoup modifier la contrib de base ...

Version Txt , + Simple que du xml trop stict

Écrit par : Jesam 13 Feb 2011, 23:11

Oui, Julietta, à chaque modif il faut refaire le fichier et le soumettre à nouveau.
Notez que les données soumises à GG Merchant n'ont une durée de vie que de 1 mois je crois (c'est écrit) donc il faut ressoumettre à fréquence régulière.
Sauf si bientôt nous avons un addon qui construit ce fichier automatiquement à date fixée par paramétrage. Là tout sera alors automatique.

Écrit par : pierre39 14 Feb 2011, 02:16

Bonjour,

On peut parametrer une importation planifiée dans la partie planning du flux de donnée de GG merchant en indiquant l'url générée par la contrib export universel et en nommant son fichier export.php dans la partie fichier.

Bonne soirée

Écrit par : oneill 14 Feb 2011, 04:56

Et en générant le fichier soit manuellement, soit via un CRON

Écrit par : geeko 15 Feb 2011, 12:18

Le plus sûr pour se faire indexer rapidement est de générer à la main un fichier txt et de tout renseigner.

Pour gagner du temps :
- Indiquer le charset et la langue dans $header

Code
$header = "Content-Type: text/plain; charset=ISO-8859-1; Content-Language: fr";


et ne pas laisser Google détecter automatiquement ni la langue, ni le codage (mettez UTF-8 si c'est du UTF-8 évidemment). Ça parraît con, mais votre fichier sera soumis à approbation par des opérateurs humains qui ne chercheront pas plus loin s'ils voient arriver un fichier qui n'est pas intégralement rédigé dans la langue annoncée.

Dans la même logique, et contrairement aux instructions de rédaction du Merchant Center, francisez tout, y compris les titres : identifiant, titre, marque, prix, lien, lien image, description, état dans $head, quitte à le faire à la main dans le fichier txt généré par un script. Si vous laissez les titres en anglais, vous aurez des mytho-messages d'erreur et vous serez repartis pour des jours ou même des semaines d'attente.

Écrit par : oneill 15 Feb 2011, 13:03

Effectivement, c'est ce que je fais et ca marche impeccable

Écrit par : chrysalide 17 Feb 2011, 18:50

Bon si ça peux aider qq'un j'ai modifier le module d'export donné en exemple par xawaks pour le compléter et le localiser.

Pourquoi le localiser : Car j'ai besoin d'exporter mon catalogue en direction de plusieurs pays et faire 4 modules pour 4 langues c'est pas glop.

J'ai également passé en variable les valeurs max en caractère pour la fonction netoyage_html pour le nom du produit et la description et définie celle-ci aux valeurs admissibles par Google. A adapter en fonction de votre boutique.

/catalog/includes/modules/ExU/google.php

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.dvfstore.com (google export csv)
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

include(DIR_WS_LANGUAGES . $language . '/modules/ExU/google.php');

$max_caractere_name = 70;  // Définie le nombre maximum de caractères pour le nom du produit sachant que Google n'autorise pas plus de 70 caractères.
$max_caractere_desc = 10000; // Définie le nombre maximum de caractères pour la description produit sachant que Google n'autorise pas plus de 10000 caractères.

  $comp = array("GOOGLE");
  
  $header = "Content-Type: text/plain; charset=".CHARSET."; Content-Language: ".$language_code;

  $head = TITLE_GOOGLE_ID."\t".TITLE_GOOGLE_TITLE."\t".TITLE_GOOGLE_PRICE."\t".TITLE_GOOGLE_LINK."\t".TITLE_GOOGLE_IMAGE_LINK."\t".TITLE_GOOGLE_DESCRIPTION."\t".TITLE_GOOGLE_PRODUCT_TYPE."\t".TITLE_GOOGLE_BRAND."\t".TITLE_GOOGLE_CONDITION."\n";

  $output .= $language_code."-". $products['products_id'] ."\t";
  $output .= netoyage_html($products['products_name'], $max_caractere_name) . "\t";
  $output .= $price ."\t";
  $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
  $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
  $output .= netoyage_html(strip_tags(str_replace(array('<BR>','<br>'), " - ",html_entity_decode($products['products_description']))), $max_caractere_desc) . "\t";
  $output .= $cat_info[$products['categories_id']]['name'] ."\t";
  $output .= $products['manufacturers_name'] ."\t";
  $output .= GOOGLE_CONDITION_NEW."\n";
  $foot = '';

?>


/catalog/includes/languages/french/modules/ExU/google.php
Code
<?php
  define('TITLE_GOOGLE_ID', 'identifiant');
  define('TITLE_GOOGLE_TITLE', 'titre');
  define('TITLE_GOOGLE_PRICE', 'prix');
  define('TITLE_GOOGLE_LINK', 'lien');
  define('TITLE_GOOGLE_IMAGE_LINK', 'lien image');
  define('TITLE_GOOGLE_DESCRIPTION', 'descriptif');
  define('TITLE_GOOGLE_PRODUCT_TYPE', 'catégorie');
  define('TITLE_GOOGLE_BRAND', 'marque');
  define('TITLE_GOOGLE_CONDITION', 'état');
  define('GOOGLE_CONDITION_NEW', 'neuf');
?>


/catalog/includes/languages/english/modules/ExU/google.php
Code
<?php
  define('TITLE_GOOGLE_ID', 'id');
  define('TITLE_GOOGLE_TITLE', 'title');
  define('TITLE_GOOGLE_PRICE', 'price');
  define('TITLE_GOOGLE_LINK', 'link');
  define('TITLE_GOOGLE_IMAGE_LINK', 'image_link');
  define('TITLE_GOOGLE_DESCRIPTION', 'description');
  define('TITLE_GOOGLE_PRODUCT_TYPE', 'product_type');
  define('TITLE_GOOGLE_BRAND', 'brand');
  define('TITLE_GOOGLE_CONDITION', 'condition');
  define('GOOGLE_CONDITION_NEW', 'new');
?>


J'ai intégrer toutes les infos possibles avec Export Universel non modifié

Concernant l'utilisation sans cache et import automatisé dans Google merchant :

dans google merchant -> Flux de données -> Nouveaux flux de données.

Renseigner les infos demandées : Pays, nom de fichier <- mettre un nom évocateur comme fr-google.txt c'est plus pratique mais en fait on sent fou, on peut mettre n'importe quoi.

Une fois le flux créé : cliquer sur modifier

réglé la périodicité de mise à jour du flux et dans URL du fichier mettre :

Code
http://www.xxxxx.com/export.php?format=google.php&p=MONMOTDEPASSE&language=fr&libre=


si vous utilisez le repertoire catalog (bouh c'est mal !)

Code
http://www.xxxxx.com/catalog/export.php?format=google.php&p=MONMOTDEPASSE&language=fr&libre=


bien évidement remplacez www.xxxxx.com par votre nom de domaine et MONMOTDEPASSE par celui défini lors de l'install de ExU.

exemple est valable pour la france

pour l'Angleterre remplacer dans l'URL
Code
language=fr

par
Code
language=en


pour l'Allemagne
Code
language=de


VOILOU !

Écrit par : stefstef 21 Feb 2011, 12:00

Quelqu'un serait-il comment mettre des guillemets entre les attributs?

http://www.google.com/support/merchants/bin/answer.py?answer=160037

J'ai la contrib retouchée de DVF, ca marche bien, merci wink.gif , mais j'ai certains de mes produits sans description,
du coup j'ai un décalage et à priori comme il n'y a comme séparateur qu'une tabulation, Google le perçois comme une erreur de correspondance.
Il faudrait que je puisse mettre des guillemets pour séparer mais je n'y arrive pas sad.gif

MERCI


CODE
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

$comp = array("GOOGLE");

$header = "Content-type: text/plain";

$head = "idttitletpricetlinktimage linktdescriptiontbrandtconditionn";

$output .= "go" . $products['products_id'] ."t";
$output .= netoyage_html($products['products_name'], 80) . "t";
$output .= $price ."t";
$output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "t";
$output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."t";
$output .= netoyage_html($products['products_description'], 250) . "t";
$output .= $products['manufacturers_name'] . "t";
$output .= "newt";
$output .= "n";
$foot = '';

?>

Écrit par : chrysalide 21 Feb 2011, 15:09

Salut Stefstef,

dans le code cité des \ sont parti en quenouille !


il suffit d'échapper les " avec des \

ton code

Code
$output .= netoyage_html($products['products_description'], 250) . "\t";


nouveau code

Code
$output .= "\"".netoyage_html($products['products_description'], 250) . "\"\t";


mais dans l'absolu un produit sans description c'est mal smile.gif

Écrit par : stefstef 21 Feb 2011, 15:42

Merci beaucoup chrysalide wink.gif
En effet, les slashs sont partis mangés par l'éditeur wink.gif
Je sais que c'est pas très bien les produits sans description mais ca concerne que peut
de produits.

Par contre, je viens de me rendre compte dans le schéma Google qu'il faut
que je sépare en plus avec une virgule et bien sur, je sais pas ou mettre la virgule
pour qu'elle apparaisse entre les attributs.
blink.gif

Écrit par : oneill 21 Feb 2011, 16:52

Code
   $output .= substr(strip_tags(html_entity_decode(str_replace(array('<BR>','<br>','<P>'), " ",str_replace("\r\n", "", $products['products_description'])))),0,250) . "\t";

Ca, ca nettoie, une vraie ptite fée.

Écrit par : stefstef 21 Feb 2011, 18:25

Merci oneill.
J'ai essayé mais ca ne va pas.
J'arrive pas à me dépatouiller avec ce fichier, j'ai à chaque fois une erreur avec Google.

Mon fichier est généré correctement mais pour l'instant j'ai pas les virgules entre les attributs
je n'ai que la tabulation. Comment fait on un séparateur avec virgule au lieu de la tabulation?

Voici 2 lignes de mon fichier export (généré avec le code PHP ci dessous)

id title price link image link description brand condition
"go950" "titre de produit" "prix" "http://www.url_produit.html" "http://www.url_image_produit.jpg" "description produit" "marque" "new"
"go228" "titre de produit" "prix" "http://www.url_produit.html" "http://www.url_image_produit.jpg" "description produit" "marque" "new"


Les erreurs avec Google sont les suivantes:

Nombre de tabulations trop élevé (2000 erreurs)
Vos articles contiennent plus d'attributs que ceux indiqués dans la ligne d'en-tête.
En savoir plus

Ligne de flux de données endommagée (50 erreurs)
Impossible d'associer les attributs de vos articles à ceux de la ligne d'en-tête, car le codage est incorrect. Veuillez vous assurer que tous les caractères sont conformes au codage choisi.

Si quelqu'un a la solution, je suis preneur. blink.gif

CODE
$comp = array("GOOGLE");

$header = "Content-type: text/plain";

$head = "id\ttitle\tprice\tlink\timage link\tdescription\tbrand\tcondition\n";

$output .= "\""."go" . $products['products_id'] ."\"\t";
$output .= "\"".netoyage_html($products['products_name'], 80) . "\"\t";
$output .= "\"".$price ."\"\t";
$output .= "\"".tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\"\t";
$output .= "\"".HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\"\t";
$output .= "\"".netoyage_html($products['products_description'], 250) . "\"\t";
$output .= "\"".$products['manufacturers_name'] . "\"\t";
$output .= "\""."new"."\"\t";
$output .= "\n";
$foot = '';

?>

Écrit par : chrysalide 21 Feb 2011, 19:00

Pourquoi coller des guillemets partout ? blink.gif

si c'est ta description qui est problématique utilises des guillemets uniquement sur celle-ci

edit :
pourquoi mettre des virgules entre les attributs et qu'appelles tu des "attributs"
car au dernières nouvelles l'utilisation des virgules c'est pour séparer les product_type dans la même cellule et pas ailleurs dry.gif

Écrit par : stefstef 21 Feb 2011, 19:07

A priori, si j'utilise les guillemets, je dois les utiliser sur les autres attributs. C'est comme ca que je l'ai compris en lisant ce tuto de Google.

http://www.google.com/support/merchants/bin/answer.py?answer=160037
smile.gif

Je trouve pas la solution du séparateur avec virgule?
Peux tu me renseigner?
Merci

Les attributs sont
$head = "id\ttitle\tprice\tlink\timage link\tdescription\tbrand\tcondition\n";
actuellement le séparateur est la tabulation mais je pense que c'est ce qui pose problème.

Écrit par : chrysalide 21 Feb 2011, 19:15

j'ai eu 0 pbs avec les tabulations pourtant j'ai des descriptions a rallonge

as tu essayer d'importer ton fichier sous Excel ou Open Office pour voir le résultat de sortie ?

EDIT: As tu essayé le script que j'ai filé la semaine dernière ?

Écrit par : oneill 22 Feb 2011, 08:13

Même question, pourquoi utiliser les virgules comme séparateur ?

La virgule étant un signe de ponctuation courant de la langue francaise, il n'est pas facile d'extraire du texte en faisant le distingo entre les "vrais" et les "séparateurs". La tabulation présente bien des avantages. Même si tu as des virgules ou des guillements dans tes textes ou tes attributs, il suffit que tu déclares sans guillemet et uniquement en tabulation.

Va voir cette page et expand les exemples de google.
http://www.google.com/support/merchants/bin/answer.py?answer=188494

Arrete de t'entêter avec les virgules et les guillements. Mon premier envoi à google a été refusé une fois car mes titres étaient en majuscules aucun soucis de virgules, de guillemets ou je ne sais quoi. Le deuxième était bon. On commence à ne plus comprendre pourquoi tu te fais du mal à ce point la.

Écrit par : stefstef 22 Feb 2011, 09:06

Oui, merci oneill.
C'est clair et d'ailleurs j'ai arrêté car cela a fini par me faire perdre patience!
J'ai repris la contrib retouchée par dvf mais cette fois ci en français et ca marche.
A priori c'était le problème, car me concernant avec la version anglaise (je parle des attributs id/price/...) ca marchait pas (pourtant Google est censé faire la distinction!)
donc résolu, merci à tous.
J'ai quand même appris des choses, donc c'est plutôt positif.
smile.gif
chrysalide, j'avais essayé ton nouveau script mais sans résultat.
Peut être que ma version os ne colle pas.

Écrit par : chrysalide 22 Feb 2011, 16:04

Salut stefstef,

Peux tu me donner des précisions sur les pbs que tu as rencontré car j'ai bien vérifier de ne faire appel qu'a des infos présentes dans une base Oscommerce de base et avec ExU de base ?

As tu suivi toute la procédure ou piqué uniquement le script ?

Chez moi ça marche nickel et du premier coup.

EDIT : Si quelqu'un a essayé d'utiliser ou utilise la méthodologie que j'ai pondu la semaine dernière dites moi ci ça marche ou pas car si il y a des soucis je corrigerai et ca servira a d'autres.

Écrit par : stefstef 22 Feb 2011, 18:13

Salut chrysalide,

Je viens de retester ta solution et ca marche.
Je suis désolé de t'avoir dit le contraire car c'est moi qui n'avait pas installé correctement les fichiers
En effet, j'avais mis les dossiers ExU dans les fichiers respectifs english et french comme ceci
/catalog/includes/languages/french/ExU ou lieu de les mettre dans "modules"

Toutes mes félicitations, on peux aussi générer le catalogue anglais!

Écrit par : chrysalide 25 Feb 2011, 14:29

Petit retour d'expérience:

J'ai soumis un catalogue il y a quinze jours et celui-ci vient d'être validé ! smile.gif

J'en ai soumis un autre hier je verrai bien le temps qu'il faudra a celui-ci pour être validé.

Écrit par : Garga 2 Mar 2011, 11:35

Bonjour à tous,

Je me permet de prendre ce fil en cours, en effet je m'étonne que personne n'ai utilisé de flux RSS afin d'automatisé toute mise à jour de façon quotidienne.

Pour ce faire je suis parti de la contrib http://addons.oscommerce.com/info/1513 que j'ai modifié pour avoir les sorties voulu par Google Merchand Center. Très simple à modifié et totalement automatique une fois mis en place.

Si quelqu'un est intéressé par cette solution n'hésitez pas...

Écrit par : oneill 2 Mar 2011, 12:11

Oh surement parce qu'on est un petit peu fainéant ici... biggrin.gif

Merci pour le rss

Écrit par : chrysalide 2 Mar 2011, 12:28

L'automatisation n'a rien a voir avec un flux RSS. la maj du flux peut très bien se faire avec un fichier texte et panifier de façon quotidienne depuis google merchant.

Écrit par : Garga 2 Mar 2011, 12:41

C'est vrai que l'automatisation n'est pas lié au flux en lui même mais l'adresse de màj auto est bcp plus simple que http://www.MONSITE.com/export.php?format=rssgoogle.php&p=MON-MDP&language=fr&libre=, ca donne plutot une adresse du genre http://www.MONSITE.com/RSSGoogle.php

Enfin bref, si ca vous tente, après avoir installé la contrib RSS Feed, créez un fichier RSSGoogle.php et coller le code ci dessous:

CODE
<?php
/*
$Id: rssgoogle.php,v 2.0 2007/05/12 19:30:06 hpdl Exp $

osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com

Copyright © 2003 osCommerce

Released under the GNU General Public License
*/

/*
* Include the application_top.php script
*/
require('includes/application_top.php');

require(DIR_WS_LANGUAGES . $language . '/' . FILENAME_RSS);

$navigation->remove_current_page();

// If the language is not specified
$lang_query = tep_db_query("select languages_id, code from " . TABLE_LANGUAGES . " where languages_id = '" . (int)$languages_id . "'");

// Recover the code (fr, en, etc) and the id (1, 2, etc) of the current language
if (tep_db_num_rows($lang_query)) {
$lang_a = tep_db_fetch_array($lang_query);
$lang_code = $lang_a['code'];
}

define(RSS_STRIP_HTML_TAGS,false);
// If the default of your catalog is not what you want in your RSS feed, then
// please change this three constants:
// Enter an appropriate title for your website
define(RSS_TITLE, STORE_NAME);
// Enter your main shopping cart link
define(WEBLINK, HTTP_SERVER);
// Enter a description of your shopping cart
define(DESCRIPTION, TITLE);
/////////////////////////////////////////////////////////////
//That's it. No More Editing (Unless you renamed DB tables or need to switch
//to SEO links (Apache Rewrite URL)
/////////////////////////////////////////////////////////////

$store_name = STORE_NAME;
$rss_title = RSS_TITLE;
$weblink = WEBLINK;
$description = DESCRIPTION;
$email_address = STORE_OWNER_EMAIL_ADDRESS;

$subtitle = '';

function replace_problem_characters($text) {
$formattags = array("&");
$replacevals = array("&");
$text = str_replace($formattags, $replacevals, $text);
//$in[] = '@&(amp|#038);@i'; $out[] = '&';
$in[] = '@&(#036);@i'; $out[] = '$';
$in[] = '@&(quot);@i'; $out[] = '"';
$in[] = '@&(#039);@i'; $out[] = '\'';
$in[] = '@&(nbsp|#160);@i'; $out[] = ' ';
$in[] = '@&(eacute|#233);@i'; $out[] = 'é';
$in[] = '@&(egrave|#232);@i'; $out[] = 'è';
$in[] = '@&(hellip|#8230);@i'; $out[] = '...';
$in[] = '@&(copy|#169);@i'; $out[] = '©';
$in[] = '@&(trade|#129);@i'; $out[] = '™';
$in[] = '@&(lt|#60);@i'; $out[] = '<';
$in[] = '@&(gt|#62);@i'; $out[] = '>';
$in[] = '@&(laquo);@i'; $out[] = '«';
$in[] = '@&(raquo);@i'; $out[] = '»';
$in[] = '@&(deg);@i'; $out[] = '°';
$in[] = '@&(mdash);@i'; $out[] = '—';
$in[] = '@&(reg);@i'; $out[] = '®';
$in[] = '@&(–);@i'; $out[] = '-';
$text = preg_replace($in, $out, $text);
return $text;
}

function strip_html_tags($str) {
// $document should contain an HTML document.
// This will remove HTML tags, javascript sections
// and white space. It will also convert some
// common HTML entities to their text equivalent.

$search = array ("'<script[^>]*?>.*?</script>'si", // Strip out javascript
"'<[/!]*?[^<>]*?>'si", // Strip out HTML tags
//"'([rn])[s]+'", // Strip out white space
"'&(quot|#34);'i", // Replace HTML entities
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(d+);'e"); // evaluate as php

$replace = array ("",
"",
//"\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\1)");

return preg_replace($search, $replace, $str);
}


if(!function_exists('eval_rss_urls')) {
function eval_rss_urls($string) {
// rewrite all local urls to absolute urls
return preg_replace_callback("/(href|src|action)=[\"']{0,1}(\.{0,2}[\\|\/]{1})(.*?)[\"']{0,1}( .*?){0,1}>/is","rewrite_rss_local_urls",$string);
//"/(href|src|action)=[\"']{0,1}(\.{2}[\\|\/]{1})(.*?)[\"']{0,1}( .*?){0,1}>/is"
}
}

function rewrite_rss_local_urls($string) {

$repl_text = $string[0];
$repl_by = HTTP_SERVER.'\\';
$repl_len = 0;

$index_pos = strpos ( $repl_text , '..');
if ($index_pos > -1) {
$repl_len = 2;
} else {
$index_pos = strpos ( $repl_text , '\"\\');
if ($index_pos > -1) {
$repl_len = 0;
$index_pos+=1;
}
}
if ($index_pos > -1) {
substr_replace($repl_text, $repl_by, $index_pos,2 );
}
ob_start();
echo $repl_text;
$return = ob_get_contents();
ob_end_clean();
return $return;
}

// to strip html or not to strip html tags
if (isset($HTTP_GET_VARS['html'])) {
if ($HTTP_GET_VARS['html']=='false') {
$strip_html_tags = true;
} else {
$strip_html_tags = false;
}
} else {
$strip_html_tags = RSS_STRIP_HTML_TAGS;
}

// show the products of a specified manufacturer

if (isset($HTTP_GET_VARS['manufacturers_id'])) {

if (isset($HTTP_GET_VARS['filter_id']) && tep_not_null($HTTP_GET_VARS['filter_id'])) {

// We are asked to show only a specific category

$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_model, p.products_price, p.products_image, p.products_date_added, pd.products_name, pd.products_description,
m.manufacturers_name, cd.categories_name, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c LEFT JOIN " . TABLE_CATEGORIES_DESCRIPTION . " cd
ON p2c.categories_id = cd.categories_id where p.products_status = '1' and p.products_to_rss='1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "'
GROUP BY p.products_id
ORDER BY p.products_id DESC
LIMIT ". (int)MAX_RSS_ARTICLES."";

} else {

// We show them all

$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_model, p.products_price, p.products_image, p.products_date_added, pd.products_name, pd.products_description,
m.manufacturers_name, cd.categories_name, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c LEFT JOIN " . TABLE_CATEGORIES_DESCRIPTION . " cd
ON p2c.categories_id = cd.categories_id where p.products_status = '1' and p.products_to_rss='1' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id . "' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'
GROUP BY p.products_id
ORDER BY p.products_id DESC
LIMIT ". (int)MAX_RSS_ARTICLES."";


}

$subtitle = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "'");
$subtitle = tep_db_fetch_array($subtitle);
$subtitle = $subtitle['manufacturers_name'];
$rss_title = BOX_INFORMATION_RSS_MANUFACTURER;
} else if (tep_not_null($current_category_id)) {

// show the products in a given categorie

if (isset($HTTP_GET_VARS['filter_id']) && tep_not_null($HTTP_GET_VARS['filter_id'])) {
// We are asked to show only specific catgeory
$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_model, p.products_price, p.products_image, p.products_date_added, pd.products_name, pd.products_description,
m.manufacturers_name, cd.categories_name, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c LEFT JOIN " . TABLE_CATEGORIES_DESCRIPTION . " cd
ON p2c.categories_id = cd.categories_id where p.products_status = '1' and p.products_to_rss='1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'
GROUP BY p.products_id
ORDER BY p.products_id DESC
LIMIT ". (int)MAX_RSS_ARTICLES."";

} else {
// We show them all
$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_model, p.products_price, p.products_image, p.products_date_added, pd.products_name, pd.products_description,
m.manufacturers_name, cd.categories_name, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c LEFT JOIN " . TABLE_CATEGORIES_DESCRIPTION . " cd
ON p2c.categories_id = cd.categories_id where p.products_status = '1' and p.products_to_rss='1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "'
and p2c.categories_id = '" . (int)$current_category_id . "'
GROUP BY p.products_id
ORDER BY p.products_id DESC
LIMIT ". (int)MAX_RSS_ARTICLES."";
}

$subtitle= tep_db_query("select cd.categories_name, c.categories_image from " . TABLE_CATEGORIES . " c, " . TABLE_CATEGORIES_DESCRIPTION . " cd where c.categories_id = '" . (int)$current_category_id . "' and cd.categories_id = '" . (int)$current_category_id . "' and cd.language_id = '" . (int)$languages_id . "'");
$subtitle = tep_db_fetch_array($subtitle);
$subtitle = $subtitle['categories_name'];
$rss_title = BOX_INFORMATION_RSS_CATEGORY;

} else {

// show realy al products
$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_model, p.products_price, p.products_image, p.products_date_added, pd.products_name, pd.products_description,
m.manufacturers_name, cd.categories_name, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c LEFT JOIN " . TABLE_CATEGORIES_DESCRIPTION . " cd
ON p2c.categories_id = cd.categories_id where p.products_status = '1' and p.products_to_rss='1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "'
GROUP BY p.products_id
ORDER BY p.products_id DESC
LIMIT ". (int)MAX_RSS_ARTICLES."";

$rss_title = BOX_INFORMATION_RSS;
}
// echo $listing_sql;
// Execute SQL query and get result
$query = tep_db_query($listing_sql);

/*
* If there are returned rows...
* Basic sanity check
*/
if ( tep_db_num_rows($query) > 0 ){

if ($subtitle != '') $rss_title .= ' - '.$subtitle;

// Encoding to UTF-8
$store_name = utf8_encode (replace_problem_characters($store_name));
$rss_title = utf8_encode (replace_problem_characters($rss_title));
$weblink = utf8_encode ($weblink);
$description = utf8_encode (replace_problem_characters($description));
$email_address = utf8_encode ($email_address);

// SQL header(Last-Modified)
$last_modified = '';
$sql = "SELECT MAX(products_date_added) as mPla, MAX(products_last_modified) as mPlm FROM products WHERE products_to_rss = '1' ORDER BY products_id DESC LIMIT 1";
$sql_result = tep_db_query($sql);
$row = tep_db_fetch_array($sql_result);

if ($row['mPlm'] != '') { $last_modified = $row['mPlm']; }
else { $last_modified = $row['mpla']; }

if(!function_exists('getallheaders')){
function getallheaders(){
settype($headers,'array');
foreach($_SERVER as $h => $v){
if(ereg('HTTP_(.+)',$h,$hp)){
$headers[$hp[1]] = $v;
}
}
return $headers;
}
}

$headers = getallheaders();

$refresh = 1; // refresca por defecto
$etag = md5($last_modified);

if(isset($headers["If-Modified-Since"])) { // Verificamos fecha enviada por el lector RSS
$since = strtotime($headers["If-Modified-Since"]);
if($since >= strtotime($last_modified)) { $refresh = 0; }
}

if(isset($headers["If-None-Match"])) { // Verificamos el ETag
if(strcmp($headers["If-None-Match"], $etag) == 0) {
$refresh = 0;
} else {
$refresh = 1;
}
}

if($refresh == 0) {
header("HTTP/1.1 304 Not changed");
// La primera línea de los headers debe ser el status
// sino el Netcrap se lía y da "No Data"
ob_end_clean(); // Descartamos los contenidos del búfer de salida en cola y lo deshabilitamos
}


// Begin sending of the data
header('Content-Type: application/rss+xml; charset=UTF-8');
//header("Last-Modified: " . tep_date_raw($last_modified));
header('Last-Modified: ' .gmdate("D, d M Y G:i:s", strtotime($last_modified)). ' GMT');
//header('Last-Modified: ' .gmdate("D, d M Y G:i:s T",strtotime($last_modified)) . ' GMT');
header("ETag: " . md5($etag));
echo '<?xml version="1.0"?>' . "\n";
?>
<rss version="2.0"
xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title><?php echo $rss_title; ?></title>
<link><?php echo $weblink;?></link>
<description><?php echo $description; ?></description>
<?php
// Format results by row
while( $row = tep_db_fetch_array($query) ){
$id = $row['products_id'];

// RSS Links for Ultimate SEO (Gareth Houston 10 May 2005)
$link = tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $id, 'NONSSL', false);

$model = $row['products_model'];
$image = $row['products_image'];
$added = date(r,strtotime($row['products_date_added']));

// Setting and cleaning the data
$name = $row['products_name'];
$desc = eval_rss_urls($row['products_description']);

// Encoding to UTF-8
if ($strip_html_tags ==true) {
$name = strip_html_tags($name);
$desc = strip_html_tags($desc);
}

$name = utf8_encode(replace_problem_characters($name));
$desc = utf8_encode(replace_problem_characters($desc));
$link = utf8_encode($link);

$manufacturer = $row['manufacturers_name'];
$manufacturer = utf8_encode ($manufacturer);
$price = tep_add_tax($row['products_price'], tep_get_tax_rate($row['products_tax_class_id']));
if( $discount = tep_get_products_special_price($id) ) {
$offer = tep_add_tax($discount, tep_get_tax_rate($row['products_tax_class_id']));
} else {
$offer = tep_add_tax($row['products_price'], tep_get_tax_rate($row['products_tax_class_id']));
}

if ( $offert=''){
$offert=$row['products_price'];
}

$cat_name = $row['categories_name'];

// Encoding to UTF-8
$cat_name = utf8_encode (replace_problem_characters(strip_html_tags($cat_name)));

// Setting the URLs to the images and buttons
$relative_image_url = tep_image(DIR_WS_IMAGES . $image, $name, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, 'style="float: left; margin: 0px 8px 8px 0px;"');
$relative_image_url = str_replace('">', '', $relative_image_url);
$relative_image_url = str_replace('<img src="', '', $relative_image_url);
$image_url = HTTP_SERVER . DIR_WS_CATALOG . $relative_image_url;

$relative_buy_url = tep_image_button('button_shopping_cart.gif', IMAGE_BUTTON_IN_CART, 'style="margin: 0px;"');
$relative_buy_url = str_replace('">', '', $relative_buy_url);
$relative_buy_url = str_replace('<img src="', '', $relative_buy_url);
$buy_url = HTTP_SERVER . DIR_WS_CATALOG . $relative_buy_url;

$relative_button_url = tep_image_button('button_more_info.gif', IMAGE_BUTTON_MORE_INFO, 'style="margin: 0px;"');
$relative_button_url = str_replace('">', '', $relative_button_url);
$relative_button_url = str_replace('<img src="', '', $relative_button_url);
$button_url = HTTP_SERVER . DIR_WS_CATALOG . $relative_button_url;


// http://www.w3.org/TR/REC-xml/#dt-chardata
// The ampersand character (&) and the left angle bracket (<) MUST NOT appear in their literal form
$name = str_replace('&','&amp;',$name);
$desc = str_replace('&','&amp;',$desc);
$link = str_replace('&','&amp;',$link);
//$cat_name = str_replace('&','&amp;',$cat_name);

$name = str_replace('<','&lt;',$name);
$desc = str_replace('<','&lt;',$desc);
$link = str_replace('<','&lt;',$link);
$cat_name = str_replace('<','&lt;',$cat_name);

$name = str_replace('>','&gt;',$name);
$desc = str_replace('>','&gt;',$desc);
$link = str_replace('>','&gt;',$link);
$cat_name = str_replace('>','&gt;',$cat_name);


$buy_link = tep_href_link(FILENAME_PRODUCT_INFO, tep_get_all_get_params(array('action')) . 'action=buy_now&products_id=' . $id);
// Encoding to UTF-8
$buy_link = utf8_encode ($buy_link);
$buy_link = str_replace('&','&amp;',$buy_link);
$buy_link = str_replace('<','&lt;',$buy_link);
$buy_link = str_replace('>','&gt;',$buy_link);

// Writing the output
echo '<item>' . "\n";
echo ' <title>' . $name . '</title>' . "\n";
echo ' <link>' . $link . '</link>' . "\n";
echo ' <description>' . $desc . '</description>' . "\n";
echo ' <g:image_link>' . HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $image . '</g:image_link>' . "\n";
echo ' <g:price>'. $offer . '</g:price>' . "\n";
echo ' <g:condition>new</g:condition>' . "\n";
echo ' <g:id>' . $id . '</g:id>' . "\n";
echo '</item>' . "\n";
}
}

echo '</channel>' . "\n";
echo '</rss>' . "\n";

/*
* Include the application_bottom.php script
*/
include_once('includes/application_bottom.php');
?>


Et hop vous avez un flux compatible avec Google Merchant.

Écrit par : alexb 11 Mar 2011, 23:13

Bonjour,

J'utilise le script de dvf que j'ai modifié comme ceci :

Code
<?php
/*
$Id: export.php, version 1.2 Vendredi 5 Octobre 2007 Vaisonet Exp $

Contribution Export universel

http://www.dvfstore.com (google export csv)
Copyright © 2007 Vaisonet

Released under the GNU General Public License
*/

  $comp = array("GOOGLE");
  
  $header = "Content-type: text/plain";

  $head = "id\ttitle\tprice\tlink\timage link\tdescription\tbrand\tcondition\n";

  $output .= "go" . $products['products_id'] ."\t";
  $output .= netoyage_html($products['products_name'], 80) . "\t";
  $output .= $price ."\t";
  $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
  $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
  $output .= netoyage_html($products['products_description'], 250) . "\t";
  $output .= $products['manufacturers_name'] . "\t";
  $output .= "new\t";
  $output .= "\n";
  $foot = '';

?>


Cependant cela me rajoute un espace à la fin de chaque ligne et google me dit :
"Nombre de tabulations trop élevé
Vos articles contiennent plus d'attributs que ceux indiqués dans la ligne d'en-tête"

Si quelqu'un peut me dire comment supprimer cet foutu espace, je le remercie par avance smile.gif

Écrit par : loulou1976 22 Mar 2011, 13:21

Bonjour à tous,

J'ai importé mes produits sous google Merchant center.
Techniquement, ils ont bien été remontés à part 5.
Après 3 jours, je viens de découvrir sous mon tableau de bord un graphique qui dit que tous mes produits ont été rejetés sous google shopping.
Mon problème est de savoir pourquoi ?
Je viens d'envoyer un mail à Google à l'adresse mail donnée par yyoossssii pour leur demander mais j'ai peur du délai de réponse.
Sur leur forum d'aide, ils disent que ca peut provenir du moyen de paiement.
Ma question est peut être bête : sur mon site actuel (pas encore oscommerce), je n'ai pas de page sécurisée sauf celle de la caisse d'épargne (seul moyen de paiement actuellement à part le chèque).
Cela est suffisant à google shopping pour être considéré comme pouvant vendre des produits ?
Je ne sais pas si je suis claire dans ma question !!!
Quelles erreurs classiques avez-vous rencontrées qui ne soient pas détectées en automatique mais unqiuement en manuel ?
Cela m'aiderait peut être à trouver pourquoi mes produits sont tous rejetés ...

Merci de votre aide.
Loulou

Écrit par : chrysalide 22 Mar 2011, 14:12

rien de bien grave Loulou1976,

il vont apparaitre dans le graph comme rejetés tant qu'il n'auront pas été examinés.

tu peux le voir dans le menu "produits" tu dois encore avoir le petit sablier qui va bien sur chaque ligne de produit.


EDIT: Au fait, ca peut être long !

Écrit par : loulou1976 22 Mar 2011, 17:01

Merci Chrysalide,

Faut donc que je patiente alors jusqu'à ce que je vois autre chose qu'un sablier dans produit.
Ca a pris longtemps pour toi ? et pour vous les autres ?
Ce que j'aimes pas, c'est le manque d'infos de la part de Google. confused.gif??:
Heureusement qu'il existe des forums smile.gif comme celui-ci.

Écrit par : chrysalide 22 Mar 2011, 17:14

Combien de temps? c'est variable.

J'ai un flux qui été intégré en 15 jours, j'en ai deux autres soumis il y a 1 mois et j'attends toujours.

D'après mes divers lectures, la tendance ne va pas dans le sens d'une intégration rapide......

Écrit par : loulou1976 22 Mar 2011, 17:36

ok Chrysalide blink.gif ça me déprime un peu les délais que tu m'annonces mais bon ... "la patiente est de rigueur" comme m'a dit Gnidhal un jour.
Quand, c'est ok on voit quoi dans produit alors à la place du sablier ???

Merci des tes réponses et bonne soirée
Loulou

Écrit par : chrysalide 22 Mar 2011, 17:46

une coche verte

Écrit par : loulou1976 22 Mar 2011, 17:56

J'aime les coches vertes ... biggrin.gif vive les coches vertes.

Bonne soirée en attendant.

Écrit par : stbo 22 Mar 2011, 18:19

Bonjour,

Si cela peut aider moi après plusieurs tentaives j'ai créer mes fichiers manuellement .......

Code
<?xml version="1.0"?><rss version="2.0"
xmlns:g="[url="http://base.google.com/ns/1.0"]http://base.google.com/ns/1.0"><channel[/url]>

<title>Brique tempete </title>
<link>http://www.charmbijoux.com</link>
<description>Réalisation de gravure photo sur briquet tempete, zippo, cendrier</description>

<item>
<title>Briquet "e-light" graver avec texte gratuit</title>
<g:link>http://www.charmbijoux.com/product_info.php?products_id=817</g:link>
<description>Briquet "e-light"en acier inoxydable avec gravure texte offerte. Rechargeable à gaz.  Dimensions du briquet: 80mm x 20mm. Possibilité de graver sur le briquet  un texte  (prénom, date de naissance,...) au recto et verso. Livré dans sa boîte cadeau. </description>
<g:image_link>http://www.charmbijoux.com/images/photos/gravure/acce-fumeur/G/zorr-Flamme.jpg</g:image_link>
<g:price>15</g:price>
<g:id>light</g:id>
<shipping><country>FR</country>
<service>Lettre Max</service>
<price>5.50</price></shipping>
<g:availability>in stock</g:availability>
<g:condition>new</g:condition>
</item>

</channel>
</rss>

C'est long mais mes produits sont en ligne sous 24H sans rejet de la part de google.
Pour info attention au régle standart de l'orthographe !!!!
Une seul majuscule par phrase. Si plusieurs majsucules dans la phrase elle est rejetée par google.




Écrit par : telede 23 Mar 2011, 04:38

Citation (stbo @ 22 Mar 2011, 18:19) *
C'est long mais mes produits sont en ligne sous 24H sans rejet de la part de google.


Ce n'est pas très commode comme solution, il existe des taches automatiques, cependant tu a choisis, à l'instar de beaucoup de personnes ici, le bon format wink.gif

C'est ce que je fais pour mes clients et ca fonctionne à la perfection.

Citation (stbo @ 22 Mar 2011, 18:19) *
Pour info attention au régle standart de l'orthographe !!!!

Ta recommandation est pertinente, sauf qu'elle comporte 3 fautes dans la même phrase tongue.gif

Écrit par : chrysalide 23 Mar 2011, 09:04

Citation (telede @ 23 Mar 2011, 04:38) *
Ce n'est pas très commode comme solution, il existe des taches automatiques, cependant tu a choisis, à l'instar de beaucoup de personnes ici, le bon format wink.gif


Pas commode du tout, non c'est sure !

Concernant le format , il n' y a pas de bon format, il n'y a que des formats supporté pour l'export et par expérience le xml n'est pas meilleur pour cela que le fichier tabulé.

Les flux que j'ai soumis et déja intégrés étaient des fichiers tabulés. de plus les deux flux que j'ai encore en attente sont pour l'un un fichier xml et l'autre un tabulé.

La différence avec mes précédents flux c'est qu'ils sont nettement plus volumineux 9500 et 7500 produits contre environ 600 pour les précédents.


EDIT :

voila la réponse faite par google concernant les délais de validation des flux.
Citation
Le lancement de Google Shopping a rencontré un grand succès. Les ouvertures de compte ont été nombreuses, ce qui a rallongé les délais d’évaluation de chaque flux. […]


car il y a un paluchage manuel des flux.

Écrit par : chrysalide 28 Mar 2011, 09:12

bon et bien mes deux gros flux qui restaient en attente de validation viennent d'être validés (le 26) donc un peu plus d'un mois pour ceux-ci.

Écrit par : loulou1976 28 Mar 2011, 12:09

Coucou Chrysalide,

Je vais te dégoûter mais mon fichier vient d'être validé aussi après 10 jours... je suis trop contente.
Maintenant, j'aimerais monter dans le classement par pertinence sous google shopping.
Est-ce quelqu'un a des astuces ?

Bonne journée,
Loulou

Écrit par : chrysalide 28 Mar 2011, 16:43

biggrin.gif Ne t'inquiètes pas il m'en faut un peu plus pour me dégouter !

je crois surtout il y a une vraie corrélation entre la durée de validation et la taille du fichier.

tu as combien de produits dans ton fichier ?

Écrit par : loulou1976 29 Mar 2011, 07:16

coucou Chrysalide,

Je n'en ai pas beaucoup, seulement une centaine.
Cela doit venir de ça surement.
Ton fichier d'avant était moins gros ?

Bonne matinée,
Loulou

PS : tu as une idée pour gagner en pertinence (classement par défaut sur Google shopping) ? blink.gif

Écrit par : chrysalide 29 Mar 2011, 08:50

Salut Loulou1976,

en fait j'ai déja indexé une bonne dizaine de flux déja.

Mais en fait, je me suis penché que très récemment sur la question de la durée d'indexation, oubliant mes flux relevés automatiquement pendant plusieurs semaines et découvrant leur indexation lors d'un passage sur google merchant.

Le premier flux que j'ai réellement suivi faisait 600 produits et indexé en 15 jours.

Concernant le positionnement,
je crois qu'il n'est pas bien différent de celui du moteur de recherche classique. Si ton site est bien positionné sous google, il le sera sous shopping mais je creuse encore la question.

J'ai un site qui trust les 10 premières positions sous Google sur le nom d'une marque de produits de piscine et bien son flux étant indéxé depuis quelques jours sous Merchant, celui-ci trust déjà la première page sous shopping.

Donc pour être pas trop mal positionné sous Shopping il faut bosser son ref sous Google.

Écrit par : loulou1976 29 Mar 2011, 11:07

Je sais ce qui me reste à faire : gagner en référencement sur Google.
Pour ça, il faut que je passe avec le nouveau site car l'ancien site ne me permet pas d'optimiser
le référencement.
Merci pour ces détails en tout cas.

A bientôt,
Loulou

Écrit par : telede 9 Apr 2011, 18:30

Bonjour,

Juste un post pour dire que ;

1 - Nous voyons fourmiller depuis quelque temps des "propagateurs de flux" qui proposent leur services en vue de mettre en ligne des flux de produits sur tous les comparateurs et places de marché.

2 - Nous voyons dans ce type de topics, des débrouillards à la petite semaine essayer en vain de diffuser leurs offres sur Google Merchant s'égarer en essayant de suivre les réponses discordantes de "Google Man's"

Avec le recul et l'expérience je me rends compte que :

- La solutions N°1 est encore une fois de la poudre de perlimpinpin au même titre que les prestataires qui vendent des solutions de référencement pour devenir #1 sur Google en quelques jours seulement (après semaines et ensuite mois) ... mais en ayant payé la facture !

- Et l'autre des commerçants qui n’émergeront jamais, ayant la tête dans le guidon, essayant de rabibocher deux morceaux de code pris ici et là, se confier à l'un ou l'autre qui a donné des conseils, en demandant des devis par ci et par là parfois même à des concurrents (!), en oubliant qu'un métier appartient à celui qui le pratique.

Excusez mon intrusion... c'était une simple remarque, je ne vends ni solution #1, ni #2 !
smile.gif

Écrit par : oneill 10 Apr 2011, 10:03

Citation (chrysalide @ 29 Mar 2011, 08:50) *
Concernant le positionnement,
je crois qu'il n'est pas bien différent de celui du moteur de recherche classique. Si ton site est bien positionné sous google, il le sera sous shopping mais je creuse encore la question.

J'ai un site qui trust les 10 premières positions sous Google sur le nom d'une marque de produits de piscine et bien son flux étant indéxé depuis quelques jours sous Merchant, celui-ci trust déjà la première page sous shopping.

Donc pour être pas trop mal positionné sous Shopping il faut bosser son ref sous Google.


Salut tout le monde

Et bien, je ne suis pas tout à fait d'accord avec toi sur ce point.

Sur ta boutique, ton référencement naturel prends en compte tout un panel d'éléments qui ne sont pas pris en compte dans le flux pour la simple raison que tu ne les transmets pas. Tu disposes juste du nom de ton produit et de sa description. Si ton ref naturel est bon, tu risques, évidemment de te retrouver avec les 2 ensemble. Mais l'inverse n'est pas nécessairement vrai et tu peux avoir un produit bien placé en shopping et pas en web. J'utilise le shopping pour épauler mon ref naturel et suppléer, éventuellement, à un positionnement défaillant sur tel ou tel produit que j'aurais pu "louper" en référencement naturel.

Écrit par : brouillard 10 Apr 2011, 11:21

De plus que les pages profondes des produits (deeplink) sont difficiles à référencer, donc cela peut être un bon moyen de faire connaître des produits impopulaires, mais je pense que les liens sont en "noflow" huh.gif (à confirmer).

Mais est ce que cela ne crée pas un "Duplicat content" de la page du produit, si c'est le cas se sont les pages de ta boutique qui seront ignorées au profit de la boutique de GG biggrin.gif

Écrit par : chrysalide 11 Apr 2011, 08:47

Citation (oneill @ 10 Apr 2011, 10:03) *
Et bien, je ne suis pas tout à fait d'accord avec toi sur ce point.


Tu oses ????!!!!! biggrin.gif

Citation (oneill @ 10 Apr 2011, 10:03) *
Sur ta boutique, ton référencement naturel prends en compte tout un panel d'éléments qui ne sont pas pris en compte dans le flux pour la simple raison que tu ne les transmets pas. Tu disposes juste du nom de ton produit et de sa description. Si ton ref naturel est bon, tu risques, évidemment de te retrouver avec les 2 ensemble. Mais l'inverse n'est pas nécessairement vrai et tu peux avoir un produit bien placé en shopping et pas en web. J'utilise le shopping pour épauler mon ref naturel et suppléer, éventuellement, à un positionnement défaillant sur tel ou tel produit que j'aurais pu "louper" en référencement naturel.


tu oublie qu'au delà de la description et du non du produit, tu passes d'autres infos qui peuvent permettre à GG de baser son positionnement sous Shopping en fonction du positionnement sous le moteur de recherche comme l'url. je ne dis pas avoir raison mais je trouva ça tangible. De toute façon comme seul google à la recette.......

Par contre l'optimisation SEO (que normalement tout le monde doit faire) est un forcement un point de levier important (voir plus que pour le moteur de recherche) pour faire décoller son positionnement.

D'ailleurs je n'ai pas encore vu de formation sur le sujet signe que cela laisse encore tout le monde un peu dubitatif. blink.gif

Écrit par : chrysalide 11 Apr 2011, 08:48

Citation (brouillard @ 10 Apr 2011, 11:21) *
Mais est ce que cela ne crée pas un "Duplicat content" de la page du produit, si c'est le cas se sont les pages de ta boutique qui seront ignorées au profit de la boutique de GG biggrin.gif


il ne manquerait plus que ça ! biggrin.gif

Écrit par : oneill 11 Apr 2011, 09:06

Citation (chrysalide @ 11 Apr 2011, 08:47) *
Citation (oneill @ 10 Apr 2011, 10:03) *
Et bien, je ne suis pas tout à fait d'accord avec toi sur ce point.


Tu oses ????!!!!! biggrin.gif

tu oublie qu'au delà de la description et du non du produit, tu passes d'autres infos qui peuvent permettre à GG de baser son positionnement sous Shopping en fonction du positionnement sous le moteur de recherche comme l'url. je ne dis pas avoir raison mais je trouva ça tangible. De toute façon comme seul google à la recette.......


Et oui...

J'ai dis ca car j'ai remarqué des différences au niveau des expressions de recherche. Sur le nom d'article simple, je sors sur les 2. Avec le nom + une expression, je ne sors qu'avec le web.

Écrit par : figaro 12 May 2011, 12:21

Bonjour Gnidhal,

J'ai tout simplement utilisé ton ci dessous pour importer mes produits dans shopping.
Après quelques jours, je viens de recevoir une réponse google qui les refusent car j'ai sur certains produits une différence dans les prix, minime mais effective....
Comment cela se fait ? j'ai vérifié a nouveau le fichier xml et l'erreur est toujours existante.... vois tu une raison a cela ?

Merci pour ton aide.
Figaro

Citation (Gnidhal @ 30 Nov 2010, 00:06) *
ok, perso j'utilise ce code pour gg merchant :
Code
<?php
/*
$Id: g_merchant.php,v 1 20/11/2010 18:30:26:fxm - gnidhal Exp $

osCommerce, Open Source E-Commerce Solutions

Copyright © 2010 osCommerce

Released under the GNU General Public License
*/
function clean_desc($t){
   $t = nl2br($t);
   $t = strip_tags(preg_replace('`<br(\s?\/)?'.'>`i', "\n",html_entity_decode($t)));
   $t = htmlspecialchars($t);
   return $t;
}
require('includes/application_top.php');


define ('DISPLAY_PRICE_WITH_TAX', true);

  $content = '<?xml version="1.0" encoding="ISO-8859-1"?'.'>'."\n";
  $content .= '<rss version="2.0"
  xmlns:g="http://base.google.com/ns/1.0">'."\n";
  $content .= '  <channel>'."\n";
  $content .= '<title>Catalogue de '. HTTP_SERVER . DIR_WS_HTTP_CATALOG.'</title>'."\n";
  $content .= '<link>'. HTTP_SERVER . DIR_WS_HTTP_CATALOG.'</link>'."\n";
  $content .= '<description>Description du site</description>'."\n";

// On vérifie la langue utilisée dans le catalogue
$language_code = (isset($HTTP_GET_VARS['language']) && tep_not_null($HTTP_GET_VARS['language'])) ? $HTTP_GET_VARS['language'] : DEFAULT_LANGUAGE;


// Requête identifiant les produits disponibles dans le catalogue
$products_query = tep_db_query("SELECT p.*, pd.products_name, pd.products_description as description FROM " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd WHERE p.products_id = pd.products_id AND p.products_status = 1 AND pd.language_id = FLOOR($languages_id) ORDER BY p.products_price, pd.products_name ");

$product_num = 0;

while($products = tep_db_fetch_array($products_query)) {

if (intval($products['manufacturers_id']) > 0) {
  $manufacturers_query = tep_db_query("SELECT manufacturers_name FROM " . TABLE_MANUFACTURERS . " WHERE manufacturers_id = " . $products['manufacturers_id']);
  $manufacturers_result = tep_db_fetch_array($manufacturers_query);
  $products['manufacturers_name'] = $manufacturers_result['manufacturers_name'];
}

$special_query = tep_db_query("SELECT specials_new_products_price  FROM " . TABLE_SPECIALS . " WHERE products_id = " . $products['products_id']);
if ($special_result = tep_db_fetch_array($special_query))
  $products['products_price'] = $special_result['specials_new_products_price'];

$product_num++;
$content .= "<item>\n";
$content .= "\t<title>".$products['products_name']."</title>\n";
$content .= "\t<link>".tep_href_link("product_info.php?products_id=". $products['products_id'])."</link>\n";
$content .= "\t<description>".clean_desc($products['description'])."</description>\n";
$content .= "\t<g:image_link>".HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image']."</g:image_link>\n";
$content .= "\t<g:price>".preg_replace('`€`',' EUR',$currencies->display_price($products['products_price'], tep_get_tax_rate($products['products_tax_class_id'])))."</g:price>\n";
$content .= "\t<g:brand>".$products['manufacturers_name']."</g:brand>\n";
$content .= "\t<g:condition>new</g:condition>\n";
$content .= "\t<g:availability>in stock</g:availability>\n";
$content .= "\t<g:shipping_weight>".round($products['products_weight'])." kg</g:shipping_weight>\n";
$content .= "\t<g:id>".$products['products_model'].'_'.$products['products_id']."</g:id>\n";
$content .= "</item>\n";
}

$content .= "</channel>\n";
$content .= "</rss>\n";
/** Activer la ligne suivante pour écrire un fichier rss xml à la racine, attention uniquement PHP5!**/
//file_put_contents('g_merchant.xml', $content);
// tep_redirect('g_merchant.xml'); // optionnel
Header( 'Content-Type: text/xml' );
echo $content;
require(DIR_WS_INCLUDES . 'application_bottom.php');
?>

c'est réduit à l'essentiel mais ça fonctionne.

Attention si les descriptions sont longues, il faudra peut-être les tronquer.
Enfin les lignes 26 et 28 sont à personnaliser pour le site.


Écrit par : Garga 13 May 2011, 18:17

figaro,

ton code ne prend pas en compte les promotions de ton site (specials).
J'ai eu le même problème, une fois corrigé, l'intégration devrait être rapide...

Perso je suis parti d'un truc genre:

CODE
$price = tep_add_tax($row['products_price'], tep_get_tax_rate($row['products_tax_class_id']));
if( $discount = tep_get_products_special_price($id) ) {
$offer = tep_add_tax($discount, tep_get_tax_rate($row['products_tax_class_id']));
} else {
$offer = tep_add_tax($row['products_price'], tep_get_tax_rate($row['products_tax_class_id']));
}


A intégrer dans ton code bien sur ^^

Bon code

Écrit par : dark perles 1 Jun 2011, 05:46

Bonjour,

J'ai une petite question :
Pour l'instant mon flux est en attente de validation depuis le 28/05 mais dans l'interface j'ai dans la qualité des données
Codes produit uniques manquants sur 67% de mes articles.

Je ne vois pas quoi rajouter dans mon flux ?

Liste de mon flux pour un <item>
<title>
<link>
<description>
<g:image_link>
<g:price>
<g:id>
<g:product_type>
<g:availability>
<g:online_only>
<g:genre>
<g:condition>
<g:brand>
<g:mpn> <-- Ajouter pour essai de correction du problème
<g:manufacturer>
<g:shipping_weight>

unsure.gif

Écrit par : telede 1 Jun 2011, 06:15

Citation
Type d'erreur Pourcentage Nombre
Codes produit uniques manquants 7 % 64


J'ai le même problème que toi,

L'id que j'exporte est pourtant le products_id donc un auto-increment donc un code unique :
Code
<g:id>3728</g:id>


Et le mpn, facultatif, je ne l'utilise pas ...

QUID ?

Écrit par : Jesam 1 Jun 2011, 07:09

Les codes produits n'ont rien à voir avec l'ID produit que tu entres bien.

C'est une nouveauté de GG annoncée il y a un mois.

Il faut ajouter un champ dans tes fiches produit pour ajouter ce code produit puis modifier ton fichier XML ou TXT pour l'y inclure.

Le code produit en question est soit le code UPC, EAN, ISBN... voir ici http://www.google.com/support/merchants/bin/answer.py?hl=fr_FR&answer=160161

Je sais c'est long à renseigner...

Écrit par : gotcha5832 1 Jun 2011, 12:14

Bonjour a tous,

Je me pose deux petite question
Un avec un catalogue d'un milliers de produit vous gerer le fichier en une fois, une seule requete?
Vous ne reseigner pas <g:product_type>

Merci a vous

Écrit par : Jesam 1 Jun 2011, 13:23

Oui, je génère un seul fichier même avec plusieurs milliers de produits.
Perso je n'utilise pas <g:product_type> et celà ne me gène pas du tout pour la visibilité sous GM.

Écrit par : telede 1 Jun 2011, 14:01

Citation (Jesam @ 1 Jun 2011, 07:09) *
Les codes produits n'ont rien à voir avec l'ID produit que tu entres bien.

C'est une nouveauté de GG annoncée il y a un mois.


Je vois et je te remercie beaucoup pour l'info et le lien wink.gif



Écrit par : gotcha5832 1 Jun 2011, 15:34

@jesam
Je te remercie.

Écrit par : telede 1 Jun 2011, 17:21

Citation (gotcha5832 @ 1 Jun 2011, 15:34) *
@jesam
Je te remercie.

+1

C'est du pro clair et concis.

Ceinture noire wink.gif

Écrit par : Jesam 1 Jun 2011, 17:44

Merci à vous.

Pour compléter ma réponse, les codes produits vont servir à rapprocher les produits ayant donc le même code produit, donc pour faire "du vrai comparateur de prix".

J'en profite pour poser une question, quelqu'un a-t'il des avis formulés sur GM comme on peut voir ici sous les noms des sociétés http://ow.ly/57MFs
O-buro, 3 avis...
Si oui comment as-tu fait ? (en solution gratuite ou payante)

Écrit par : oneill 1 Jun 2011, 18:42

Citation (Jesam @ 1 Jun 2011, 17:44) *
Pour compléter ma réponse, les codes produits vont servir à rapprocher les produits ayant donc le même code produit, donc pour faire "du vrai comparateur de prix".


Et bien voila ! Personne ne me dit rien à moi... ou presque wink.gif

Écrit par : telede 2 Jun 2011, 06:57

Citation (Jesam @ 1 Jun 2011, 17:44) *
Merci à vous.

Pour compléter ma réponse, les codes produits vont servir à rapprocher les produits ayant donc le même code produit, donc pour faire "du vrai comparateur de prix".

J'en profite pour poser une question, quelqu'un a-t'il des avis formulés sur GM comme on peut voir ici sous les noms des sociétés http://ow.ly/57MFs
O-buro, 3 avis...
Si oui comment as-tu fait ? (en solution gratuite ou payante)


Oui ca apparait comme étant comme une évidence, toutes les market place imposent l'usage des code UPC pour les US ou EAN pour l'Europe et il est à mon sens rentable de les exploiter, ce n'est que mon opinion, ça n'a donc pas de valeur à prescrire.

Concernant les avis clients, j'ai été étonné de l'adaptation de google au marché Français hormis le fait que ca m'est apparut pertinent car rentable en voyant le niveau d'intégration (i mean Google Merchant > Google Adwords). Il s'agit à priori d'un simple "http://www.google.fr/search?hl=fr&biw=1680&bih=764&q=grep&um=1&ie=UTF-8&sa=N&tab=fw" ou extrait des commentaires clients provenant de site connus et particulièrement de Fia-Net pour ceux qui sont affiliés.

Je me demande même si Fia-Net ou d'autres ne seraient pas entrain d'intenter une procédure, ce qui paraitrait logique ; la collecte de ces informations a forcément un coût, et le formatage réalisé par google dépasse la simple représentation d'un résultat d'un moteur de recherche.

J'entends par la donc que nous avons un exemple d'abus de position de part le fait que des tiers mettent a dispositions des informations concurrentielles mais il n'est pas implicite que celles ci soient gratuites.

Je suis pas législateur, juriste ou avocat mais je pense que nous allons en entendre parler bientôt...


Question, pourquoi l'usage de cette URL ? tu es le promoteur ?

Écrit par : rol 2 Jun 2011, 08:45

Bonjour Telede,

Je ne pense pas que cela pose un problème pour Fianet, car je les ai eu au téléphone et ils ont une augmentation d'achat des seau de confiance.

Donc je pense que cela fais une mise en avant, même si d'un point de vue légal je reste également partagé.



Écrit par : gotcha5832 16 Jun 2011, 10:05

Dite moi petite question concernant les flux.
puis soumettre un .php sous forme de xml
Ou dois créer un xml avec mon php et soumettre le xml?

Écrit par : gotcha5832 12 Jul 2011, 11:03

Voila je me pose des question concernant google shopping et ses avis clients.

J'ai bien des avis de client sur mon site mais je suppose que ca ne fonctionne pas.
Il semblerais qu'il prennent les avis de :
* Achète en Ligne
* Avistore
* Ciao.fr
* LeGuide.com
* ma-Reduc.com
* iComparateur
* InfoAchat
* Kelkoo France
* Rue-Hardware.com
* Shopzilla.fr
* Tous Les Prix


Sachant que si je dis pas de bêtise il sont tous payant à l'exeption de achète en ligne???? et ma-reduc (mais pour lequel il faut proposer des réduc)

Donc hormis payé et croiser les doigts pour qu'un clients veuille bien y déposer une critique il n'y a pas de solution pour recevoir des avis clients?

Écrit par : chrysalide 13 Jul 2011, 20:34

Ca bouge chez Google,

reçu ce jour :

Citation
Bonjour,

Merci d'avoir choisi Google Shopping. Nous sommes en train d'apporter d'importantes modifications aux attributs obligatoires et au règlement du programme de Google Shopping. Tous les marchands sont concernés par ces modifications.

Nous avons notamment mis en place une nouvelle série d'attributs de base obligatoires. De même, certains attributs sont maintenant requis pour des catégories de produits et des pays cibles spécifiques. Veuillez lire attentivement l'article suivant relatif aux nouvelles spécifications techniques afin d'identifier les modifications qui devront être apportées à vos flux de données : http://www.google.com/support/merchants/bin/answer.py?answer=188494&expand=FR

Vous trouverez un tableau récapitulatif des nouvelles exigences à l'adresse suivante : http://www.google.com/support/merchants/bin/answer.py?answer=1344057

À compter du 22 septembre prochain, les comptes non conformes aux nouvelles exigences seront suspendus. Pour plus d'informations sur la mise en application du nouveau règlement, reportez-vous à cet article du centre d'aide : http://www.google.com/support/merchants/bin/answer.py?answer=188484

Nous vous invitons à mettre à jour vos paramètres de compte ou vos flux de données le plus rapidement possible, afin d'être assuré de remplir les nouvelles exigences aux dates mentionnées ci-dessus. Pour plus d'informations sur ces modifications, veuillez consulter notre blog à l'adresse http://adwords-fr.blogspot.com/2011/07/importantes-modifications-apportees-aux.html?spref=tw.

Cordialement,

L'équipe Google Shopping



bon et bien ca va faire un peu de taf.........

Écrit par : skieur 17 Jul 2011, 12:22

En effet il faut a priori rajouter l'information de stock et les catégories google pour certains produits.

Est ce que quelqu'un à fait pour l'information de stock ?

A plus.

Écrit par : chrysalide 19 Jul 2011, 12:15

D'après les infos données, c'est un peu plus compliqué que ça !

Écrit par : telede 19 Jul 2011, 17:06

Citation (chrysalide @ 19 Jul 2011, 12:15) *
D'après les infos données, c'est un peu plus compliqué que ça !

Je n'ai pas suivi l'actualité Google,

Les grandes galeries marchandes, je le sais car ayant développé un module amazon market place justement,
ont leur propre système de catégorisation.

Tu penses donc que Google a réagit de la même manière ? Ils offrent des gestion de catégories ? un mapping de categories s'impose ?

Tu as plus d'informations à ce sujet ?

Écrit par : skieur 25 Jul 2011, 21:22

Citation
D'après les infos données, c'est un peu plus compliqué que ça !


Non ce n'est pas ce que j'ai lu dans leur notice d'info. C'est plus compliqué pour certains articles comme les vêtements pour lesquels il faut les catégories google c'est tout.

A plus.

Écrit par : oneill 2 Aug 2011, 08:28

Apparemment pour la bibine aussi

Code
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Brandy
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Brandy > Cognac
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Gin
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Liqueurs
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Rhum
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Schnaps
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Tequila
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Vodka
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Whisky
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Whisky > Bourbon
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Whisky > Scotch
Gastronomie, boissons et tabac > Breuvages > Liqueurs et spiritueux > Whisky > Whisky irlandais
Gastronomie, boissons et tabac > Breuvages > Soda
Gastronomie, boissons et tabac > Breuvages > Vin
Gastronomie, boissons et tabac > Breuvages > Vin > Alcool de riz
Gastronomie, boissons et tabac > Breuvages > Vin > Champagne
Gastronomie, boissons et tabac > Breuvages > Vin > Vin de dessert
Gastronomie, boissons et tabac > Breuvages > Vin > Vin de dessert > Porto
Gastronomie, boissons et tabac > Breuvages > Vin > Vin de dessert > Sherry
Gastronomie, boissons et tabac > Breuvages > Vin > Vin de dessert > Vermouth

Écrit par : chrysalide 2 Aug 2011, 11:57

Salut Oneill,

tu as trouvé la liste complète de catégories Google ou juste celles qui te concerne ?

Car je la cherche cette liste et a part des bouts a droite et a gauche, rien !

Écrit par : chrysalide 3 Aug 2011, 20:46

Si cela branche quelqu'un j'ai trouvé la liste des catégories google merchant.

http://http://www.google.com/support/merchants/bin/answer.py?hl=fr&answer=160081

Écrit par : oneill 3 Aug 2011, 20:54

Désolé, je suis pas mal pris en ce moment

http://www.google.com/basepages/producttype/taxonomy.fr-FR.txt

Écrit par : chrysalide 8 Aug 2011, 22:13

pas grave oneill,

je suis en train de penser a une crontrib permettant une intégration propre des cat google dans la veille.

je vois le truc comme ça:

- une table google_categorie avec comme champs

google_categorie_id
language_id
google_categorie_name
google_categorie_status

l'ajout d'un champs google_categorie_id dans la table products


- Une page de configuration afin de valider individuellement les catégories pertinentes pour la boutique exploitant la contrib.

- la modification de categorie.php dans l'admin afin de permettre la sélection de la google_categorie pour chaque produit.

- Modification du script google.php pour exu afin d'exploiter cette nouvelle info.

Quand pensez-vous ?



Écrit par : oneill 26 Aug 2011, 11:04

Ce que j'en pense : Ca va être galère...

J'ai déjà intégré les codes à barre avec donc, reprise de chaque article existant pour une mise à niveau et, rien que ca, ca m'a saoulé. Alors penser ajouter les catégories google une par une parmi les 3896 imposées pour chacun de mes centaines d'articles(milliers pour certains) me file des migraines sévères. Ce travail de bagnard va vite devenir imbuvable.
Je n'ai pas encore attaqué le code mais je pense, plutôt, profiter des catégories de mes produits en les liant à différentes catégories google qui m'intéressent au moment de la création de mon fichier d'export au lieu d'encombrer ma base de données avec tout le foutoir de google...
J'ai déjà procédé ainsi pour LeGuide et ca se passe bien. Si chaque moteur ou annuaire y va de ses propres catégories comme ca semble devenir le cas, va falloir investir dans un data center !

Qu'en penses-tu (à ton tour) ? ninja.gif

Écrit par : chrysalide 26 Aug 2011, 13:50

moi je vois le truc avec une page dans l'admin pour n'activer que les catégories Google pertinentes pour la boutique cela évite dans l'admin lors de l'association d'un produit ou d'une catégorie a une catégorie google de se taper les xxx catégories Google existantes en limitant a celles pertinantes pour le site en question.

au niveau de l'association produits ou catégories et bien je répondrai que ca peut être les deux "mon général" avec une priorité pour la cat google du produit

si cat_google_produit existe alors cat_google = cat_google_produit sinon cat_google = cat_google_categorie

je suis d'accord que pour le vieuxde la vieille du ecommerce se retaper le catalogue pour faire l'update produit par produit ca va pas être simple donc c'est peut être une bonne solution pour gérer ça globalement en n'oubliant pas les exceptions qui peuvent exister.

exemple : catégorie miel ou l'on trouve évidement du miel (alimentaire) mais aussi la cuillère et un pot verseur (ustensile de cuisine).


le truc s'est que google aurait pu tous mettre obligatoire dès le début (1 an) au lieu de mettre plein d'infos facultatives et ensuite les passer obligatoires, ca aurait éviter de reprendre le taf tout les 6 mois.

Écrit par : skieur 23 Sep 2011, 09:18

Citation (oneill @ 26 Aug 2011, 11:04) *
...

J'ai déjà intégré les codes à barre avec donc, reprise de chaque article existant pour une mise à niveau et, rien que ca, ca m'a saoulé.


Est ce que par hasard tu paurait le code pour rajouiter le champ EAN sur la fiche produit dans l'admin ?

Merci.

Écrit par : skieur 23 Sep 2011, 22:22

Résolu grâce à Bar code.

Merci.

Écrit par : sanjb 4 Oct 2011, 09:54

Citation (skieur @ 23 Sep 2011, 22:22) *
Résolu grâce à Bar code.

Merci.

Tu as utilisé quelle contrib?
J'ai trouvé celle ci: http://addons.oscommerce.com/info/7130 que je n'ai pas encore installée car je voulais savoir si certain d'entre vous l'avait utilisée et si oui, si elle marchait bien.
Merci!

Écrit par : krokus 4 Oct 2011, 22:45

be euh comment dire ya pas vraiement de rapport entre les deux.
cet addon modifie The Feedmachine Solution pour sortir un fichier compatible avec Google Product Search
regarde plustot ici http://contributions.oscommerce-fr.info/index.php?cPath=65_178
enfin si c'est du code barre que tu cherches

Écrit par : sanjb 5 Oct 2011, 08:49

OK, mais justement ce thread n'est pas sur Google Shopping?
Si on ne rajoute que le code barre, cela ne sera pas validé par Google Shopping car ils veulent que l'on spécifie les catégories google pour les produits par exemple...
As tu une contrib qui marche bien pour faire un export du catalogue vers Google shopping/merchand?
Merci

Écrit par : krokus 5 Oct 2011, 18:11

Si tu as tout lu tu as du comprendre que google modifie ses demandes tous les 15 jours alors je crois pas qu'il y est d'addon qui fonctionne, c'est que du bidouillage pour coller au plus pres et avec de la chance google l'accept, j'ai essaye la soluce de Gnidhal elle me sort sort un fichier xml nickel mais google en a rien à faire il lui manque toujours un truc, bof j'ai laisse tomber.

Écrit par : skieur 7 Oct 2011, 09:06

Pour sanjb

J'ai utilisé http://addons.oscommerce.com/info/7129 + export universel + de la modif perso.


A plus.

Écrit par : sanjb 7 Oct 2011, 10:03

Oki!
Merci

Écrit par : juju74 12 Dec 2011, 15:44

bonjour!

j'ai bien réussi a installer cette contribution le seul souci c'est que le code générer est comme cela:
http://www.monsite.com/catalog/export.php?format=google.php&p=code&language=fr&libre=

voici leurs réponses:

Remarque : Les noms de fichiers comportant des caractères spéciaux ne sont pas pris en charge.
Les caractères suivants ne sont pas autorisés : &, /, :, =, ?

auriez vous la solution a mon problème?
merci!

Écrit par : coeurderock 21 Feb 2012, 18:47

Bonjour,



Je viens d'installer Export universal avec un module que j'ai adapté pour google merchant,

Mes produits sont en attente de validation , procédure normale si j'en crois vos messages précédents.
Cependant j'ai une inquiétude car beaucoup de mes produits apparaissent dans des sous-catégories et donc duplicate sur Google merchant qui n'accepte que des produits uniques ma question est donc comment pourrait on faire pour n'exporter que les produits de la catégorie principale? et non le catalogue entier. Si l'un de vous peux m'indiquer la voie à suivre cela me serait d'un grand secours.

Merci unsure.gif

Écrit par : coeurderock 21 Feb 2012, 18:55

Pour juju74,



En fait moi je choisis l'option cache : met l'URL obtenue dans mon navigateur cela génère un fichier txt et c'est ce fichier que je télécharge ensuite sur google marchand comme cela on dirait que ça fonctionne, par contree je ne me suis pas encore penché sur l'automatisation du processus, tant que je ne suis pas sur que mon flux est accepté, mais cela doit pouvoir se faire avec un chron

CDLT smile.gif

Écrit par : juju74 18 Feb 2013, 18:07

merci pour toutes ces infos très utiles!
Google refuse car il manque les disponibilités que se soit avec un URL ou en fichier TXT.
il me manque aussi l'attribut lien image? (auriez vous une idée??)

Erreur :
Attribut obligatoire manquant : disponibilité


Article traité :


Nom de l'attribut

Valeur de l'attribut


titre xxx
état neuf
descriptif xxxx
id 16
lien http://www.xxx.com/catalog/produits-p-216.html
prix xxx
disponibilité

Article envoyé via votre flux :

comment réparer cette erreur?
merci beaucoup pour votre coup de pouce!

coeurderock , j'ai essayé t'as technique, ca me donne une fois de plus l'erreur de disponibilités des produits (même si je les affiches sur le site.

Écrit par : stbo 19 Feb 2013, 17:13

Il faudrait avoir un bout du code pour voir ce qui ne va pas

Écrit par : juju74 21 Feb 2013, 08:20

merci pour t'as réponse stbo!

voici le code:

Code
$comp = array("GOOGLE");
  
  $header = "Content-type: text/plain";

  $head = "id\ttitle\tprice\tlink\timage link\tdescription\tlivraison\tbrand\tfeatured_product\tcondition\tmanufacturer\tavailabilit\tgtin\tTVA\n";

  $output .= "go" . $products['products_id'] ."\t";
  $output .= netoyage_html($products['products_name'], 80) . "\t";
  $output .= $price ."\t";
  $output .= tep_href_link(FILENAME_PRODUCT_INFO, 'products_id=' . $products['products_id']) . $libre . "\t";
  $output .= HTTP_SERVER . DIR_WS_HTTP_CATALOG . DIR_WS_IMAGES . $products['products_image'] ."\t";
  $output .= netoyage_html($products['products_description'], 250) . "\t";
  $output .= "2,9:::"  . $ship . "\t";
  $output .= $products['manufacturers_name'] . "\t";
  $output .= $promo . "\t";
  $output .= "new\t";
  $output .= $products['manufacturers2_name'] . "\t";
$output .= "2\t";
$output .= $products['products_barcodes']. "\t";
  $output .=  "0::" . $vat . " :o " . "\n";
  $foot = '';

?>

Écrit par : stbo 22 Feb 2013, 19:30

Moi j'ai un code qui fonctionne avec un fichier xml si cela t'interresse


<?xml version="1.0"?><rss version="2.0"
xmlns:g="http://base.google.com/ns/1.0>

<title>Bracelet prenom italien personnalsiable</title>
<link>http://www.XXX.com</link>
<description>Bracelet italien personnalisable avec prenom et motif. Vous avez la possibilité de réaliser vous même votre bracelet avec votre prenom, des logos, ou autres motifs selon votre humeur </description>

<item>
<title>Bracelet Acier brossé mat et prenom offert</title>
<g:link>http://www.XXX.com/product_info.php?products_id=105</g:link>
<description>Bracelet Acier brossé mat. Composé de 18 maillons de 9 mm chacun, assemblés les uns aux autres par un système de ressort. Le bracelet peut se faire en plusieurs dimensions. Tous les maillons sont interchangeables. </description>
<g:image_link>http://www.XXX.com/images/photos/Braceletprenom/G/BI-mat-PM.jpg</g:image_link>
<g:price>20</g:price>
<g:id>BI-03</g:id>
<g:mpn>BI-03</g:mpn>
<g:feature>acier inoxydable</g:feature>

<g:product_type>cadeau personnalisé; maison, homme,femme</g:product_type>
<shipping><country>FR</country>
<service>Lettre Max</service>
<price>5.50</price></shipping>
<g:availability>in stock</g:availability>
<g:condition>new</g:condition>
<g:google_product_category>Vêtements et accessoires &gt; Accessoires d'habillement &gt; Bracelets et gourmettes</g:google_product_category>
<g:brand>Société XXX</g:brand>

</item>
cODE PRIX SUR GOOGLE merchant qui fonctionne je n'ai pas du tout ton code

tu ajoute autant item que tu veux




Écrit par : juju74 24 Feb 2013, 10:06

très intéressant! merci!
comment as tu fais pour générer ce code XML?

bon weekend!

Écrit par : stbo 25 Feb 2013, 08:30

J'ai utilisé dreamweaver.

Attention je ne suis pas doué en php !!! tu ouvres un fichier, tu colles mon code tu enregistres en xml, et c'est fini

puis sur google tu telecharges le fichier

les indices sont sur google http://support.google.com/merchants/bin/answer.py?hl=fr&answer=188494#FR

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)