Création de champs personnalisés pour les pièces jointes dans Wordpress

Les champs personnalisés dans Wordpress facilitent la personnalisation de votre thème de différentes façons. De plus, ils sont simples à mettre en œuvre pour les publications et les pages. Les pièces jointes, en revanche, nécessitent un peu plus de travail, ce qui vous oblige à lire et à déchiffrer le code source afin de le faire fonctionner. Nous allons vous expliquer comment utiliser deux crochets Wordpress non documentés dans ce tutoriel pour rendre ce processus beaucoup plus facile..


Préface: À propos des hameçons

Ces deux points d'ancrage existent depuis Wordpress 2.5 et sont appliqués dans wp-admin / includes / media.php, mais restent sous-utilisés dans la communauté, probablement parce qu'ils ne sont pas documentés dans le Codex. Ci-dessous se trouve où les hooks sont appliqués dans le code principal, nous permettant de savoir ce qui sera passé aux fonctions que nous ajoutons à chaque hook.

attachment_fields_to_edit

 function get_attachment_fields_to_edit ($ post, $ erreurs = null) //… $ form_fields = apply_filters ("attachment_fields_to_edit", $ form_fields, $ post); //…
  • $ form_fields est un tableau spécial qui sera décrit en détail dans un instant.
  • $ post est l'attachement en tant que objet (les pièces jointes sont traitées comme des objets de publication dans Wordpress).

attachment_fields_to_save

 function media_upload_form_handler () //… $ post = apply_filters ("attachment_fields_to_save", $ post, $ attachment); //…
  • $ post est l'attachement en tant que tableau (les pièces jointes sont traitées comme des objets de publication dans Wordpress).
  • pièce jointe est la pièce jointe du formulaire $ _POST qui comprendra la configuration des champs à travers le attachment_fields_to_edit crochet.

Remarque: Soyez prudent dans votre code, comme $ post est envoyé à une fonction en tant que objet et à l'autre en tant que tableau.

Conseils de dénomination de champ personnalisé

Les nouveaux champs ajoutés seront enregistrés en tant que publication meta, tout comme la section des champs personnalisés de l'écran d'édition / publication. Champs précédés d'un trait de soulignement (_my_custom_field) ne sera pas répertorié dans la liste déroulante des champs personnalisés disponibles sur l'écran de publication / page; tous les autres champs de méta post existants seront listés. Nous pouvons utiliser cette connaissance pour masquer les champs que nous ajoutons au formulaire multimédia, car ils ne sont pas pertinents pour les articles / pages..

Il convient de garder à l’esprit une règle similaire lors du choix du $ form_fields clé de tableau à utiliser pour votre nouveau champ. Ici, si vous utilisez un trait de soulignement ($ form_fields ['_ my_custom_field']) votre champ sera ignoré et ne sera pas ajouté au formulaire.

Donc, afin de montrer nos champs dans le formulaire média, mais aussi de ne pas les lister dans la liste déroulante page / post-champs personnalisés, nous devons combiner les deux méthodes. Cela impliquera à la fois les fonctions d'édition et de sauvegarde que nous allons créer. Pour le 'attachment_fields_to_edit'crochet nous allons définir le $ form_fields touches jusqu’à ne pas avoir de préfixe de soulignement, et pour le 'attachment_fields_to_saveNous allons préfixer nos champs avec un trait de soulignement avant de les enregistrer en tant que méta. Il s’agit d’une solution de contournement utile afin de ne pas brouiller l’interface de nos utilisateurs avec des informations inutiles..


Crochet 1: attachment_fields_to_edit

Vous trouverez ci-dessous un exemple d’ajout de vos propres champs personnalisés au formulaire de pièce jointe..

 / ** * Ajout de nos champs personnalisés au tableau $ form_fields * * * @param array $ formulaire_fields * @param objet $ post * @return array * / function mon_image_attachment_fields_to_edit ($ form_fields, $ post) // $ form_fields est un tableau spécial des champs à inclure dans le formulaire de pièce jointe // $ post est l'enregistrement de la pièce jointe dans la base de données // $ post-> post_type == 'attachment' // // (les pièces jointes sont traitées comme des publications dans Wordpress) // ajoutez notre champ personnalisé au $ form_fields array // input type = "text" name / id = "pièces jointes [$ attachment-> ID] [custom1]" $ form_fields ["custom1"] = array ("label" => __ ("Champ de texte personnalisé" ), "input" => "text", // ceci est la valeur par défaut si "input" est omis "value" => get_post_meta ($ post-> ID, "_custom1", true)); // si vous voulez ajouter des messages d'erreur pour votre champ, // afin de ne pas les écraser car ils sont pré-attachés // à ce tableau, vous devez définir le champ comme suit: $ form_fields [" custom1 "] [" label "] = __ (" Champ de texte personnalisé "); $ form_fields ["custom1"] ["input"] = "text"; $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true); return $ form_fields;  // attache notre fonction au hook correct add_filter ("attachment_fields_to_edit", "mon_image_attachment_fields_to_edit", null, 2);

