【问题标题】:Limit products found by visibility?限制可见性发现的产品?
【发布时间】:2011-11-06 16:59:23
【问题描述】:

我正在使用 Magento 和以下脚本将我们的目录导入 Google 购物:

<?php
define('SAVE_FEED_LOCATION','google_base_feed.txt');
set_time_limit(1800);
require_once '../app/Mage.php';
Mage::app('default');
try{
    $handle = fopen(SAVE_FEED_LOCATION, 'w');

    $heading = array('id','mpn', 'upc','title','description','link','image_link','price','brand','product_type','condition', 'google_product_category', 'manufacturer', 'availability');
    $feed_line=implode("\t", $heading)."\r\n";
    fwrite($handle, $feed_line);

    $products = Mage::getModel('catalog/product')->getCollection();
    $products->addAttributeToFilter('status', 1);
    $products->addAttributeToFilter('visibility', 4);
    $products->addAttributeToSelect('*');
    $prodIds=$products->getAllIds();

    $product = Mage::getModel('catalog/product');

    $counter_test = 0;

    foreach($prodIds as $productId) {

        if (++$counter_test < 30000){

            $product->load($productId);

            $product_data = array();
            $product_data['sku'] = $product->getSku();
            $product_data['mpn'] = $product->getData('upc');
            $product_data['upc'] = $product->getData('upc');

            $title_temp = $product->getName();
            if (strlen($title_temp) > 70){
                $title_temp = str_replace("Supply", "", $title_temp);
                $title_temp = str_replace("  ", " ", $title_temp);
            }
            $product_data['title'] = $title_temp;


            $product_data['description'] = substr(iconv("UTF-8","UTF-8//IGNORE",$product->getDescription()), 0, 900);
            $product_data['Deeplink'] = "http://www.domainname.co.uk/store/".$product->getUrlPath(); 
            $product_data['image_link'] = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_MEDIA).'catalog/product'.$product->getImage();

            $price_temp = round($product->getPrice(),2);
            $product_data['price'] = round($product->getPrice(),2) * 
1.2;


            $product_data['brand'] = $product->getData('brand');

            $product_data['product_type'] = 'Pet Products and Accessories';
            $product_data['condition'] = "new";
            $product_data['category'] = $product_data['brand'];
            $product_data['manufacturer'] = $product_data['brand'];

            $product_data['availability'] = "in stock";

            foreach($product_data as $k=>$val){
                $bad=array('"',"\r\n","\n","\r","\t");
                $good=array(""," "," "," ","");
                $product_data[$k] = '"'.str_replace($bad,$good,$val).'"';
            }

            echo $counter_test  . " ";

            $feed_line = implode("\t", $product_data)."\r\n";
            fwrite($handle, $feed_line);
            fflush($handle);

        }

    }

    fclose($handle);
}
catch(Exception $e){
    die($e->getMessage());
}

这个脚本的问题是它似乎导入了所有产品。尽管其中一些被列为“单独不可见”。我正在尝试找到一种方法,将列出的项目限制为“搜索”、“目录”或“目录、搜索”。

我注意到下面一行:

       $products->addAttributeToFilter('visibility', 4);

但我完全不确定数字 4 的相关性。该脚本已使用一些不同的博客文章、SO 答案和教程混合在一起。

【问题讨论】:

    标签: php zend-framework magento google-shopping


    【解决方案1】:

    另一种方式是定义一个数组:

    $visibility = array(
       Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
       Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
    );
    
    // now you can add this filter to call your product collection
    
    $products->addAttributeToFilter('visibility', $visibility);
    

    【讨论】:

    • 你知道“VISIBILITY_BOTH”是否是我需要的正确“Magento”短语吗?
    • VISIBILITY_BOTH 表示该产品在搜索和目录中可见,等于 4,VISIBILITY_IN_CATALOG 表示该产品在目录中可见,等于 2。还有两个您可以使用的状态:VISIBILITY_NOT_VISIBLE = 1VISIBILITY_IN_SEARCH = 3 。我认为您只能使用VISIBILITY_BOTH4,如下所述。但这是一个品味问题。
    • @danny:+1,但我总是建议使用类常量而不是它们的值。最后,这就是常量的用途。否则,每当 Magento 出于任何原因决定更改类常量的值时,您都需要使用 4 更改代码中的所有位置。
    【解决方案2】:

    尝试更改您创建集合的顺序,以便过滤器位于最后,即

    $products = Mage::getModel('catalog/product')->getCollection();
    $products->addAttributeToSelect('*');
    $products->addAttributeToFilter('status', 1);
    $products->addAttributeToFilter('visibility', 4);
    

    【讨论】:

    • 虽然脚本仍然有效,但它似乎仍然没有改变产品的范围。我检查了,4 = 目录,搜索。
    猜你喜欢
    • 2013-04-10
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    相关资源
    最近更新 更多