Opencart Google merchant

Merhabalar bugün sizlere Opencart Google merchant kurulumu ve türkçe karakter sorunlarında bahsedeceğim.

Müşterimin özel olarak anlaşmış olduğu bir reklam ajansının özellikle istemiş olduğu google merhant ile reklamcılık doğrultusunda yapmam gereken bir xml servisi yazmaktı. Düşük bütçeli verdiğim hizmet açısından pek mümkün olmasada kolları sıvayıp neler var opencart’ta hazır pluginler varmı bakayım istedim, birçok plugin uçuyor yükseklerde :)). Biraz daha araştırma sonucunda google base özelliğini kurarak üstünde bir kaç değişiklik yaparak google merchant hizmetini sağlayacak xml servisi hazır olmuş oluyor.

Google Merchant Nedir ?

Bilmeyenler için kısaca google merchant nedir ?; Google Merchant Center, mağaza ve ürün verilerinizi Google’a yüklemenize ve söz konusu verileri Google Alışveriş ve diğer Google hizmetlerine sunmanıza yardımcı olan bir araçtır. Google Merchant Center’ı kullanmaya başlama hakkında daha fazla bilgi edinin.

kısaca bir bilgi sonrasında devam edelim :).

Google Base Nasıl Aktif Edilir ?

1 . opencart panelinize giriş yapın

2. Eklentiler Kısmında > Ürün Beslemelerine Gelin

3. Google Base kur butonuna basıp kurulumu yapın

4. Düzenle diyerek Durum kısmını aktif olarak seçin ve kayıt edin

5 . http://siteadresiniz/index.php?route=feed/google_base adresinden çıktıya artık ulaşabiliyorsunuz.

Şimdi bu aşamalardan sonra google base kurulup aktif edilmiş durumdadur. Şimdi gelelim türkçe karakter sorunu ve google merchant istediği çıktı kısmına. Bu kısımda aşağıda bulacaksanız.

Google Base Türkçe Karakter Sorunu ve Çözümü