le $ form_fields array a plusieurs options pour inclure différents types d’entrées et un contenu personnalisé. J'ai compilé les différentes méthodes ci-dessous avec des notes et des captures d'écran de leur rendu sous la forme.

Saisie de texte

 // type d'entrée = "texte" $ form_fields ["custom1"] ["label"] = __ ("Champ de texte personnalisé"); $ form_fields ["custom1"] ["input"] = "text"; // c'est la valeur par défaut si "input" est omis $ form_fields ["custom1"] ["value"] = get_post_meta ($ post-> ID, "_custom1", true);

Rend sous la forme comme:

Textarea

 // textarea $ form_fields ["custom2"] ["label"] = __ ("Custom Textarea"); $ form_fields ["custom2"] ["input"] = "textarea"; $ form_fields ["custom2"] ["value"] = get_post_meta ($ post-> ID, "_custom2", true);

Rend sous la forme comme:

Champ caché

Les champs cachés sont compilés ensemble et sortis à la fin du formulaire.

 // type d'entrée = "caché" // pas besoin d'étiquette $ form_fields ["custom3"] ["input"] = "caché"; $ form_fields ["custom3"] ["value"] = get_post_meta ($ post-> ID, "_custom3", true);

Autres types de champs

Si vous avez besoin d'un type d'entrée autre que 'text', 'textarea' ou 'hidden', utilisez alors 'html' qui vous permet de transmettre votre propre contenu personnalisé à utiliser pour l'élément d'entrée de votre choix. Lorsque vous créez votre propre code HTML d'entrée, il est important de définir correctement l'attribut "name" sur l'élément, afin que le champ soit transmis à notre fonction de sauvegarde ultérieurement. Vous voulez quelque chose comme ça: name = "pièces jointes [$ post-> ID] [my_custom_key]" .

 $ form_fields ["custom4"] ["label"] = __ ("Sélection personnalisée"); $ form_fields ["custom4"] ["input"] = "html"; $ form_fields ["custom4"] ["html"] = " "; // autre exemple $ form_fields [" custom5 "] [" label "] = __ (" case à cocher personnalisée "); $ form_fields [" custom5 "] [" input "] =" html "; $ form_fields [" custom5 " ] ["html"] = "la sortie HTML va ici, comme une case à cocher: ";

Rend sous la forme comme:

Attributs Spéciaux

Il existe plusieurs attributs spéciaux que vous pouvez ajouter à vos champs personnalisés pour les améliorer..

aide - Cet attribut ajoute une chaîne d'aide à votre champ personnalisé..

 $ form_fields ["custom6"] ["label"] = __ ("Champ personnalisé avec texte utile"); $ form_fields ["custom6"] ["value"] = get_post_meta ($ post-> ID, "_custom6", true); $ form_fields ["custom6"] ["aides"] = "Mettez du texte utile ici.";

Cela se présente sous la forme:

Champs obligatoires - Cet attribut marquera le champ comme requis; mais ce n'est qu'une référence visuelle. Nous devrons écrire du code plus tard dans la fonction de sauvegarde pour l'appliquer.

 $ form_fields ["custom7"] ["label"] = __ ("Champ obligatoire"); $ form_fields ["custom7"] ["value"] = get_post_meta ($ post-> ID, "_custom7", true); $ form_fields ["custom7"] ["required"] = TRUE; // la valeur par défaut est FALSE

Rend sous la forme comme:

extra_rows - Cet attribut vous permet d'ajouter un tableau de lignes juste après votre champ personnalisé. Le balisage de chaque élément du tableau est présenté ci-dessous: la clé du tableau deviendra la classe du td, et la valeur est le contenu:

 // balise extra_rows: //  //  // arrayItemValue //  $ form_fields ["custom8"] ["label"] = __ ("Champ personnalisé avec rangées supplémentaires"); $ form_fields ["custom8"] ["value"] = get_post_meta ($ post-> ID, "_custom8", true); // extra_rows doit être un tableau associatif $ cssClass => $ content $ form_fields ["custom8"] ["extra_rows"] = array ("cssClass1" => "Si vous avez besoin de quelques lignes après votre champ…", "cssClass2" => "… Peut-être expliquer quelque chose ou ajouter des images?   ",);

Rend sous la forme comme:

tr - Tandis que extra_rows vous permet uniquement d'ajouter des cellules de tableau directement sous l'élément d'entrée de votre champ personnalisé, cet attribut vous permet de créer des lignes entières.

