Jump to content
gottaloveit

Automatically send data feed to Froogle

Recommended Posts

Has anything changed very recently on Google Merchant feeds? On Friday we submitted our standard feed (7,000+ products) we've been doing for months, no issues. Today we submit with a few minor changed and we get "0 of 7,000 items inserted". Can't seem to find an issue. anyone having similar problems?

 

Thanks!

Share this post


Link to post
Share on other sites

Google has changed how they handle the feeds. You have to pay to be listed now. If you want to continue having your products listed in their shopping area, you have to create an account for paying.

Share this post


Link to post
Share on other sites

Google changed the requirements a while back. The Shopping listings are now a paid service, so if you don't have an account set up to pay them for listings you're not doing any good anyway.

 

Regards

JIm


See my profile for a list of my addons and ways to get support.

Share this post


Link to post
Share on other sites

Actually we have a PLA (Product Listing Ad) setup with our Google Adwords account. We first upload to the "test feed" we have setup to ensure all the products are "inserted" without errors, then we upload to the actual feed. Our test feed is not being inserted but our actual feed from Friday is/was inserted. I should have outlined this in the original post.

Share this post


Link to post
Share on other sites

I have one master google merchant center account on which I have four shops with google base uploads that are accepted and processed. Only one of the shops actually has an active adword campaign, but apparently that's all google needs because the other three shops upload as well to google base.


I am not a professional webmaster or PHP coder by background or training but I will try to help as best I can.

I remember what it was like when I first started with osC. It can be overwhelming.

However, I strongly recommend considering hiring a professional for extensive site modifications, site cleaning, etc.

There are several good pros here on osCommerce. Look around, you'll figure out who they are.

Share this post


Link to post
Share on other sites

Hello and thanks to Jack for his important contrib.

I had never installed this contrib, so I installed version 3.0 on 18-Mar-2012 but unfortunately I can not make it work.

 

Running googlebase.php i receved this error:

: SQL error Unknown column 'categories.categories_id' in 'field list'| catInfo = SELECT categories.categories_id AS curCatID, categories.parent_id AS parentCatID, categories_description.categories_name AS catName FROM goldtest_categories, goldtest_categories_description WHERE categories.categories_id = categories_description.categories_id AND categories_description.language_id = 6

 

All the tables in my shop have a prefix (goldtest_) that has been placed in the file database_table.php

 

(Note: I use the shop in Italy and the Italian language for me is the language_id = 6)

 

Help me ... I can not understand where is the error. Thanks in advance

 

So I have changed the SELECT statement in the file googlebase.php that looks like this:

 

<?php
//  Title: Google Base Data Feeder
//  Version: 3.0 by Jack_mcs at oscommerce-solution.com
//  google feed requirements - http://www.google.com/support/merchants/bin/answer.py?hl=en&answer=188494

chdir('../');
include_once 'includes/application_top.php';

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

define('SEO_ENABLED','true');    //Change to 'false' to disable if Ultimate SEO URLs is not installed
define('FEEDNAME', 'googlebase.txt');	   //from your googlebase account
define('DOMAIN_NAME', HTTP_SERVER . DIR_WS_CATALOG); //www.yourwebsite.com/catalog/  -  your correct domain name (don't include www unless it is used but do include the shops directory)
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', (isset($_GET['noftp']) ? '0' : '1'));	  //set to 0 to disable - Spostata alla riga 109
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_ID', 6);   //Change this to the id of your language. Nella mia versione: ITALIAN=1 | ENGLISH=7
define('QUOTES_CATEGORY_NAME',''); //if the Quotes contribution is installed, enter the name of the quotes category here

/*************** OPTIONS - IF ENABLED, ALSO SET THE SIMILAR OPTION FARTHER DOWN ******************/
/*************** ENANLED=1  DISABLED=0 ***********************************************************/

define('OPTIONS_ENABLED', 1); // Se settato ad 1 abilita il seguente blocco di OPZIONI