<br />
1. ilk olarak ftp adresinize bağlanın<br />
2. catalog &gt; controller &gt; feed &gt; google_base.php dosyanızı açın ve orjinal halini yedekleyin<br />
3. tüm içeriği silip aşağıdaki kodu aynı şekilde yapıştırın.<br />
&lt;?php class ControllerFeedGoogleBase extends Controller { public function index() { if ($this-&gt;config-&gt;get('google_base_status')) {<br />
			$output  = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;';<br />
			$output .= '&lt;rss version=&quot;2.0&quot; xmlns:g=&quot;http://base.google.com/ns/1.0&quot;&gt;';<br />
            $output .= '&lt;channel&gt;';<br />
			$output .= '&lt;title&gt;' . $this-&gt;config-&gt;get('config_name') . '&lt;/title&gt;';<br />
			$output .= '&lt;description&gt;' . html_entity_decode($this-&gt;replace_tr($this-&gt;config-&gt;get('config_meta_description'))) . '&lt;/description&gt;';<br />
			$output .= '&lt;link&gt;' . HTTP_SERVER . '&lt;/link&gt;';</p>
<p>			$this-&gt;load-&gt;model('catalog/category');</p>
<p>			$this-&gt;load-&gt;model('catalog/product');</p>
<p>			$this-&gt;load-&gt;model('tool/image');</p>
<p>			$products = $this-&gt;model_catalog_product-&gt;getProducts();</p>
<p>			foreach ($products as $product)<br />
			{<br />
				if ($product['description']) {<br />
					$output .= '&lt;item&gt;';<br />
					$output .= '&lt;g:title&gt;' . html_entity_decode($this-&gt;replace_tr($product['name'])) . '&lt;/g:title&gt;';<br />
					$output .= '&lt;g:link&gt;' . $this-&gt;url-&gt;link('product/product', 'product_id=' . $product['product_id']) . '&lt;/g:link&gt;';<br />
					$output .= '&lt;g:description&gt;' . html_entity_decode($this-&gt;replace_tr($product['description'])) . '&lt;/g:description&gt;';<br />
					$output .= '&lt;g:brand&gt;' . html_entity_decode($product['manufacturer'], ENT_QUOTES, 'UTF-8') . '&lt;/g:brand&gt;';<br />
					$output .= '&lt;g:condition&gt;new&lt;/g:condition&gt;';<br />
					$output .= '&lt;g:id&gt;' . $product['product_id'] . '&lt;/g:id&gt;';</p>
<p>					if ($product['image']) {<br />
						$output .= '&lt;g:image_link&gt;' . $this-&gt;model_tool_image-&gt;resize($product['image'], 500, 500) . '&lt;/g:image_link&gt;';<br />
					} else {<br />
						$output .= '&lt;g:image_link&gt;' . $this-&gt;model_tool_image-&gt;resize('no_image.jpg', 500, 500) . '&lt;/g:image_link&gt;';<br />
					}</p>
<p>					$output .= '&lt;g:mpn&gt;' . $product['model'] . '&lt;/g:mpn&gt;';</p>
<p>					$currencies = array(<br />
						'USD',<br />
						'EUR',<br />
						'GBP'<br />
					);</p>
<p>                    if (in_array($this-&gt;currency-&gt;getCode(), $currencies)) {<br />
                        $currency_code = $this-&gt;currency-&gt;getCode();<br />
						$currency_value = $this-&gt;currency-&gt;getValue();<br />
                    } else {<br />
                        $currency_code = 'USD';<br />
						$currency_value = $this-&gt;currency-&gt;getValue('USD');<br />
                    }</p>
<p>					if ((float)$product['special']) {<br />
                        $output .= '&lt;g:price&gt;' .  $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product['special'], $product['tax_class_id']), $currency_code, $currency_value, false) . '&lt;/g:price&gt;';<br />
                    } else {<br />
                        $output .= '&lt;g:price&gt;' . $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product['price'], $product['tax_class_id']), $currency_code, $currency_value, false) . '&lt;/g:price&gt;';<br />
                    }</p>
<p>					$categories = $this-&gt;model_catalog_product-&gt;getCategories($product['product_id']);</p>
<p>					foreach ($categories as $category) {<br />
						$path = $this-&gt;getPath($category['category_id']);</p>
<p>						if ($path) {<br />
							$string = '';</p>
<p>							foreach (explode('_', $path) as $path_id) {<br />
								$category_info = $this-&gt;model_catalog_category-&gt;getCategory($path_id);</p>
<p>								if ($category_info) {<br />
									if (!$string) {<br />
										$string = $category_info['name'];<br />
									} else {<br />
										$string .= ' &amp;gt; ' . $category_info['name'];<br />
									}<br />
								}<br />
							}</p>
<p>							$output .= '&lt;g:product_type&gt;' . html_entity_decode($this-&gt;replace_tr($string)) . '&lt;/g:product_type&gt;';<br />
						}<br />
					}</p>
<p>					$output .= '&lt;g:quantity&gt;' . $product['quantity'] . '&lt;/g:quantity&gt;';<br />
					$output .= '&lt;g:upc&gt;' . $product['upc'] . '&lt;/g:upc&gt;';<br />
					$output .= '&lt;g:weight&gt;' . $this-&gt;weight-&gt;format($product['weight'], $product['weight_class_id']) . '&lt;/g:weight&gt;';<br />
					$output .= '&lt;g:availability&gt;' . ($product['quantity'] ? 'in stock' : 'out of stock') . '&lt;/g:availability&gt;';<br />
					$output .= '&lt;/item&gt;';<br />
				}<br />
			}</p>
<p>			$output .= '&lt;/channel&gt;';<br />
			$output .= '&lt;/rss&gt;';	</p>