Le tableau auquel nous ajoutons une ligne a deux colonnes, gardez cela à l'esprit lorsque vous utilisez cette méthode. Et cela ne veut pas avoir pour être un champ de formulaire, vous pouvez simplement ajouter une ligne expliquant les champs suivants, ajouter tous vos champs manuellement ou autre chose.

 $ form_fields ["custom8"] ["tr"] = "   Vous pouvez faire ce que vous voulez, le styliser, ajouter des champs, afficher un tableau de données… ciel est la limite  ";

Rend sous la forme comme:


Crochet 2: attachment_fields_to_save

L'enregistrement de vos champs personnalisés est un processus beaucoup plus simple que de les ajouter au formulaire. il suffit de vérifier si votre champ est défini et de mettre à jour sa valeur en tant que méta post. Rappelez-vous de préfixer votre champ avec un trait de soulignement lors de l'enregistrement pour le masquer sur l'écran d'édition / de publication.

 / ** * tableau @param $ post * tableau @param $ pièce jointe * @ tableau retour * / function my_image_attachment_fields_to_save ($ post, $ attachment) // $ pièce jointe du formulaire $ _POST ($ _POST [attachments] [postID] ) // $ post attachments wp post array - sera sauvegardé après le retour // $ post ['post_type'] == 'attachment' if (isset ($ attachment ['my_field']))) // update_post_meta (postID, meta_key , meta_value); update_post_meta ($ post ['ID'], '_my_field', $ attachment ['my_field']);  return $ post; 

Vous pouvez également ajouter ici des erreurs qui seront automatiquement affichées sous votre champ dans le formulaire. le $ post ['erreurs'] tableau est fusionné avec le $ form_fields tableau avant d'être envoyé à travers le attachment_fields_to_edit crochet.

 / ** * @param array $ post * @param array $ attachment * @return array * / function mon_image_attachment_fields_to_save ($ post, $ attachment) if (isset ($ attachment ['my_field']))) if (trim ($ attachment ['my_field']) == ") // ajouter notre erreur personnalisée $ post ['errors'] ['my_field'] ['errors'] [] = __ ('Texte de l'erreur ici.'); else update_post_meta ($ post ['ID'], 'mon_field', $ attachment ['mon_field']); return $ post;

Remarque concernant les erreurs personnalisées: Wordpress (à partir de la version 3.0-RC3) contient quelques bogues de longue date liés à l'affichage des erreurs personnalisées..

  1. Un empêchera vos messages d'erreur personnalisés d'apparaître sur la page d'édition d'un seul média.
  2. L'autre bogue se trouve dans la fenêtre contextuelle modale des éléments multimédias utilisés dans l'écran d'édition de publication / de page. Les erreurs affichent
    ici, c'est juste le problème de initialement voyant leur. Après avoir sauvegardé, vous passez automatiquement à la
    Onglet "Galerie" où se trouve une liste réduite d'éléments multimédias. Si vous cliquez sur 'afficher' pour ouvrir votre nouvel élément,
    vous verrez vos messages d'erreur dans le formulaire. Le problème est que s’il ya des erreurs, le formulaire d’éléments est supposé à
    être ouvert par défaut. Il y a un bug dans le CSS où la classe 'startopen' (qui est présente sur l'élément si
    il y a des erreurs à afficher) a la valeur 'display: none' à quelques endroits dans les feuilles de style principales.

J'ai soumis des correctifs pour ces deux problèmes (n ° 13810 et n ° 13838) et on m'a dit qu'ils devraient être examinés et inclus dans la version 3.1. Donc, pour l'instant, ne vous fiez pas trop à vos messages d'erreur, soyez heureux de savoir comment travailler avec eux quand ils deviendront plus utiles dans un avenir proche..


Autres idées

Vous voudrez peut-être inclure certains de vos champs uniquement dans les pièces jointes audio ou dans les images attachées à la page d'accueil. Pour personnaliser davantage vos formulaires de pièce jointe, il vous suffit d’envelopper vos champs spéciaux dans des instructions distinctes pour les fonctions d’édition et de sauvegarde..

 // pour les fichiers audio if (substr ($ post-> post_mime_type, 0, 5) == 'audio') // ajoutez vos champs personnalisés pour les fichiers audio // OU pour les images d'une page spécifique $ page_id = 5; // définit l'identifiant sur la page à laquelle vous souhaitez appliquer ces éléments if ($ post-> post_parent == $ page_id && substr ($ post-> post_mime_type, 0, 5) == 'image') // ajoute votre image champs personnalisés pour cette page particulière

Si vous songez à utiliser intelligemment des champs personnalisés avec des pièces jointes, partagez-les avec nous dans les commentaires.!