(Ma première question WP jamais posée! Soyez doux!)
Je construis un site qui est principalement constitué de pages (c'est-à-dire statiques), en utilisant WP comme CMS. Au bas de plusieurs pages, apparaîtront 1, 2 ou 3 "boîtes promotionnelles" - essentiellement des images de boutons qui renvoient vers d'autres parties du site. Bien que jusqu'à 3 boîtes promotionnelles apparaîtront sur une page donnée, il y aura ~ 30 différentes à choisir.
Lorsque mon client crée une nouvelle page, j'aimerais qu'il puisse choisir des boîtes promotionnelles à partir de quelque chose comme une liste déroulante de toutes les boîtes promotionnelles possibles.
Il me semble que cela devrait fonctionner comme ceci:
- Créez un type de publication personnalisé appelé "promo-box". (Bien qu'il puisse tout aussi bien être une balise pour des publications régulières.)
- Utilisez un outil tel que le modèle de champ personnalisé pour créer une liste déroulante sur l'éditeur de page, où les valeurs des options de liste déroulante sont générées dynamiquement à partir de la liste de toutes les publications existantes de la boîte promotionnelle. ( C'est la partie que je ne sais pas faire. )
- Accédez aux métadonnées résultantes (le numéro de poste est vraiment tout ce dont j'ai besoin, alors je peux obtenir tout le reste) sur le modèle de page.
Sur la base des réponses à d'autres questions ici, j'ai jeté un premier coup d'œil à WPAlchemy MetaBox, Posts-2-Posts et SLT Custom Fields, mais j'avoue que la documentation pour chacun d'eux est légèrement plus geek que moi, donc je n'ai pas fouillé trop profondément.
Conseil? L'un des outils ci-dessus est-il la bonne solution pour moi, et je dois juste le découvrir? Est-ce que j'ai râté quelque chose?
la source
Réponses:
En tant qu'auteur de WPAlchemy , je suis un peu biaisé, mais vous avez essentiellement un bon modèle de travail décrit à suivre en fonction de la route que vous choisissez.
Cependant, si vous utilisez WPAlchemy, vous feriez essentiellement quelque chose comme ceci (étape # 2):
custom/meta.css
peut contenir des styles avec lesquels vous pouvez styliser votre formulaire etcustom/meta.php
est essentiellement un fichier HTML avec le contenu FORM de la zone de méta, dans ce cas votre liste déroulante, pour générer votre liste déroulante, vous feriez une requête wp personnalisée pour obtenir tous vos messages personnalisés les types. WPAlchemy possède des fonctions d'assistance spéciales pour vous aider à créer vos éléments de formulaire.Il existe une documentation supplémentaire pour vous aider lorsque vous travaillez dans le modèle.
L'objectif principal de WPAlchemy était de garder le contrôle entre les mains du développeur, du style (look + feel) à la définition du contenu de la meta box.
Et moi-même et les autres sommes toujours prêts à aider ceux qui commentent et posent des questions.
la source
do_meta_boxes
à une logique conditionnelle ou alternativement àadd_meta_boxes_{%TYPE%}
..Hehe, tu es un débutant! On va vous déchirer ...!
j / k :) Nous offrons un accueil chaleureux à tous les débutants ici, heureux de vous avoir.
C'est donc la troisième fois que j'entends cette exigence, deux fois de la part des clients et pas encore de vous (et de votre client). Cela me dit que c'est un besoin assez courant.
J'ai aimé votre analyse, j'ai donc décidé de coder une classe pour répondre à votre 2e point. Je l'ai appelé
LittlePromoBoxes
parce que je ne peux jamais sortir cette chanson de ma tête grâce à eux . Fondamentalement, j'utilise la classe pour encapsuler pour éviter autrement les conflits de nommage potentiels avec les fonctions que j'aurais besoin d'écrire.Vous pouvez mettre cette classe dans le
functions.php
fichier de votre thème ou dans le fichier .PHP d'un plugin que vous pourriez écrire (mais ne vous inquiétez pas, cela semble beaucoup plus complexe qu'il ne l'est).La première fonction
on_load()
est une fonction statique que j'appelle à la fin de la déclaration de classe pour initialiser les trois (3) hooks dont vous aurez besoin (les fonctions statiques fyi sont essentiellement des fonctions liées à la classe , pas l'instance) :Le
init
crochet pour enregistrer lepromo-box
type de poste,Le
add_meta_boxes_post
crochet pour vous permettre de définir la métabox, etLe
wp_insert_post_data
crochet pour vous permettre de capturer les boîtes promotionnelles sélectionnées et de les enregistrer dans la base de données.Chacun de ces crochets fait référence à une autre fonction statique de la classe (ce sont les fonctions que j'encapsulais en créant la classe.)
Je vais sauter la description de la
action_init()
fonction et mamake_labels()
fonction d'assistance en supposant que vous savez comment enregistrer un type de message en fonction de votre question.La
action_add_meta_boxes_post()
fonction enregistre la métabox à l'aide de la fonction principale de WordPressadd_meta_box()
et j'ai commenté ses paramètres pour expliquer pourquoi j'ai réussi ce que j'ai réussi pour chacun. La fonction de rappelthe_little_promo_boxes_metabox()
est bien sûr une autre fonction statique de la classe et c'est ce qui affiche réellement le contenu dans la métabox. Il utilise principalement la fonction principale de WordPresswp_dropdown_pages()
pour afficher une liste de boîtes promotionnelles (notez qu'il affichera d'autres types de messages en plus de la page, mais uniquement s'ils sont marqués comme étant'hierarchical'=>true
dans leur enregistrement de type de message. Pourquoi seulement hiérarchiques? Parce que c'est ainsi qu'ils l'a écrit, c'est pourquoi! :)Puisque nous montrons trois (3) listes déroulantes, nous devons donner à chacun un ID unique dans le HTML (
"promo_box_{$i}"
) mais le même nom avec des crochets ('promo_boxes[]'
) afin que PHP les recueille dans un tableau à l'intérieur d'une$_POST
variable (à laquelle WordPress accède pour nous; vous verrez comment dans une minute) . Et bien sûr, nous devons définir la valeur sélectionnée ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])
) si en effet l'une des valeurs avait déjà été sélectionnée.J'ai également utilisé la fonction principale de WordPress
get_post_type_object()
pour montrer comment obtenir les étiquettes d'un type de publication, et également utiliser la fonction principale de WordPressget_post_meta()
pour récupérer un tableau d'ID de boîte promotionnelle à l'aide de la clé de champ personnalisée '_promo_boxes' que je vais vous montrer. pour enregistrer ensuite (notez que j'ai utilisé un soulignement précédent dans le nom,'_promo_boxes'
ce qui fait que WordPress se cache de l'interface utilisateur de champ personnalisé standard lorsque l'utilisateur modifie le message.) .La dernière fonction à décrire avant de voir le code est celle
filter_wp_insert_post_data()
qui reçoit les données de publication existantes dans le premier paramètre ($data
) et le contenu du$_POST
tableau grâce à WordPress comme deuxième paramètre ($postarr
). À l'intérieur de cette fonction, nous appelons la fonction principale de WordPressupdate_post_meta()
et extrayons le tableau des boîtes promotionnelles ($postarr['promo_boxes']
) pour l'enregistrer dans la valeur de champ personnalisé pour la clé'_promo_boxes'
du message spécifié par le$_POST
tableau (c.$postarr['ID']
-à-d.).Cela dit, voici le code de la
LittlePromoBoxes
classe:Il y a encore deux (2) fonctions statiques non encore mentionnées:
get_promo_boxes()
etget_promo_box()
; ce sont des fonctions d'aide pour vous aider à récupérer les messages depost_type='promo-box'
par leur nombre ordinal 1..3. Mais pour les rendre plus WordPress comme ici, deux fonctions d'encapsulation sont à ajouter aufunctions.php
fichier de votre thème (notez que vous pouvez passer une publication en tant que paramètre, mais ce n'est pas obligatoire, sauf si vous utilisez une publication différente de celle de The Loop ) :Maintenant, vous pouvez appeler l'une ou les deux de ces fonctions dans votre
single.php
fichier de thème avec un code qui pourrait ressembler à ceci (ce code aurait pu être écrit en boucle mais la plupart des themers WordPress semblent aimer dupliquer le code afin qu'ils puissent le lire au lieu d'éliminer la redondance Donc, quand à Rome ...):la source