Pregunta

Mi antiguo sitio tenía decenas de miles de productos no-largos con URL como http://example.com?product_id=123456.

Todos están indexados en motores de búsqueda y ahora se resuelven en 404 en Magento.No puedo crear una redirección para cada uno.

¿Cómo consigo que resuelvan mi página de inicio?

¿Fue útil?

Solución

En este caso, puedes utilizar evento/observador y en el evento controller_front_init_before despedir a un observador.

Primero supongo que Su ID de producto anterior y su ID de producto nuevo son iguales..

En ese observer check query string($_SERVER['QUERY_STRING']) content

?product_id=identificador de producto patrón in url entonces basico de esto redirect to current system product url.

Ejemplo:

Suponer,

URL del producto del sistema anterior: http://example.com?product_id=123456

Nueva URL del producto del sistema: http://example.com/abx.html

mi código será redirigido http://example.com?product_id=123456 a http://example.com/abx.html usando la redirección 301.

Redirección 301, resolverás el problema de SEO.

Aquí el código config.xml:

 <global>
    <models>
      <magento67130>
        <class>StackExchange_Magento67130_Model</class>
        <resourceModel>magento67130_mysql4</resourceModel>
      </magento67130>
    </models>
    <events>
      <controller_front_init_routers> <!-- identifier of the event we want to catch -->
        <observers>
          <controller_front_init_before_handler> <!-- identifier of the event handler -->
            <type>model</type> <!-- class method call type; valid are model, object and singleton -->
            <class>magento67130/observer</class> <!-- observers class alias -->
            <method>redirectionProduct</method>  <!-- observer's method to be called -->
          </controller_front_init_before_handler>
        </observers>
      </controller_front_init_routers>
    </events>
  </global>

El código Observer.php está a continuación:

<?php
class StackExchange_Magento67130_Model_Observer
{

    public function redirectionProduct(Varien_Event_Observer $observer)
    {
        return;
        if($this->_getQueryString()){
            print_r($this->_getQueryString());

                // Check query string exits in product_id
            if(strpos($this->_getQueryString(),'product_id=')!== false){
                /* get Product ifd from query string */
                 $productid=str_replace('product_id=','',$this->_getQueryString());
                if(!empty($productid)):
                $product= Mage::getModel('catalog/product')->load($productid);
                 if ($product->getId()) {
                    echo $product->getProductUrl();
                     Mage::app()->getResponse()
                        ->setRedirect($product->getProductUrl(), 301)
                             ->sendResponse();

                             return;
                 }
                endif;
            }

        }
        //die();

    }
    /* Check here Request query string */
    protected function _getQueryString()
        {
            if (!empty($_SERVER['QUERY_STRING'])) {
                $queryParams = array();
                parse_str($_SERVER['QUERY_STRING'], $queryParams);
                $hasChanges = false;
                foreach ($queryParams as $key => $value) {
                    if (substr($key, 0, 3) === '___') {
                        unset($queryParams[$key]);
                        $hasChanges = true;
                    }
                }
                if ($hasChanges) {
                    return http_build_query($queryParams);
                } else {
                    return $_SERVER['QUERY_STRING'];
                }
            }
            return false;
        }
}

Otros consejos

you have to create one little custom extension to redirect if product is not found in your database

here i have given working solution and its perfect worked for me

How to forward all the 404 Magento pages to the front page?

hope this will also work for you.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top