<p>			$this-&gt;response-&gt;addHeader('Content-Type: application/rss+xml');<br />
			$this-&gt;response-&gt;setOutput($output,0);<br />
		}<br />
	}<br />
	public function replace_tr($text) {<br />
		//die('geldi');<br />
		$text = trim($text);<br />
		$search = array('Ç','ç','Ğ','ğ','ı','İ','Ö','ö','Ş','ş','Ü','ü');<br />
		$replace = array('C','c','G','g','i','I','O','o','S','s','U','u');<br />
		$new_text = str_replace($search,$replace,$text);<br />
		return $new_text;<br />
	}<br />
	/*<br />
	public function index() {<br />
		if ($this-&gt;config-&gt;get('google_base_status')) {<br />
			$output  = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;';<br />
			$output .= '&lt;rss version=&quot;2.0&quot; xmlns:g=&quot;http://base.google.com/ns/1.0&quot;&gt;';<br />
            $output .= '&lt;channel&gt;';<br />
			$output .= '&lt;title&gt;' . $this-&gt;config-&gt;get('config_name') . '&lt;/title&gt;';<br />
			$output .= '&lt;description&gt;' . $this-&gt;config-&gt;get('config_meta_description') . '&lt;/description&gt;';<br />
			$output .= '&lt;link&gt;' . HTTP_SERVER . '&lt;/link&gt;';</p>
<p>			$this-&gt;load-&gt;model('catalog/category');</p>
<p>			$this-&gt;load-&gt;model('catalog/product');</p>
<p>			$this-&gt;load-&gt;model('tool/image');</p>
<p>			$products = $this-&gt;model_catalog_product-&gt;getProducts();</p>
<p>			foreach ($products as $product) {<br />
				if ($product['description']) {<br />
					$output .= '&lt;item&gt;';<br />
					$output .= '&lt;title&gt;' . $product['name'] . '&lt;/title&gt;';<br />
					$output .= '&lt;link&gt;' . $this-&gt;url-&gt;link('product/product', 'product_id=' . $product['product_id']) . '&lt;/link&gt;';<br />
					$output .= '&lt;description&gt;' . $product['description'] . '&lt;/description&gt;';<br />
					$output .= '&lt;g:brand&gt;' . html_entity_decode($product['manufacturer'], ENT_QUOTES, 'UTF-8') . '&lt;/g:brand&gt;';<br />
					$output .= '&lt;g:condition&gt;new&lt;/g:condition&gt;';<br />
					$output .= '&lt;g:id&gt;' . $product['product_id'] . '&lt;/g:id&gt;';</p>
<p>					if ($product['image']) {<br />
						$output .= '&lt;g:image_link&gt;' . $this-&gt;model_tool_image-&gt;resize($product['image'], 500, 500) . '&lt;/g:image_link&gt;';<br />
					} else {<br />
						$output .= '&lt;g:image_link&gt;' . $this-&gt;model_tool_image-&gt;resize('no_image.jpg', 500, 500) . '&lt;/g:image_link&gt;';<br />
					}</p>
<p>					$output .= '&lt;g:mpn&gt;' . $product['model'] . '&lt;/g:mpn&gt;';</p>
<p>					$currencies = array(<br />
						'USD',<br />
						'EUR',<br />
						'GBP'<br />
					);</p>
<p>                    if (in_array($this-&gt;currency-&gt;getCode(), $currencies)) {<br />
                        $currency_code = $this-&gt;currency-&gt;getCode();<br />
						$currency_value = $this-&gt;currency-&gt;getValue();<br />
                    } else {<br />
                        $currency_code = 'USD';<br />
						$currency_value = $this-&gt;currency-&gt;getValue('USD');<br />
                    }</p>
<p>					if ((float)$product['special']) {<br />
                        $output .= '&lt;g:price&gt;' .  $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product['special'], $product['tax_class_id']), $currency_code, $currency_value, false) . '&lt;/g:price&gt;';<br />
                    } else {<br />
                        $output .= '&lt;g:price&gt;' . $this-&gt;currency-&gt;format($this-&gt;tax-&gt;calculate($product['price'], $product['tax_class_id']), $currency_code, $currency_value, false) . '&lt;/g:price&gt;';<br />
                    }</p>
<p>					$categories = $this-&gt;model_catalog_product-&gt;getCategories($product['product_id']);</p>
<p>					foreach ($categories as $category) {<br />
						$path = $this-&gt;getPath($category['category_id']);</p>
<p>						if ($path) {<br />
							$string = '';</p>
<p>							foreach (explode('_', $path) as $path_id) {<br />
								$category_info = $this-&gt;model_catalog_category-&gt;getCategory($path_id);</p>
<p>								if ($category_info) {<br />
									if (!$string) {<br />
										$string = $category_info['name'];<br />
									} else {<br />
										$string .= ' &amp;gt; ' . $category_info['name'];<br />
									}<br />
								}<br />
							}</p>
<p>							$output .= '&lt;g:product_type&gt;' . $string . '&lt;/g:product_type&gt;';<br />
						}<br />
					}</p>
<p>					$output .= '&lt;g:quantity&gt;' . $product['quantity'] . '&lt;/g:quantity&gt;';<br />
					$output .= '&lt;g:upc&gt;' . $product['upc'] . '&lt;/g:upc&gt;';<br />
					$output .= '&lt;g:weight&gt;' . $this-&gt;weight-&gt;format($product['weight'], $product['weight_class_id']) . '&lt;/g:weight&gt;';<br />
					$output .= '&lt;g:availability&gt;' . ($product['quantity'] ? 'in stock' : 'out of stock') . '&lt;/g:availability&gt;';<br />
					$output .= '&lt;/item&gt;';<br />
				}<br />
			}</p>
<p>			$output .= '&lt;/channel&gt;';<br />
			$output .= '&lt;/rss&gt;';	</p>
<p>			$this-&gt;response-&gt;addHeader('Content-Type: application/rss+xml');<br />
			$this-&gt;response-&gt;setOutput($output);<br />
		}<br />
	}<br />
	*/</p>
