Vous avez sans aucun doute vu des thèmes et des plugins WordPress qui prétendent installer automatiquement des « données factices » pour vous lorsque vous les installez, afin que vous disposiez immédiatement d’un site Web entièrement fonctionnel. Je vais vous montrer une méthode pour y parvenir en utilisant uniquement des fonctions PHP.
Cela peut être utile si :
- Votre thème ou plugin nécessite certains articles ou pages.
- Vous souhaitez fournir une installation factice premium comme décrit ci-dessus.
- Vous souhaitez automatiser la création d’articles.
- Vous voulez juste apprendre.
Dans ce didacticiel, nous allons créer une fonction de débutant simple pour obtenir une solution de travail « rapide et sale ». Plus tard dans un autre didacticiel, nous apprendrons comment étendre ce que nous avons appris ici pour créer un système de publication robuste et facile à utiliser.
Pour ceux d’entre vous qui préfèrent jouer avec du code préexistant au lieu de lire tous les tutoriels, voici notre dernière fonction avec un exemple de son utilisation et des notes.
if ( ! function_exists( 'PostCreator' ) ) {
function PostCreator(
$name = 'AUTO POST',
$type = 'post',
$content = 'DUMMY CONTENT',
$category = array(1,2),
$template = NULL,
$author_id = '1',
$status = 'publish'
) {
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, '' );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
if ( $type == 'page' ) {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
function hbt_create_post() {
$post_data = array(
'post_title' => wp_strip_all_tags( POST_NAME ),
'post_content' => POST_CONTENT,
'post_status' => POST_STATUS,
'post_type' => POST_TYPE,
'post_author' => POST_AUTH_ID,
'post_category' => POST_CATEGORY,
'page_template' => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
if ( ! isset( $post ) ) {
add_action( 'admin_init', 'hbt_create_post' );
return $error_obj;
}
}
}
/* All available options for PostCreator()
PostCreator( 'TITLE' , 'POST TYPE' , 'POST CONTENT' , 'POST CATEGORY' , 'TEMPLATE FILE NAME' , 'AUTHOR ID NUMBER' , 'POST STATUS');
TITLE - HTML Stripped Out. Simple String.
POST TYPE - Post type slug. Eg 'post' or 'page'. Custom Post Types are supported.
POST CONTENT - Content of the Post/Page. HTML allowed.
POST CATEGORY - An array of the integer ID's of the category/categories you want to link to your post
TEMPLATE FILE NAME - File name of the template. Only for Pages. In the format 'file_name.php'.
AUTHOR ID NUMBER - Integer value. Default is 1.
POST STATUS - Available options; [ 'draft' | 'publish' | 'pending'| 'future' | 'private' | custom registered status ]
If successful, PostCreator() returns nothing.
If there is an error PostCreator() returns a WP_error object.
*/
PostCreator( 'My Lorem Ipsum', 'page', 'With a sizable serving of Dolor. This was created using Harri Bell-Thomas's PostCreator function.' );
Guide étape par étape
Nous allons créer une fonction PHP appelée PostCreator(), et nous en aurons besoin pour prendre certains paramètres. Chaque paramètre a une valeur par défaut, donc techniquement, lors de l’appel de la fonction, vous n’avez besoin de spécifier aucun d’entre eux, mais bon, où est le plaisir là-dedans ?
function PostCreator(
$name = 'AUTO POST',
$type = 'post',
$content = 'DUMMY CONTENT',
$category = array(1,2),
$template = NULL,
$author_id = '1',
$status = 'publish'
) {
// function output here
}
Ensuite, je vais définir quelques constantes qui sont nécessaires pour la fonction intégrée suivante. (Cela pourrait être réécrit pour ne pas utiliser de constantes, mais je les ai utilisées car je les trouve utiles pour étendre la fonction de base PostCreator(), mais c’est une histoire pour un autre tutoriel.
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, '' );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
OK, jusqu’ici tout va bien. Maintenant, j’ai inclus une validation pour empêcher la génération de publications/pages en double (ce qui est un cauchemar, croyez-moi !). Cette validation vérifie si un article/une page portant le même nom existe déjà. Si c’est le cas, il n’en crée pas un nouveau, mais si ce n’est pas le cas, il le crée pour vous.
La raison pour laquelle j’ai choisi de vérifier le titre de l’article est que c’est tout ce qui est requis par WordPress pour générer une page (le reste est généré automatiquement). D’autres moyens d’effectuer cette validation incluent la vérification par rapport aux « slugs » ou aux identifiants de poste. Tout cela, nous y reviendrons dans un tutoriel ultérieur.
Ceci est particulièrement utile si la publication/page est requise par votre plugin ou votre thème. J’ai d’abord développé cela pour l’un de mes plugins car il fallait qu’une page soit présente avec un certain modèle de page. Avec cette fonction, j’ai simplement gardé PostCreator() est ‘admin_init’ de WordPress, ce qui signifie que si quelqu’un essayait de le supprimer (comment ose-t-il !), alors il serait recréé immédiatement pour éviter les problèmes avec le reste du plugin.
Gardez à l’esprit que personne ne veut que son blog soit piraté, alors assurez-vous de lui dire clairement ce qui se passe, et peut-être de lui offrir une option pour le désactiver.
Revenons maintenant à la validation. Voici le prochain morceau de code.
if ( $type == 'page' ) {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
Alors qu’est-ce qui se passe ici ?
Eh bien, c’est essentiellement le même processus répété deux fois. Je le fais à cause de la façon dont les articles et les pages sont traités légèrement différemment. De plus, la constante POST_TEMPLATE n’est définie que si vous essayez de créer une page, car seules les pages peuvent accepter ce paramètre (c’est-à-dire qu’il sera ignoré si vous essayez de créer une publication standard).
Sur la première ligne de la clause IF (son nom technique est ‘apodose’ si vous ne le saviez pas déjà) la variable $post est définie. S’il existe un article/une page portant le même nom que celui qui essaie d’être créé, alors $post est renseigné avec les données de l’entrée existante (en tant qu’objet, pas de tableau, mais cela peut être modifié si cela est absolument nécessaire). Cette variable est utilisée pour tester si votre titre est unique. Les deux lignes suivantes que j’ai incluses car, encore une fois, elles sont très utiles si vous souhaitez étendre cette fonction. Un exemple de ceci pourrait être la mise à jour du message existant s’il existe déjà.
Vient ensuite notre fonction imbriquée qui sera ajoutée au hook ‘admin_head’. C’est ici;
function hbt_create_post() {
$post_data = array(
'post_title' => wp_strip_all_tags( POST_NAME ),
'post_content' => POST_CONTENT,
'post_status' => POST_STATUS,
'post_type' => POST_TYPE,
'post_author' => POST_AUTH_ID,
'post_category' => POST_CATEGORY,
'page_template' => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
Simplement, cela utilise la fonction intégrée de WordPress (wp_insert_post) pour générer notre article/page. Nous remplissons $post_data avec un tableau de nos paramètres (vous pouvez voir nos constantes utilisées ici). Ceci est créé et s’il y a une erreur, il génère une valeur booléenne $error_obj. VRAI = Un problème. FAUX = Tout va bien. La dernière chose à faire est d’exécuter la fonction précédente sur la tête d’administration, mais seulement si elle réussit la validation, et de renvoyer l’objet d’erreur.
if ( ! isset( $post ) ) {
add_action( 'admin_init', 'hbt_create_post' );
return $error_obj;
}
Super! Maintenant que nous avons créé notre fonction géniale, utilisons-la !
Usage
Incluez simplement la fonction PostCreator() et exécutez-la.
Cela fonctionnera en utilisant les valeurs par défaut, mais que se passe-t-il si nous voulons une personnalisation ? Ensuite, nous utilisons nos paramètres.
PostCreator(
'TITLE',
'POST TYPE',
'POST CONTENT',
'POST CATEGORY',
'TEMPLATE FILE NAME',
'AUTHOR ID NUMBER',
'POST STATUS'
);
Avec toutes ces options, faites attention en utilisant des apostrophes. Assurez-vous que si vous souhaitez utiliser une apostrophe (sauf pour celles entourant les paramètres eux-mêmes), vous la préfixez d’une barre oblique inverse. Par exemple;
PostCreator( 'Alex's Post' );
Le paramètre TITLE accepte une valeur de chaîne. Ceci est dépouillé des balises HTML.
Le paramètre POST TYPE accepte le slug du type post, par exemple ; ‘post’ ou ‘page’. Les types de publication personnalisés sont pris en charge.
PostCreator( 'Alex's Post', 'page' );
Le POST CONTENT’ accepte une valeur de chaîne. Ce sera le contenu de la publication/page créée. Le HTML est autorisé ici.
PostCreator( 'Alex's Post', 'page', 'The force is strong with this one…' );
La CATÉGORIE POST accepte un tableau d’entiers. Les entiers correspondent à l’ID de la/des catégorie(s) attribuée(s) à la publication/à la page.
PostCreator( 'Alex's Post', 'page' , 'The force is strong with this one…' , array( 1, 2 ) );
Le NOM DE FICHIER TEMPLATE est une valeur de chaîne définissant le modèle de page souhaité de votre nouvelle page. Cela ne fonctionne que pour les pages. Le format sera ; ‘nom_fichier.php’.
PostCreator(
'Alex's Post',
page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php'
);
L’AUTHOR ID NUMBER est une valeur entière de l’ID de l’auteur.
PostCreator(
'Alex's Post',
'page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php',
'1'
);
Le POST STATUS vous permet de définir l’état de la publication/page créée. Par défaut, il est « publié ».
Options disponibles; [ ‘draft’ | ‘publish’ | ‘pending’| ‘future’ | ‘private’ | custom registered status ]
PostCreator(
'Alex's Post',
'page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php',
'1',
'publish'
);
Emballer
WordPress est un outil exceptionnellement puissant, mais peut parfois être indiscipliné. J’espère que vous trouverez cet extrait simple utile, peut-être apprendre une chose ou deux en cours de route. Restez à l’écoute pour le prochain où je vais convertir ce que nous avons déjà fait dans cet article en une classe PHP, ajoutant plus de fonctionnalités et de stabilité. Pour un aperçu, consultez le code sur Github : PostController
Si vous avez des questions, posez-les simplement dans la section commentaire ci-dessous.