define('OPTIONS_ENABLED_AGE_RANGE', 0);
define('OPTIONS_ENABLED_ATTRIBUTES', 0);
define('OPTIONS_ENABLED_BRAND', 1);		    //if set, see options for this setting below
define('OPTIONS_ENABLED_CONDITION', 1);
define('OPTIONS_ENABLED_CURRENCY', 0);
define('OPTIONS_ENABLED_EXPIRATION', 1);
define('OPTIONS_ENABLED_FEED_LANGUAGE', 0);
define('OPTIONS_ENABLED_GTIN', 0);			  //if set, a database field named "products_gtin" must exist. GTIN = Global Trade Item Numbers
define('OPTIONS_ENABLED_GOOGLE_PRODUCT_CATEGORY', 0); //http://www.google.com/support/merchants/bin/answer.py?answer=160081
define('OPTIONS_ENABLED_GOOGLE_UTM', 0);
define('OPTIONS_ENABLED_ISBN', 0);			  //if set, a database field named "products_isbn" must exist
define('OPTIONS_ENABLED_MADE_IN', 0);
define('OPTIONS_ENABLED_MPN', 0);			   //if set, see options for this setting below. MPN = Manufacturer Part Number
define('OPTIONS_ENABLED_PRODUCT_MODEL', 0);	 //displays the product model
define('OPTIONS_ENABLED_PRODUCT_TYPE', 1);
define('OPTIONS_ENABLED_SHIPPING', 0);
define('OPTIONS_ENABLED_INCLUDE_TAX', 0);	   //0 = no tax, 1 = uses google method, 2 = UK Vat
define('OPTIONS_ENABLED_UPC', 0);			   //if set, a database field named "products_upc" must exist. UPC = Universal Product Code
define('OPTIONS_ENABLED_WEIGHT', 0);

//some of the following only work if the matching option is enabled above.
define('OPTIONS_AGE_RANGE', '20-90 years');

define('OPTIONS_AVAILABILITY', 'quantity');	 //in stock - Include this value if you are certain that it will ship (or be in-transit to the customer) in 3 business days or less.
										    //available for order - Include this value if it will take 4 or more business days to ship it to the customer.
										    //out of stock - You’re currently not accepting orders for this product.
										    //preorder - You are taking orders for this product, but it’s not yet been released.
										    //if empty (no entry), the data will be loaded from the database. A field in the products description table named products_availability is required
										    //if "quantity," the field will be popuplated via the quantity: 0 or less = out of stock, greater than 0 = in stock
										    //if "status," the field will be popuplated via the status field. in or out of stock

define('OPTIONS_BRAND', 'manu');			    //leave "blank" to load from the database field named "products_brand", set to "name"  to substitute the products name, "manu" to substitute the manufactueres name or "model" to substitute the products model
define('OPTIONS_CONDITION', 'new');			 //possible entries are "New", "Refurbished", "Used" or "blank", which loads from the database field named "products_condition"
define('OPTIONS_CURRENCY', 'USD');
define('OPTIONS_CURRENCY_THOUSANDS_POINT', ','); //this is the thousands point as in $1,000.
define('OPTIONS_DATE_FORMAT', 'Y-m-d');		 //change how the date is formatted
define('OPTIONS_FEED_LANGUAGE', 'it');		  // Lingua del Feed
define('OPTIONS_GOOGLE_UTM', '?utm_source=GoogleBase1&utm_medium=BaseFeed1&utm_campaign=products'); //see http://www.google.com/support/googleanalytics/bin/answer.py?hl=en&answer=55578
define('OPTIONS_GOOGLE_PRODUCT_CATEGORY', '');  //enter "db" to load from a database field named "google_product_category" enter or enter a specific google category - see taxomy - http://www.google.com/support/merchants/bin/answer.py?answer=160081
define('OPTIONS_GTIN', '');
define('OPTIONS_ISBN', '');
define('OPTIONS_MADE_IN', 'US');
define('OPTIONS_MPN', 'model');	 //leave "blank" to load from the database field named "products_mpn", set to "name"  to substitute the products name, "manu" to substitute the manufactueres name or "model" to substitute the products model
define('OPTIONS_PRODUCT_TYPE', ''); //"full" means the full category path (i.e., hardware,printers), anything else, or "blank", means just the products category (i.e., printers)