<p>	protected function getPath($parent_id, $current_path = '') {<br />
		$category_info = $this-&gt;model_catalog_category-&gt;getCategory($parent_id);</p>
<p>		if ($category_info) {<br />
			if (!$current_path) {<br />
				$new_path = $category_info['category_id'];<br />
			} else {<br />
				$new_path = $category_info['category_id'] . '_' . $current_path;<br />
			}	</p>
<p>			$path = $this-&gt;getPath($category_info['parent_id'], $new_path);</p>
<p>			if ($path) {<br />
				return $path;<br />
			} else {<br />
				return $new_path;<br />
			}<br />
		}<br />
	}<br />
}<br />
?&gt;<br />

Yukarıdaki işlemleri uygulamanızın ardından google merchant xml servisiniz kusursuz bir şekilde çalışır duruma gelecektir.

Google Merchant XML Çıktısı

</p>
<p>&lt;?xml version=&quot;1.0&quot;?&gt;<br />
&lt;rss xmlns:g=&quot;http://base.google.com/ns/1.0&quot; version=&quot;2.0&quot;&gt;<br />
&lt;channel&gt;<br />
&lt;title&gt;Site Adı&lt;/title&gt;<br />
&lt;link&gt;Site Adresi (https://www.domain.com)&lt;/link&gt;<br />
&lt;description&gt;Tanımlama (ÖRN: &lt;![CDATA[Monte Sehpa kişiye özel ve uygun fiyatlı sehpaları ile Türkiye'nin ilk sehpa üreticisi.]]&gt;)&lt;/description&gt;</p>
<p>&lt;!--Çoğaltılacak Öğe--&gt;<br />
&lt;item&gt;<br />
&lt;g:id&gt; Ürün ID (ÖRN:&lt;![CDATA[1]]&gt;)&lt;/g:id&gt;<br />
&lt;g:title&gt; Ürün Adı (ÖRN:&lt;![CDATA[Arte Orta Sehpa Dikdörtgen]]&gt;)&lt;/g:title&gt;<br />
&lt;g:description&gt; Ürün Tanımlaması (ÖRN:&lt;![CDATA[Arte Orta Sehpa Beyaz MonteSehpa]]&gt;)&lt;/g:description&gt;<br />
&lt;g:link&gt; Ürün URL (ÖRN:&lt;![CDATA[https://montesehpa.net/Urunlerimiz/Orta Sehpa/1/Arte Orta Sehpa Dikdörtgen]]&gt;)&lt;/g:link&gt;<br />
&lt;g:image_link&gt; Ürün Resim URL (ÖRN:&lt;![CDATA[https://montesehpa.net/Admin/Pictures/2cb40462-b6b5-411a-a83a-0f8e3eb71330arte-ortasehpa.jpg]]&gt;)&lt;/g:image_link&gt;<br />
&lt;g:condition&gt;yeni&lt;/g:condition&gt;<br />
&lt;g:availability&gt;stokta&lt;/g:availability&gt;<br />
&lt;g:price&gt;ÜCRET (ÖRN:&lt;![CDATA[700,00 TL]]&gt;)&lt;/g:price&gt;<br />
&lt;g:gtin&gt;BARKOD (Eğer Yoksa Boş Bırakılabilir)&lt;/g:gtin&gt;<br />
&lt;g:brand&gt;MARKA (ÖRN:&lt;![CDATA[Monte Sehpa]]&gt;)&lt;/g:brand&gt;<br />
&lt;g:google_product_category&gt; Ürün Kategori (ÖRN:&lt;![CDATA[Sehpa &gt; Orta Sehpa]]&gt;)&lt;/g:google_product_category&gt;<br />
&lt;g:product_type&gt;Ürün Tipi (ÖRN:Sehpa)&lt;/g:product_type&gt;<br />
&lt;/item&gt;<br />
&lt;!-- Çoğaltılacak Öğe Sonu --&gt;</p>
<p>&lt;/channel&gt;<br />
&lt;/rss&gt;</p>
<p>

Geliştirme kısmında teklifleriniz olursa paylaşırsanız sevinirim.
iyi kodlamalar.