Maandelijks archief: mei 2012

WordPress berichten importeren MySQL join over 2 databases

Bij Pronamic zijn we afgelopen maanden druk bezig geweest met het omzetten van een grote maatwerk website naar WordPress. Hierbij hadden we ook de opdracht om alle bestaande berichten, foto’s, video’s, evenementen, etc. te importeren naar WordPress.

Het importeren van deze content naar WordPress realiseren we door de oude database in te lezen met PHP en de berichten in WordPress te plaatsen. Aangezien het om duizenden berichten gaat doen we het importeren in fases. We houden daarom in de oude database per item bij wat geïmporteerd is en wat fout ging. Hiervoor hebben een tweetal BOOLEAN kolommen toegevoegd aan een aantal tabellen.

ALTER TABLE content ADD wordpress_imported BOOLEAN NOT NULL DEFAULT FALSE;
ALTER TABLE content ADD wordpress_failed BOOLEAN NOT NULL DEFAULT FALSE;

ALTER TABLE media ADD wordpress_imported BOOLEAN NOT NULL DEFAULT FALSE;
ALTER TABLE media ADD wordpress_failed BOOLEAN NOT NULL DEFAULT FALSE;

Omdat de oude website nog steeds live staat en er nog dagelijks nieuwe berichten worden geplaatst ontvangen we regelmatig een nieuwe database dump. In deze nieuwe datadump zijn echter niet bovenstaande kolommen met data opgenomen. Om te voorkomen dat we oude berichten voor een tweede keer importeren moeten we deze kolommen dus weer toevoegen aan de nieuwe data.

Gelukkig kun je met MySQL eenvoudig in een query meerdere databases raadplegen en dus op deze manier gegevens uit meerdere databases synchroniseren. Allereerst zorgen we er voor dat we bovenstaande queries uitvoeren en vervolgens synchroniseren we de data met behulp van de volgende query:

UPDATE
	database_2.media AS targetTable
		INNER JOIN
	database_1.media AS sourceTable
			ON sourceTable.id = targetTable.id
SET
	targetTable.wordpress_imported = sourceTable.wordpress_imported ,
	targetTable.wordpress_failed = sourceTable.wordpress_failed
;

UPDATE
	database_2.content AS targetTable
		INNER JOIN
	database_1.content AS sourceTable
			ON sourceTable.id= targetTable.id
SET
	targetTable.wordpress_imported = sourceTable.wordpress_imported ,
	targetTable.wordpress_failed = sourceTable.wordpress_failed
;

Stackoverflow: http://stackoverflow.com/questions/1675333/php-mysql-joins-across-databases

We hebben bij Pronamic inmiddels vrij veel ervaring met het omzetten van zeer grote maatwerk websites naar WordPress. Mocht je ook een grote maatwerk website willen omzetten naar WordPress dan kunnen we helpen met het overzetten van de bestaande content.

WordPress update gebruikers met WordPress profiel bericht

Bij het ontwikkelen van een intranet oplossing met WordPress hebben we WordPress gebruikers gekoppeld aan een WordPress profiel berichten. Voor elke WordPress gebruiker die wordt aangemaakt wordt er ook automatisch een WordPress profiel bericht aangemaakt. Op deze manier hebben we met behulp van WordPress bericht archieven eenvoudig een overzicht van alle gebruikers (profielen) kunnen aanmaken. Daarnaast hebben we met krachtige WP_Query parameters een aantal handige zoek- en filter functies kunnen realiseren.

Eventueel zou een dergelijke opzet ook met een WP_User_Query object gerealiseerd kunnen worden, maar uiteindelijk liepen we hierbij tegen meer maatwerk code aan. Daarnaast konden we door te werken met WordPress profiel berichten eenvoudig gebruik van taxonomieën en uitgelichte afbeeldingen. We realiseren ons dat taxonomieën ook inzetbaar zijn voor WordPress gebruikers, maar toch liepen we daarmee ook tegen lastige problemen aan. Nadat we uiteindelijk alle functionaliteiten netjes aan elkaar geknoopt hadden liep onze opdracht echter tegen een klein probleem aan.

Het importeren van honderden intranet gebruikers leverden problemen op. De uitgelichte afbeeldingen kon niet geautomatiseerd geplaatst worden en termen werden niet gekoppeld aan de WordPress profiel berichten van een gebruiker. Wij kregen daarom de opdracht om eenmalig het één en andere te corrigeren. Onze opdrachtgever was er in geslaagd om alle data te importeren, maar het stond alleen nog niet op de juiste plek. De profiel afbeelding link stond zo opgeslagen in het Hyves veld bij een gebruiker en de afdeling term ID in het Flickr veld.