//the following is for the shipping override option - enter multiple values separated by a comma
//Format entries follow. A colon must be present for each field, whether it is entered or not.
// COUNTRY - OPTIONAL - If country isn't included, we'll assume the shipping price applies to the target country of the item. If region isn't included, the shipping price will apply across the entire country.
// REGION  - OPTIONAL - blank for entire country, otherwise, us two-letter State (CA), full zip code (90210) or wildcard zip code (902*)
// SERVICE - OPTIONAL - The service class or delivery speed, i.e. ground
// PRICE   - REQUIRED - Fixed shipping price (assumes the same currency as the price attribute)
define('OPTIONS_SHIPPING_STRING', 'US:FL:Ground:7.00'); //says charge shipping to US for residents of Florida at 5% and don't apply tax to shipping

define('OPTIONS_TAX_RATE' , '20.0'); //default = 0 (e.g. for 20.0% tax use "$taxRate = 20.0;")  //only used in the next line
define('OPTIONS_TAX_CALC', (OPTIONS_ENABLED_INCLUDE_TAX == 2 ? (OPTIONS_TAX_RATE/100) + 1 : '1')); //UK. US tax rate - US is ignorded since it is 1
//the following is for the tax override option - enter multiple values separated by a comma
//Format entries follow. A colon must be present for each field, whether it is entered or not.
// COUNTRY  - OPTIONAL - country the tax applies to - only US for now
// REGION   - OPTIONAL - blank for entire country, otherwise, us two-letter State (CA), full zip code (90210) or wildcard zip code (902*)
// TAX	  - REQUIRED - default = 0 (e.g. for 5.76% tax use 5.76)
// SHIPPING - OPTIONAL - do you charge tax on shipping - choices are y or n
define('OPTIONS_TAX_STRING', 'US:FL:5.00:n'); //says charge tax to US for residents of Florida at 5% and don't apply tax to shipping

define('OPTIONS_UPC', '');
define('OPTIONS_WEIGHT_ACCEPTED_METHODS', 'kg'); //Valid units include lb, pound, oz, ounce, g, gram, kg, kilogram.

//the following allow skipping certain items
define('OPTIONS_IGNORE_PRODUCT_PRICE', 0);  //0 = include products with price of 0 in output, 1 = ignore products with price of 0
define('OPTIONS_IGNORE_PRODUCT_ZERO', 0);  //0 = include products with qty of 0 in output, 1 = ignore products with qty of 0

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


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

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

define('FTP_ENABLED', (isset($_GET['noftp']) ? '0' : '1'));   //DO NOT CHANGE THIS LINE

$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();

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 = @[member='date'](OPTIONS_DATE_FORMAT, time() + 2419200 );

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 = ''";
}

$extraFields = '';
if (OPTIONS_AVAILABILITY == '') {
  $extraFields .= ' products_description.products_availability as availability, ';
}
if (OPTIONS_ENABLED_BRAND == 1) {
  if (strlen(OPTIONS_BRAND) == 0) {
   $extraFields .= ' products.products_brand as brand, ';
  } else {
   switch (OPTIONS_BRAND) {
	   case 'name':   $extraFields .= ' products_description.products_name as brand, '; break;
	   case 'manu':   $extraFields .= ' manufacturers.manufacturers_name as brand, ';   break;
	   case 'model':  $extraFields .= ' products.products_model as brand, ';		    break;
	   default:	   $extraFields .= ' products_description.products_name as brand, ';
   }
  }
}
if (OPTIONS_ENABLED_CONDITION == 1 && strlen(OPTIONS_CONDITION) == 0) {
  $extraFields .= ' products.products_condition as pcondition, ';
}
if (OPTIONS_ENABLED_GTIN == 1  && strlen(OPTIONS_GTIN) == 0) {
  $extraFields .= ' products.products_gtin as gtin, ';
}
if (OPTIONS_ENABLED_ISBN == 1  && strlen(OPTIONS_ISBN) == 0) {
  $extraFields .= ' products.products_isbn as isbn, ';
}
if (OPTIONS_ENABLED_MPN == 1) {
  if (strlen(OPTIONS_MPN) == 0) {
   $extraFields .= ' products.products_mpn as mpn, ';
  } else {
   switch (OPTIONS_MPN) {
	   case 'name':   $extraFields .= ' products_description.products_name as mpn, '; break;
	   case 'manu':   $extraFields .= ' manufacturers.manufacturers_name as mpn, ';   break;
	   case 'model':  $extraFields .= ' products.products_model as mpn, ';		    break;
	   default:	   $extraFields .= ' products_description.products_name as mpn, ';
   }
  }
}
if (OPTIONS_ENABLED_UPC == 1  && strlen(OPTIONS_UPC) == 0) {
  $extraFields .= ' products.products_upc as upc, ';
}

