Maandelijks archief: maart 2012

WordPress oude URL’s vervangen met nieuwe URL’s

Bij Pronamic ontwikkel ik WordPress websites en zetten we regelmatige bestaande websites om naar WordPress. Hierbij komt het vaak voor dat er bestaande berichten omgezet moeten worden naar WordPress. Met allerlei handige tools zoals bijvoorbeeld OutWit en de vele WordPress importeer plugins gaat dit vaak relatief eenvoudig.

Bij het importeren van berichten van een website naar een nieuwe WordPress website is het vaak erg handig om de bron URL op te slaan bij het nieuwe WordPress bericht. De extra velden functionaliteit bij WordPress berichten zijn hier zeer geschikt voor. Zodra de content is omgezet is het vaak noodzakelijk om interne koppeling bij te werken. Daarnaast is het vaak gewenst om oude URL’s netjes om te leiden (HTTP 303 redirect) naar de nieuwe URL’s.

Doordat de oude en nieuwe URL’s netjes zijn weggeschreven in de WordPress database kan dit met een aantal slimme MySQL queries gerealiseerd worden. De volgende query zal een lijst met queries genereren die de inhoud van alle WordPress berichten en pagina’s doorzoekt en oude URL’s vervangt met de nieuwe WordPress URL’s:

SELECT
	CONCAT(
		'UPDATE wp_posts SET post_content = REPLACE(post_content, ' ,
		QUOTE(meta.meta_value) , ', ' ,
		QUOTE(post.guid) , ');'
	)
FROM
	wp_posts AS post
		RIGHT JOIN
	wp_postmeta AS meta
		ON
			post.ID = meta.post_id
				AND
			meta.meta_key = 'legacy_url'
WHERE
	post.guid != '';

De output van bovenstaande query zijn nieuwe queries welke uiteraard uitgevoerd moeten worden. Het komt soms voor dat de interne links relatief zijn aan de berichten zelf. Dit maakt het vervangen van de oude URL’s in veel gevallen veel complexer. Als de URL’s relatief zijn aan de domeinnaam dan is waarschijnlijk interessant om eerst de volgende query uit te voeren:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'href="/', 'href="http://www.domeinnaam.nl/');

In andere gevallen zullen er slimme queries uitgevoerd moeten worden, zoals bijvoorbeeld:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'href="../../../nieuws/', 'href="http://www.domeinnaam.nl/nieuws/');

Daarnaast kan met de volgende query een overzicht gemaakt worden van alle oude en nieuwe URL’s. Dit overzicht kan vervolgens ge├»mporteerd worden naar de Redirection plugin waarmee eenvoudig omleidingen zijn te beheren.

SELECT
	REPLACE(meta.meta_value, 'http://www.domeinnaam.nl', '') AS source ,
	post.guid AS target ,
	0 as hits
FROM
	wp_posts AS post
		RIGHT JOIN
	wp_postmeta AS meta
		ON
			post.ID = meta.post_id
				AND
			meta.meta_key = 'legacy_url'
WHERE
	post.guid != '';