web-dev-qa-db-fra.com

Bloc de contenu multiple

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!

2
Omar Mir

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:

Secondary Content

Tout ce qui précède est un plugin .

6
chrisguitarguy