Post, JSON, AJAX, WordPress, API – Faire un modèle de page pour obtenir un flux JSON depuis votre thème WordPress afin de se connecter ultérieurement à des API type Amazon ou MapBox


Il est souvent nécessaire d’extraire des données sous la forme d’un flux depuis un CMS, Drupal, Joomla ou WordPress pour ne citer que les CMS les plus populaire afin notamment d’injecter du contenu dans une API quelconque genre Amazon que l’on ne présente plus ou bien l’excellent service de cartographie MapBox.

On perçoit assez vite le bénéfice immédiat d’une telle démarche. En effet au lieu d’installer une palanquet des plugins WordPress ou de modules sur Drupal pour étendre avec plus ou moins de succès les fonctionnalités de votre CMS. Avec l’integration d’une API, vous étendez les fonctionnalités de votre site avec un vrai webservice, fiable robuste, documenté… Bref mieux que tout ce que vous pourrez trouver dans la vaste web.

Dans cet article, on va simplement présenter la création d’un modèle de page pour générer un flux json à partir d’un custom post types. Toutefois, cela suppose au préalable que vous savez ce que sont les custom post types, les custom values attachés à un custom post type ainsi que les taxonomies elles-mêmes attachées à un custom post type

Si toutes les notions citées plus hauts vous sont totalement étrangères alors on vous recommande ce très bon article en anglais de Justin Tadlock sur la question.

Source : http://justintadlock.com/archives/2010/04/29/custom-post-types-in-wordpress

Un modèle de page plutôt qu’une extension fonctionnelle

Créer une nouvelle page (modèle, template, gabarit…) quelque soit le CMS (drupal, WordPress, Joomla, Textpattern, CMSimple… etc.), est souvent beaucoup plus simple à manipuler et à concevoir. En effet, mettre un simple modèle de page en ligne en lieu et place d’un développement complexe afin de tester sur un site web en production (les DNS sont publiques), la possibilité de rapatrier des données depuis une API (publique elle aussi)* est nettement plus AGILE. En effet, vous pouvez tester in situ et en temps réel la montée en charge avec de véritables données, affiner les requêtes dans un vrai contexte de production, amender votre développement en fonction du retour client… Bref agile encore une fois agile !

* Le problème souvent est que les développeurs, administrateurs, consultants, informaticiens peuvent être de grands paranoïaques alors mettre tout en clair et en public, les fait un peu flipper. La solution : 3 LEXOMILs dans un verre de bière de préférence belge c’est à dire fortement alcoolisé, un vendredi soir, suffira à taire les inquiétudes, il vous faut néanmoins préparer une TODOLIST parce quand Polyphème aka le cyclope est endormi, c’est le moment pour le rusé Ulysse (vous), de ne pas lambiner ! Vous ne devez pas vous rater dans l’obtention d’un résultat effectif et probant, histoire de faire taire lundi matin toutes les critiques éventuelles une fois la preuve de concept obtenue !

Ne pas oublier de créer la page avec le modèle

N’oublier de rajouter donc votre modèle de page dans votre thème Worpdress puis de publier une nouvelle page utilisant ce modèle. Vous pourrez ensuite à loisir, passer des requêtes directement via l’adresse de publication (Voir les liens ci-dessous). De fait, si vous avez besoin de récupérer des informations contenu dans un CMS pour les injecter dans une API, c’est l’idéal. Nous avons procéder de la sorte pour le nombreux webservices tel que Amazon, Mapbox.

Dans nos cas, nous avons tester en local notre nouveau thème de page, rien ne vous empêche de modifier la requête afin de sélectionner des articles (post), des post type…


http://127.0.0.1/wp/json/?user=1&num=3&format=json
http://127.0.0.1/wp/json/?user=1&num=-1&format=json

Utilisation du modèle page Template Name: Feed JSON

Voilà le modèle page que nous avons conçu. Il permet de faire plus que d’afficher de simple articles de WP. Il permet en vérité de tirer pleinement profit du système de taxonomie attaché à un post type.
http://www.your-site.com/json/?user=1&format=json&ptype=your_post_type&tax=my_taxonomy&term=your_term

Source du modèle page Template Name: Feed JSON

	<?php
	/*
	Template Name: Feed JSON
	*/

	/* require the user as the parameter */
	if(isset($_GET['user']) && intval($_GET['user'])) {

		/*
		http://www.your-site.com/json/?user=1&format=json&ptype=your_post_type&tax=my_taxonomy&term=your_term
		*/


	  /* soak in the passed variable or set our own */
	  $tax = strtolower($_GET['tax']); // If you are using a taxonomy attached to your your_post_type eg my_taxonomy
	  $term = strtolower($_GET['term']); // get the terme from your taxonomy attached to your your_post_type
	  $user_id = intval($_GET['user']); //no default
	  $format = strtolower($_GET['format']) == 'json' ? 'json' : 'xml'; //xml is the default
	  $ptype = strtolower($_GET['ptype']) == 'your_post_type' ? ' your_post_type' : 'post'; //post is the default

	  $number_of_posts = isset($_GET['num']) ? intval($_GET['num']) : 10; //10 is the default


	/* connect to the db */
	  global $wpdb;

	  /* create one master array of the records */
	  $posts = array();

		$args = array(
		'post_type' =>  $type,
		'taxonomy' => $tax,
		'term' => $term,
		'user' => $user_id,
		'num' => $num
		);

	  $the_query = new WP_Query($args);


	  while ( $the_query->have_posts() ) : $the_query->the_post();

			// add any extras that you would like to this array 
			$posts[] = array(
				'title' => get_the_title(),
				'content' => get_the_content(),
				'link' => get_permalink(get_the_ID()),
				'your_custom_value_1' => get_post_meta($post->ID,'your_custom_value_1', true),
				'your_custom_value_2' => get_post_meta($post->ID,'your_custom_value_2', true),
				'your_custom_value_3' => get_post_meta($post->ID,'your_custom_value_3', true),
				/* Replace your_custom_value_i by your true your custom value attached to your custom post your_post_type  */
			);

	  endwhile;


	  /* output in necessary format */
	  if($format == 'json') {
	    header('Content-type: application/json');
	    echo json_encode(array('posts'=>$posts));
	  }
	  else {
	    header('Content-type: text/xml');
	    echo '<posts>';
	    foreach($posts as $index => $post) {
	      if(is_array($post)) {
	        foreach($post as $key => $value) {
	          echo '<',$key,'>';
	          if(is_array($value)) {
	            foreach($value as $tag => $val) {
	              echo '<',$tag,'>',htmlentities($val),'</',$tag,'>';
	            }
	          }
	          echo '</',$key,'>';
	        }
	      }
	    }
	    echo '</posts>';
	  }

	  /* reset query */
	  wp_reset_postdata();
	}

	?>
	

En savoir plus