GoogleショッピングへEC-CUBEに登録されている商品を登録する方法

Googleショッピングが日本でも無料で利用できることがアナウンスされています。

www.suzukikenichi.com

すでにEC-CUBEで掲載されている商品をGoolgeショッピングへ登録するには手動またはスプレッドシートで登録できますが、 バッチを利用して一括で登録できる方法を説明します。

準備としてGoogleマーチャントセンターへ登録が必要になります。

support.google.com

登録が完了したら、メニューのレンチアイコンからContent APIメニューを選択します。 f:id:amidaike:20201024095010p:plain

選択後、「認証」メニューを選択し新しいAPIキーを+アイコンを押して作成します。 f:id:amidaike:20201024095059p:plain

作成すると、content-api-key.jsonファイルがダウンロードされるのでこれを利用して連携処理を行います。

ここまで準備ができたら、今回はEC-CUBE3でGoogleショッピングの連携を行います。

Googleショッピング連携を行うにはライブラリが公開されていますので、 そのライブラリを利用して処理を行います。

ターミナルを起動し、EC-CUBE3がインストールされているディレクトリまで移動します。

以下のコマンドを実行してライブラリをインストールします。

composer require google/apiclient:"^2.0" --ignore-platform-reqs

--ignore-platform-reqsというパラメーターは、Composerの依存性チェックでphpバージョンエラーを一時的に回避するために付与しています。

インストールが完了したら、先ほどダウンロードしたcontent-api-key.jsonファイルを、

app/config/eccube

ディレクトリへ保存します。

また、マーチャントIDが必要になるのですがこちらのIDはGoogleマーチャントセンター管理画面の右上にあるユーザー名の横にある数字となります。

次にCommandを利用したプログラムを作成します。

src/Eccube/Command/ProductUpdateCommand.php

というファイルを作成し、以下のソースを記入します。

<?php

namespace Eccube\Command;

use Eccube\Application;
use Eccube\Entity\BaseInfo;
use Eccube\Entity\Product;
use Knp\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

/**
 * Class ProductUpdateCommand
 *
 * @package Eccube\Command\Mall\Google
 */
class ProductUpdateCommand extends Command
{

    protected function configure()
    {
        $this
            ->setName('google:productupdate')
            ->setDescription('Googleショッピング連携処理')
            ->setHelp(<<<EOF
The <info>%command.name%</info> command Product Update Google Shopping,
EOF
            );
    }

    /**
     * Googleショッピング連携
     *
     * @param InputInterface $input
     * @param OutputInterface $output
     * @return int|null|void
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $io = new SymfonyStyle($input, $output);

        /** @var Application $app */
        $app = $this->getSilexApplication();

        $io->title('Googleショッピング連携処理 Start.');

        putenv('GOOGLE_APPLICATION_CREDENTIALS='.$app['config']['root_dir'].'/app/config/eccube/content-api-key.json');

        $merchantId = 'マーチャントIDを設定';
        $url = 'サイトURLを設定'; // 例) https://example.com

        $client = new \Google_Client();
        $client->useApplicationDefaultCredentials();

        $client->addScope('https://www.googleapis.com/auth/content');

        $service = new \Google_Service_ShoppingContent($client);

        $Products = $app['eccube.repository.product']->findBy(array('Status' => 1));



        // バッチ処理
        $entries = [];
        $i = 0;
        /** @var Product $Product */
        foreach ($Products as $Product) {

            $entry = new \Google_Service_ShoppingContent_ProductsCustomBatchRequestEntry();
            $entry->setBatchId($i);
            $entry->setMerchantId($merchantId);
            $entry->setMethod('insert');

            $ShoppingProduct = new \Google_Service_ShoppingContent_Product();
            $ShoppingProduct->setOfferId($Product->getCodeMin());
            $ShoppingProduct->setTitle($Product->getName());
            $ShoppingProduct->setDescription($Product->getDescriptionDetail());
            $ShoppingProduct->setLink($url.'/products/detail/'.$Product->getId());
            $ShoppingProduct->setImageLink($url.$app['config']['image_save_urlpath'].'/'.$Product->getMainListImage());
            $ShoppingProduct->setContentLanguage('ja');
            $ShoppingProduct->setTargetCountry('JP');
            $ShoppingProduct->setChannel('online');
            $ShoppingProduct->setAvailability('in stock');
            if (!$Product->getStockFind()) {
                $ShoppingProduct->setAvailability('out of stock');
            }

            // $ShoppingProduct->setCondition('');
            $ShoppingProduct->setGoogleProductCategory('1025'); // https://www.google.com/basepages/producttype/taxonomy-with-ids.ja-JP.txt より適切なカテゴリIDを設定
            $ProductCategories = $Product->getProductCategories();
            $path = '';
            foreach ($ProductCategories as $ProductCategory) {
                $path = $ProductCategory->getCategory()->getRootCategory()->getName();
            }
            $ShoppingProduct->setBrand($path);

            // $ShoppingProduct->setGender('');
            // $ShoppingProduct->setColor('');

            $price = new \Google_Service_ShoppingContent_Price();
            $price->setValue($Product->getPrice02IncTaxMin());
            $price->setCurrency('JPY');

            $shipping_price = new \Google_Service_ShoppingContent_Price();
            $shipping_price->setValue('0'); // 配送料を設定
            $shipping_price->setCurrency('JPY');

            $shipping = new \Google_Service_ShoppingContent_ProductShipping();
            $shipping->setPrice($shipping_price);
            $shipping->setCountry('JP');
            // $shipping->setService('Standard shipping');

            $ShoppingProduct->setPrice($price);
            $ShoppingProduct->setShipping(array($shipping));

            $entry->setProduct($ShoppingProduct);

            $entries[] = $entry;

            $i++;

        }

        $batchRequest = new \Google_Service_ShoppingContent_ProductsCustomBatchRequest();
        $batchRequest->setEntries($entries);
        $result = $service->products->custombatch($batchRequest);

        $io->text('処理件数 : '.$result->count());

        $io->success('Googleショッピング連携処理 End.');

    }
}

上記ファイルを作成後、

php app/console google:productupdate

を実行するとGoogleショッピング連携処理が行われます。

処理を実行後、1時間程度待つとマーチャントセンターへ商品が登録されているのが確認できます。

正常に登録されていればGoogleショッピング連携処理が完了なので、 運用に合わせて適宜対応してください。

4系については今後公開します。