J'essaie de créer un type d'article personnalisé et j'aimerais que ce type d'article comporte deux blocs de contenu. Je peux donc demander séparément contenu-1 et contenu-2.
Je peux écrire le code en ayant juste du mal à comprendre comment je devrais commencer, c’est-à-dire, y at-il un moyen d’ajouter facilement un autre bloc de "contenu de publication"? Devrais-je supprimer le bloc de contenu existant et utiliser deux champs personnalisés (les champs personnalisés peuvent-ils contenir l'évier de cuisine?)?
Merci!
Je voudrais garder le champ de contenu principal et ajouter une metabox + une instance secondaire de l'éditeur wp (à l'aide de la fonction pratique wp_editor
).
Les valeurs de champ personnalisées sont stockées dans la base de données sous la forme LONGTEXT
, afin qu'elles puissent gérer à peu près tout ce que vous souhaitez leur envoyer.
Une classe pour tout emballer. Il y a quelques constantes ici que nous utiliserons plus tard.
<?php
class Secondary_Content
{
// meta key we'll use to save things.
const META = '_secondary_content';
// nonce name to check
const NONCE = '_s_content_nonce';
// post type to which we'll add the box
const TYPE = 'page';
private static $ins = null;
public static function init()
{
add_action('plugins_loaded', array(self::instance(), '_setup'));
}
public static function instance()
{
is_null(self::$ins) && self::$ins = new self;
return self::$ins;
}
public function _setup()
{
// we'll add actions here later.
}
}
Pour ajouter la boîte de méta, raccordez-le à add_meta_boxes_{{YOUR_POST_TYPE}}
. Je vais juste utiliser des pages pour cet exemple. Modifiez la valeur de la constante TYPE
dans la classe pour la faire fonctionner pour un type de publication personnalisé.
<?php
class Secondary_Content
{
// snip snip
public function _setup()
{
add_action('add_meta_boxes_' . self::TYPE, array($this, 'add_box'));
}
/**
* Adds a meta box to the `page` post type.
*
* @uses add_meta_box
* @return void
*/
public function add_box()
{
add_meta_box(
'secondary-content',
__('Secondary Content', 'wspe'),
array($this, 'box_cb'),
self::TYPE,
'normal',
'high'
);
}
/**
* Metabox callback function.
*
* @access public
* @param object $post The current $post
* @uses get_post_meta
* @uses wp_editor
* @return void
*/
public function box_cb($post)
{
wp_nonce_field(self::NONCE . $post->ID, self::NONCE, false);
wp_editor(
get_post_meta($post->ID, self::META, true),
self::META
);
}
}
Le rappel de la méta-boîte est également inclus ci-dessus. Il nous envoie juste un nonce à valider ainsi que le champ de l'éditeur en utilisant wp_editor
.
Maintenant, il ne reste plus qu’à accrocher save_post
et à sauver des choses. Nous allons vérifier que nous sommes sur le bon type de message. Validez ensuite le nonce et vérifiez si l’utilisateur actuel est autorisé à modifier le message. Il suffit alors d’appeler update_post_meta
ou delete_post_meta
selon le cas. La seule autre chose à noter ici est que je vérifie si l’utilisateur actuel peut publier du code HTML non filtré. S'ils le peuvent, je laisserai simplement passer tout ce qui se passe dans la boîte à méta. Si ce n'est pas le cas, il est préférable de l'exécuter via wp_filter_post_kses
.
<?php
class Secondary_Content
{
// snip snip
public function _setup()
{
add_action('add_meta_boxes_' . self::TYPE, array($this, 'add_box'));
add_action('save_post', array($this, 'save'), 10, 2);
}
// snip snip
/**
* Hooked into `save_post`. Makes sure this is the request we want and the
* user has permission, then saves the custom field.
*
* @access public
* @param int $post_id
* @param object $post
* @uses wp_verify_nonce
* @uses current_user_can
* @uses update_post_meta
* @uses delete_post_meta
* @return void
*/
public function save($post_id, $post)
{
if(
self::TYPE != $post->post_type ||
(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
) return;
if(
!isset($_POST[self::NONCE]) ||
!wp_verify_nonce($_POST[self::NONCE], self::NONCE . $post_id)
) return;
if(!current_user_can('edit_post', $post_id))
return;
if(!empty($_POST[self::META]))
{
update_post_meta(
$post_id,
self::META,
current_user_can('unfiltered_html') ?
$_POST[self::META] : wp_filter_post_kses($_POST[self::META])
);
}
else
{
delete_post_meta($post_id, self::META);
}
}
}
Pour aller chercher ceci sur le front-end, il vous suffit de faire echo get_post_meta($post->ID, '_secondary_content', true);
quelque part dans la boucle. Mais il serait peut-être plus intéressant d’inclure une fonction wrapper dans notre classe.
<?php
class Secondary_Content
{
// snip snip
/**
* Meant to be used as a template tag. A simple helper to spit out our
* secondary content.
*
* @access public
* @param object $post
* @param bool $echo (optional) defaults to true.
* @uses get_post_meta
* @return string
*/
public static function content($post, $echo=true)
{
$res = apply_filters('secondary_content',
get_post_meta($post->ID, self::META, true));
if($echo)
echo $res;
return $res;
}
}
Maintenant, vous pouvez juste faire Secondary_Content::content($post);
pour aller chercher des choses.
Une note finale: ce contenu n’aura rien d’agréable comme wpautop
ou similaire. Si vous voulez faire cela, vous devrez ajouter cela en tant que filtre à la sortie finale.
<?php
add_filter('secondary_content', 'wpautop');
Le résultat final:
Tout ce qui précède est un plugin .