if (OPTIONS_ENABLED_GOOGLE_PRODUCT_CATEGORY == 1 && OPTIONS_GOOGLE_PRODUCT_CATEGORY == 'db') {
  $extraFields .= ' products_description.google_product_category as google_category, ';
}


$sql = "
SELECT concat( '" . $productURL . "' ,products.products_id) AS product_url,
products_model AS prodModel,
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, " . $extraFields . "
FORMAT( IFNULL(specials.specials_new_products_price, products.products_price) * " . OPTIONS_TAX_CALC . ",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 (" . TABLE_CATEGORIES . ", " . TABLE_CATEGORIES_DESCRIPTION . ", " . TABLE_PRODUCTS . ", " . TABLE_PRODUCTS_DESCRIPTION . ", " . TABLE_PRODUCTS_TO_CATEGORIES . ")

left join " . TABLE_MANUFACTURERS . " on ( manufacturers.manufacturers_id = products.manufacturers_id )
left join " . TABLE_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 . "
AND categories_description.language_id = " . DEFAULT_LANGUAGE_ID . "
AND products_description.language_id = " . DEFAULT_LANGUAGE_ID . "
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 " . TABLE_CATEGORIES . ", " . TABLE_CATEGORIES_DESCRIPTION .
" WHERE categories.categories_id = categories_description.categories_id " . $quotes . "
AND categories_description.language_id = " . DEFAULT_LANGUAGE_ID . "";

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(">" => "> ", "®" => "", " " => " ", "®" => "", "™" => "", "™" => "", "\t" => "", "    " => "", """ => "\"");


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

$output = "link\ttitle\tdescription\tprice\timage_link\tid\tavailability";
$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_EXPIRATION == 1)	      $output .= "\texpiration_date";
  if(OPTIONS_ENABLED_FEED_LANGUAGE == 1)       $output .= "\tlanguage";
  if(OPTIONS_ENABLED_GOOGLE_PRODUCT_CATEGORY == 1) $output .= "\tgoogle product_category";
  if(OPTIONS_ENABLED_GTIN == 1)		        $output .= "\tgtin";
  if(OPTIONS_ENABLED_ISBN == 1)		        $output .= "\tisbn";
  if(OPTIONS_ENABLED_MADE_IN == 1)	         $output .= "\tmade_in";
  if(OPTIONS_ENABLED_MPN == 1)				 $output .= "\tmpn";
  if(OPTIONS_ENABLED_PRODUCT_MODEL == 1)       $output .= "\tmodel";
  if(OPTIONS_ENABLED_PRODUCT_TYPE == 1)        $output .= "\tproduct_type";
  if(OPTIONS_ENABLED_SHIPPING == 1)	         $output .= "\tshipping";
  if(OPTIONS_ENABLED_INCLUDE_TAX == 1)		 $output .= "\ttax";
  if(OPTIONS_ENABLED_UPC == 1)		         $output .= "\tupc";
  if(OPTIONS_ENABLED_WEIGHT == 1)		      $output .= "\tweight";

  if (OPTIONS_ENABLED_ATTRIBUTES == 1)  {
   // OLD $products_options_name_query = mysql_query("select distinct popt.products_options_id, popt.products_options_name from " . TABLE_PRODCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where popt.language_id = '" . (int)1 . "' order by popt.products_options_name") or die(mysql_error());
   $products_options_name_query = mysql_query("select distinct popt.products_options_id, popt.products_options_name from " . TABLE_PRODCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where popt.language_id = '" . DEFAULT_LANGUAGE . "' 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 " .
  TABLE_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;
$statsArray = array();	  //record messages
$statsArrayPrice = array(); //record prices of 0
$statsArrayQty = array();   //record quantities of 0
$showPriceZero = false;
$showQtyZero = false;


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 (OPTIONS_IGNORE_PRODUCT_PRICE > 0 && $row->price <= 0) continue; //skip products with 0 price
  if (OPTIONS_IGNORE_PRODUCT_ZERO > 0 && $row->quantity < 1) continue; //skip products with 0 qty
  if (OPTIONS_IGNORE_PRODUCT_PRICE < 1 && $row->price <= 0 && $row->prodStatus == 1) {$statsArray['price']++; $showPriceZero = true; }//record for warning
  if (OPTIONS_IGNORE_PRODUCT_ZERO < 1 && $row->quantity < 1 && $row->prodStatus == 1) {$statsArray['qty']++; $showQtyZero = true; } //record for warning

  $statsArray['total']++;

  if ( $row->prodStatus == 1 ) {
  if (CONVERT_CURRENCY) {
	  $row->price = preg_replace("/[^.0-9]/", "", $row->price);
	  $row->price = $row->price *  $row3->curUSD;
	  $row->price = number_format($row->price, 2, '.', OPTIONS_CURRENCY_THOUSANDS_POINT);
  }

  $availability = '';
  switch (OPTIONS_AVAILABILITY) {
	 case 'quantity': $availability = ($row->quantity > 0 ? 'in stock' : 'out of stock'); break;
	 case 'status':   $availability = ($row->prodStatus == 1 ? 'in stock' : 'out of stock'); break;
	 case '':		 $availability = $row->availability; break;
	 default:		 $availability = OPTIONS_AVAILABILITY;
  }

  $google_utm = (OPTIONS_ENABLED_GOOGLE_UTM ? OPTIONS_GOOGLE_UTM : '');
  $pURL = $row->product_url;

  if(SEO_ENABLED=='true'){
	  $output .= tep_href_link($productURL,$productParam . $row->id, 'NONSSL', false) . $google_utm . "\t";
	  $pURL = tep_href_link($productURL,$productParam . $row->id, 'NONSSL', false);
  } else {
	  $output .= $row->product_url . $google_utm . "\t";
  }

  if ($showPriceZero) {
	  $showPriceZero = false;
	  $statsArrayPrice[] = $pURL;
  }
  if ($showQtyZero) {
	  $showQtyZero = false;
	  $statsArrayQty[] = $pURL;
  }

  $output .=
  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" .
  $row->price . "\t" .
  $row->image_url . "\t" .
   //  $catIndex[$row->prodCatID] . "\t" .
  $row->id . "\t" .
  $availability;

  //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" . (isset($row->brand) ? $row->brand : (strlen(OPTIONS_BRAND) ? $row->name : "Not Supported"));
	 if(OPTIONS_ENABLED_CONDITION == 1)
	    $output .= "\t" . (isset($row->pcondition) ? $row->pcondition : OPTIONS_CONDITION);
	 if(OPTIONS_ENABLED_CURRENCY == 1)
	    $output .= "\t" . OPTIONS_CURRENCY;
	 if(OPTIONS_ENABLED_EXPIRATION == 1)
	    $output .= "\t" . $feed_exp_date;
	 if(OPTIONS_ENABLED_FEED_LANGUAGE == 1)
	    $output .= "\t" . OPTIONS_FEED_LANGUAGE;
	 if(OPTIONS_ENABLED_GOOGLE_PRODUCT_CATEGORY == 1)
	    $output .= "\t" . (OPTIONS_GOOGLE_PRODUCT_CATEGORY == 'db' ? $row->google_category : OPTIONS_GOOGLE_PRODUCT_CATEGORY);
	 if(OPTIONS_ENABLED_GTIN == 1)
	    $output .= "\t" . (isset($row->gtin) ? $row->gtin : (strlen(OPTIONS_GTIN) ? OPTIONS_GTIN : "Not Supported"));
	 if(OPTIONS_ENABLED_ISBN == 1)
	    $output .= "\t" . (isset($row->isbn) ? $row->isbn : (strlen(OPTIONS_ISBN) ? OPTIONS_ISBN : "Not Supported"));
	 if(OPTIONS_ENABLED_MADE_IN == 1)
	    $output .= "\t" . OPTIONS_MADE_IN;
	 if(OPTIONS_ENABLED_MPN == 1)
	    $output .= "\t" . (isset($row->mpn) ? $row->mpn : (strlen(OPTIONS_MPN) ? OPTIONS_MPN : "Not Supported"));
	 if(OPTIONS_ENABLED_PRODUCT_MODEL == 1)
	    $output .= "\t" . (! empty($row->prodModel) ? $row->prodModel : $row->catName);
	 if(OPTIONS_ENABLED_PRODUCT_TYPE == 1)
	    $output .= "\t" . ((OPTIONS_PRODUCT_TYPE == strtolower('full')) ? $catIndex[$row->prodCatID] : $row->catName);
	 if(OPTIONS_ENABLED_SHIPPING == 1)
	    $output .= "\t" . OPTIONS_SHIPPING_STRING;
	 if(OPTIONS_ENABLED_INCLUDE_TAX == 1)
	    $output .= "\t" . OPTIONS_TAX_STRING;
	 if(OPTIONS_ENABLED_UPC == 1)
	    $output .= "\t" . (isset($row->upc) ? $row->upc : (strlen(OPTIONS_UPC) ? OPTIONS_UPC : "Not Supported"));
	 if(OPTIONS_ENABLED_WEIGHT == 1)
	    $output .= "\t" . $row->prodWeight . ' ' .OPTIONS_WEIGHT_ACCEPTED_METHODS;

	 /******************* BEGIN HANDLING THE ATTRIBUTES ********************/
	 if (OPTIONS_ENABLED_ATTRIBUTES == 1)
	 {
	    // OLD $products_attributes_query = mysql_query("select count(*) as total from " . TABLE_PRODCTS_OPTIONS . " popt, " . TABLE_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_query = mysql_query("select count(*) as total from " . TABLE_PRODCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where patrib.products_id='" . $row->id . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . DEFAULT_LANGUAGE . "'");
	    $products_attributes = mysql_fetch_object($products_attributes_query);
	    if ($products_attributes->total > 0) {
		  // OLD $products_options_name_query = mysql_query("select distinct popt.products_options_id, popt.products_options_name from " . TABLE_PRODCTS_OPTIONS . " popt, " . TABLE_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());
		  $products_options_name_query = mysql_query("select distinct popt.products_options_id, popt.products_options_name from " . TABLE_PRODCTS_OPTIONS . " popt, " . TABLE_PRODUCTS_ATTRIBUTES . " patrib where patrib.products_id='" . (int)$row->id . "' and patrib.options_id = popt.products_options_id and popt.language_id = '" . DEFAULT_LANGUAGE . "' 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();
		    // OLD $products_options_query = mysql_query("select pov.products_options_values_id, pov.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_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 . "'");
		    $products_options_query = mysql_query("select pov.products_options_values_id, pov.products_options_values_name, pa.options_values_price, pa.price_prefix from " . TABLE_PRODUCTS_ATTRIBUTES . " pa, " . TABLE_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 = '" . DEFAULT_LANGUAGE . "'");
		    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 '<p style="margin:auto; text-align:left">';
printf( "Feed contains %d products.", $statsArray['total'] );
echo '</p>';

$warning = false;
if (count($statsArray['price']) > 0) {
 $warning = true;
 echo '<p style="margin:auto; text-align:left;  padding:10px; 0px">';
 printf( "***Warning:*** There are %d products with a price of $0.<br>", $statsArray['price'] );

 for ($i = 0; $i < count($statsArrayPrice); ++$i) {
  echo  '   ' . $i . ' - ' . $statsArrayPrice[$i] .'<br>';
 }

 echo '</p>';
}

if (count($statsArray['qty']) > 0) {
 $warning = true;
 echo '<p style="margin:auto; text-align:left; padding-bottom:10px; ">';
 printf( "***Warning:*** There are %d products with a quantity of 0.<br>", $statsArray['qty'] );

 for ($i = 0; $i < count($statsArrayQty); ++$i) {
  echo  '   ' . $i . ' - ' . $statsArrayQty[$i] .'<br>';
 }

 echo '</p>';
}

$completed = 'File Completed' . ($warning ? ' (with warnings): ' : ':' );

echo '<p style="margin:auto; text-align:left">';
echo "$completed <a href=\"../" . $OutFile . "\" target=\"_blank\">" . $destination_file . "</a><br>\n\n";
echo '</p>';


$csvFileDest = str_replace('.txt', '.csv', $destination_file);
$csvFileLocn = str_replace('.txt', '.csv', $OutFile);
$csvStr = str_replace("\t", '",", ', $output);

$fp = fopen( $csvFileLocn , "a" );
$fout = fwrite( $fp , $csvStr );
fclose( $fp );

echo '<p style="margin:auto; text-align:left; padding-top:10px;">';
echo 'Use the following for easier viewing from this page. It is still in development and not meant for anything other than viewing.' . "<br>\n\n";
echo "$completed <a href=\"../" . $csvFileLocn . "\" target=\"_blank\">" . $csvFileDest . "</a><br>\n";
echo '</p>';


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>';




//  ---------

?>


Ad Maiora

 

Share this post


Link to post
Share on other sites

I've been using this wonderful contribution for over a year and had no problems at all. However, just last week I noticed that there was sudden drop in people who signing up on website and found that the customer weren't able to to free search on google. I read the posts and signed up and have adword campaign going, also. Please see following pictures from my google merchant account:

 

 

 

google1.jpg

 

google.jpg

 

google2.jpg

 

 

I've been rechecking every steps and making sure and as far as I can tell, I've done everything way I did before. However, my products are still not searchable on the free side because when I do a search on an item, I do not see the my store's products listing.

Please, any help will much appreciated, I'm about to go mad trying to get this to work.

Share this post


Link to post
Share on other sites

You should check your google account and make sure they are accepting the feed. There is a place in the googlebase section where they list products with errors.

Share this post


Link to post
Share on other sites

So you can't see the invalid UPC message? Also, the page I meant is the data quality but any of them will get you to the errors.

Share this post


Link to post
Share on other sites

There are only about 200 items with UPC warnings, since we have about 75000 items that's not really biggie.

Take a look at data quality page.

 

http://midhardware.com/google3.jpg

 

I know there are some that requires suggested optimization but my understanding is these are not that serious problem and it should not block my products from appearing.... or is it? Even with these warnings our listing work before...

Share this post


Link to post
Share on other sites

Before the paid requirement, google would not use any of the feed if any of it was wrong. I have not seen anything to suggest otherwise now but with any problem of this type, it is always best to fix the obvious first.

Edited by Jack_mcs

Share this post


Link to post
Share on other sites

Hello,

 

Sorry, I have searched for a solution for the below error. The answers I have seen mostly are for the config file, and it seems to be set correct for functions and includes,

 

define('DIR_WS_INCLUDES', 'includes/');

define('DIR_WS_FUNCTIONS', DIR_WS_INCLUDES . 'functions/');

 

Error I am getting from the cron job is,

 

PHP Warning: include(includes/configure.php): failed to open stream: No such file or directory in /home/virtual/site1/fst/var/www/html/adminm/includes/application_top.php on line 28

PHP Warning: include(): Failed opening 'includes/configure.php' for inclusion (include_path='.:/php/includes:/usr/share/php') in /home/virtual/site1/fst/var/www/html/adminm/includes/application_top.php on line 28

PHP Warning: require(DIR_WS_FUNCTIONScompatibility.php): failed to open stream: No such file or directory in /home/virtual/site1/fst/var/www/html/adminm/includes/application_top.php on line 35

PHP Fatal error: require(): Failed opening required 'DIR_WS_FUNCTIONScompatibility.php' (include_path='.:/php/includes:/usr/share/php') in /home/virtual/site1/fst/var/www/html/adminm/includes/application_top.php on line 35

 

Lines in my applications_top,

Line 28

 

// load server configuration parameters

if (file_exists('includes/local/configure.php')) { // for developers

include('includes/local/configure.php');

} else {

include('includes/configure.php'); (Line 28)

}

 

Line 35

require(DIR_WS_FUNCTIONS . 'compatibility.php');

 

Thanks JR

Share this post


Link to post
Share on other sites

The script has to load from the shop side and the error is saying it can't find the needed code because it is being ran on the admin side. You have set up the cron job to cd into the admin directory and then include the full path to the script. This is specific to the server you are on so you will need to ask your host for help with it.

Share this post


Link to post
Share on other sites

Hello Jack_mcs,

 

Thank you for the prompt reply. Sorry, I am a little confused. As per the instructions for installing Google Feeder, it mentions for the cron job to be the following,

 

php -q /home/virtual/site1.com/var/www/html/admin/googlefeeder.php

 

This is the full path to googlefeeder.php.

 

Thank you

Share this post


Link to post
Share on other sites

Cron jobs are specific to the server. The one provided will work on many servers but not all. I posted a differetn format here in the trhead at some point, though I don't know where it would be. But from memory, it is something like

 cd /full path to admin/; /usr/local/bin/php -c /full path to root php.ini -q /full path to googlefeeder.php

Your host can give the correct syntax.

Share this post


Link to post
Share on other sites

Hi,

 

I have a question, is there an option to exclude some brand(s)?

If not, how could it be the easiest way to do it?

 

Thanks,

Share this post


Link to post
Share on other sites

No, there's not. There is an option to exclude products so you could duplicate that code and have it work for brands, depending upon what you are using for brands.

Share this post


Link to post
Share on other sites

Hello,

 

The default language are 1 (Portuguese) on my store and not working for me!

 

---

Feed contains 0 products.

File Completed:

feed_makedonos.txt

Use the following for easier viewing from this page. It is still in development and not meant for anything other than viewing.

File Completed: feed_makedonos.csv

Script timer: 0.001691 seconds.

---

 

Please any idea for help?

 

Thanks

Share this post


Link to post
Share on other sites

Be sure you have the latest version installed since it grabs the default language automatically. If not, you have to manually edit the googlefeeder.php file. This, of course, assumes your products have quantities. Some shops run without setting them.

Share this post


Link to post
Share on other sites

I was hoping someone might be able to point me in the right direction. I have googlefeeder installed that works perfectly. I have now installed the Extra Fields contribution as I will be selling 2nd hand items as well as new. I now need googlefeeder to pick up the products condition.

 

Looking at the database, the extra fields contribution has added 'products to products extra fields' to the database and inside this there is 'products_id', 'products_extra_fields_id' and then 'products_extra_fields_value' which contains the products condition. I just need some help to tell the googlefeed to pick the products condition here?

Share this post


Link to post
Share on other sites

Be sure you have the latest version installed since it grabs the default language automatically. If not, you have to manually edit the googlefeeder.php file. This, of course, assumes your products have quantities. Some shops run without setting them.

 

Yes, I have the latest version ...

 

Any idea?

 

Can help me?

 

Thanks a lot!

Edited by tecman

Share this post


Link to post
Share on other sites

Just a note - not sure if anyone else had experienced this. I recently installed SEO URLs 5 latest version by FWR media using an older version of the Google Feeder (around 2.5 I think). Having had a series of warnings from Google regarding duplicate content I discovered that when the google feeder was run in the admin section, for some reason the configuration of the SEO URLs was reset to the default setup - resulting in sitemaps being generated with different URLs. I tested this and every time the feeder was run, the SEO config was reset.

 

The latest version of the google feeder (version 3) works perfectly and has fixed whatever issue or conflict was present before.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×