Weiterleitung von URLs mit Abfragezeichenfolgen
-
12-12-2019 - |
Frage
Meine alte Website hatte Zehntausende nicht mehr gültiger Produkte mit
urls wie http://example.com?product_id=123456
.
Sie sind alle suchmaschinenindiziert und werden jetzt in Magento auf 404 aufgelöst.Ich kann unmöglich für jede einzelne eine Weiterleitung erstellen.
Wie bringe ich sie dazu, auf meine Homepage zu gelangen?
Lösung
In diesem Fall können Sie verwenden ereignis / Beobachter und auf Veranstaltung controller_front_init_before
feuern Sie einen Beobachter ab.
Zuerst denke ich das ihre alte Produkt-ID und Ihre neue Produkt-ID sind identisch.
Darauf observer check query string
($_SERVER['ABFRAGE_ZEICHENFOLGE']) content
?product_id=Produkt-ID Muster in url
dann grundlegend davon redirect to current system product url
.
Beispiel:
Annehmen,
URL des alten Systemprodukts: http://example.com?product_id=123456
Neue Systemprodukt-URL: http://example.com/abx.html
mein Code wird umgeleitet http://example.com?product_id=123456
zu http://example.com/abx.html
verwenden der 301-Umleitung.
301-Weiterleitung, Sie werden das SEO-Problem lösen.
Hier konfig.xml-Code:
<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>
Beobachter.PHP-Code ist unten:
<?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;
}
}
Andere Tipps
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.