We hebben met eenvoudige WordPress maatwerk pagina sjabloon een eenvoudig script ontwikkeld die het één en andere geautomatiseerd gecorrigeerd heeft. Hieronder is dit scrip te zien, wellicht dat andere WordPress ontwikkelaars hier in de toekomst nog wat aan hebben.

<?php
/**
 * Template Name: Users update
 */

require_once ABSPATH . 'wp-admin/includes/file.php';
require_once ABSPATH . 'wp-admin/includes/image.php';

get_header(); ?>

<div id="content" role="main">
	<div class="container">
		<?php if(have_posts()) while(have_posts()): the_post(); ?>

		<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
			<header>
				<h2 class="entry-title"><?php the_title(); ?></h2>
			</header>

			<div class="entry-content">
				<?php the_content(); ?>

				<?php wp_link_pages(array('before' => '<div class="page-link">' . __('Pages:', 'eisma'), 'after' => '</div>')); ?>
			</div>
		</div>

		<?php endwhile; ?>

		<?php

		$wp_user_search  = new WP_User_Query(array(
			/*'role' => 'subscriber', */
			'fields' => 'all_with_meta' ,
			// 'number' => 1 ,
		));

		$users = $wp_user_search->get_results();

		$i = 1; 

		?>
		<table>
			<thead>
				<tr>
					<th scope="col">#</th>
					<th scope="col">Name</th>
					<th scope="col">Profile</th>
					<th scope="col">Location</th>
					<th scope="col">Business</th>
					<th scope="col">Image</th>
				</tr>
			</thead>

			<tbody>

				<?php foreach($users as $user): ?>

				<tr>
					<td>
						<?php echo $i++; ?>
					</td>
					<td>
						<?php echo $user->display_name; ?>
					</td>
					<td>
						<?php 

						$postId = get_user_meta($user->ID, 'profile_post_id', true);

						?>
						<a href="<?php echo get_permalink($postId); ?>">
							Profile
						</a>
					</td>
					<td>

						<?php 

						// locatie in flickr-veld
						$locationTermId = get_user_meta($user->ID, 'flickr', true); 

						echo $locationTermId;

						if(!empty($locationTermId)) {
							$term = get_term($locationTermId, 'location');

							if(!is_wp_error($term) && !empty($term)) {
								echo ' - ';
								echo $term->name;

								wp_set_post_terms($postId, array($term->term_id), 'location');

								delete_user_meta($user->ID, 'flickr');
							}
						}

						?>
					</td>
					<td>

						<?php 

						// bedrijfsonderdeel in youtube-veld
						$companyTermId = get_user_meta($user->ID, 'youtube', true);

						echo $companyTermId;

						if(!empty($companyTermId)) {
							$term = get_term($companyTermId, 'company');

							if(!is_wp_error($term) && !empty($term)) {
								echo ' - ';
								echo $term->name;

								wp_set_post_terms($postId, array($term->term_id), 'company');

								delete_user_meta($user->ID, 'youtube');
							}
						}

						?>
					</td>
					<td>
						<?php

						$imageUrl = get_user_meta($user->ID, 'hyves', true);

						if(!empty($imageUrl)): ?>

						<img src="<?php echo $imageUrl; ?>" width="256" alt="" />

						<?php

						$result = download_url($imageUrl);

						if(!is_wp_error($result)) {
							$date = new DateTime();

							$name = basename($imageUrl);

							$bits = file_get_contents($result);

							$result = wp_upload_bits($name, null, $bits, $date->format('Y/m'));

							if($result['error'] === false) { // no error
								$fileType = wp_check_filetype($result['file']);

								$attachment = array(
									'post_title' => get_the_title($postId) ,
									'post_mime_type' => $fileType['type'] ,
									'guid' => $result['url'] ,
									'post_parent' => $postId ,
									'post_date' => $date->format('Y-m-d H:i:s') ,
									'post_date_gmt' => get_gmt_from_date($date->format('Y-m-d H:i:s'))
								);

								$attachmentId = wp_insert_attachment($attachment, $result['file'], $postId);

								update_post_meta($postId, '_thumbnail_id', $attachmentId);

								$metaData = wp_generate_attachment_metadata($attachmentId, $result['file']);

								$updated = wp_update_attachment_metadata($attachmentId, $metaData);

								delete_user_meta($user->ID, 'hyves');
							}
						}

						endif; ?>
					</td>
				</tr>

				<?php endforeach; ?>

			</tbody>
		</table>
	</div>
</div>

<?php get_sidebar(); ?>
<?php get_footer(); ?>

Mocht je zelf ook geïnteresseerd zijn in een WordPress intranet dan kun je altijd bij Pronamic informeren naar de mogelijkheden.