Créer des champs avec CarbonFields

Voir la vidéo
Description Sommaire

CarbonFields est une bibliothèque open-source pour WordPress qui permet de créer des champs personnalisés pour les différents type de contenu de WordPress (Option du thème, contenu, taxonomie, élément de menu...) à l'aide de méthodes simples qui permettent de grandement simplifier le code nécessaire.

Installation

La librairie peut être chargée via composer

composer require htmlburger/carbon-fields

Ou en le téléchargeant sous forme de plugin et en mettant le contenu de l'archive dans le dossier plugin. Ensuite, vous pouvez charger CarbonField dans votre fichier functions.php.

use Carbon_Fields\Container;
use Carbon_Fields\Field;

add_action( 'carbon_fields_register_fields', 'crb_attach_theme_options' );
function crb_attach_theme_options() {
    // Exemple de code pour créer un champs d'option
    Container::make( 'theme_options', __( 'Theme Options' ) )
        ->add_fields( array(
            Field::make( 'text', 'crb_text', 'Text Field' ),
        ) );
}

// Si vous utilisez la version "plugin", vous pouvez supprimer cette partie
add_action( 'after_setup_theme', 'crb_load' );
function crb_load() {
    require_once( 'vendor/autoload.php' );
    \Carbon_Fields\Carbon_Fields::boot();
}

Utilisation

Une fois installé et initialisé vous pouvez utiliser les différentes classes offertes par CarbonFields pour générer vos champs.

  • La classe Carbon_Fields\Container permet de définir un groupe de champs. C'est cette classe qui permettra de définir où on veut afficher nos champs (`post_meta', 'theme_options', 'user_meta'...)
  • La classe Carbon_Fields\Field permet de définir un champ.

Voici quelques exemples :

use \Carbon_Fields\Container;
use \Carbon_Fields\Field;

// Crée une nouvelle entrée dans le menu de l'admin WordPress
Container::make('theme_options', 'Option du theme')
   ->add_tab('Pied de page', [
        Field::make('text', 'facebook_url', 'URL Facebook'),
        Field::make('text', 'twitter_url', 'URL Twitter'),
        Field::make('text', 'youtube_url', 'URL Youtube'),
   ])
   ->add_tab('Apparence', [
       Field::make('color', 'bg_color', 'Couleur de fond'),
   ]);

// Ajoute des champs à un type de contenu particulier
Container::make('post_meta', 'Information sur le bien')
   ->where('post_type', '=', 'property')
   ->add_fields([
       Field::make("select", "property_category", "Achat ou location ?")
           ->set_default_value('rent')
            ->set_options([
                'rent' => 'Location',
                'buy' => 'Achat'
            ]),
       Field::make("text", "surface", "Surface")
            ->set_attribute('type', 'number'),
       // Un champs complex permet de créer un répéteur
       Field::make('complex', 'property_options', 'Options')
            ->add_fields([
                Field::make('text', 'name', 'Nom de l\'option'),
                Field::make('checkbox', 'available', 'Disponible ?')
            ])
            ->set_layout('tabbed-vertical')
            ->set_header_template('<%- name %> <%- available ? "✅" : "❌" %>')
   ]);

Si vous voulez plus d'exemples n'hésitez pas à faire un tour sur la documentation de CarbonFields.

Bloc gutenberg

Vous pouvez aussi créer des blocs gutenberg depuis CarbonFields :

use \Carbon_Fields\Block;
use \Carbon_Fields\Container;

Block::make('Mon nouveau bloc')
    ->add_fields([
        Field::make( 'text', 'heading', 'En tête'),
        Field::make( 'image', 'image', 'Image'),
        Field::make( 'rich_text', 'content', 'Contenu'),
    ])
    ->set_render_callback( function ($fields, $attributes, $inner_blocks) {
        ?>
        <div class="block">
            <div class="block__heading">
                <h1><?= esc_html( $fields['heading'] ); ?></h1>
            </div>

            <div class="block__image">
                <?= wp_get_attachment_image( $fields['image'], 'full' ); ?>
            </div>

            <div class="block__content">
                <?= apply_filters( 'the_content', $fields['content'] ); ?>
            </div>
        </div>
        <?php
    });

Champ personnalisé

Si vous ne trouvez pas votre bonheur dans les champs préconçus. Vous pouvez étendre CarbonFields pour créer votre propre champs.

On commence par créer une classe (nommé XXX_Field) qui contiendra la logique de notre champs.

use \Carbon_Fields\Field\Field;
use \Carbon_Fields\Value_Set\Value_Set;

class Demo_Field extends Field {

    public function __construct($type, $name, $label){
        // Dans le cas d'un champs composé de plusieurs propriétés, on déclare le type et la valeur par défaut
        $this->set_value_set(new Value_Set(Value_Set::TYPE_MULTIPLE_PROPERTIES, ['firstname' => '', 'lastname' => '']));
        parent::__construct($type, $name, $label);
    }

    // Charge le JavaScript nécessaire à l'enregistrement de l'interface du champs
    public static function admin_enqueue_scripts()
    {
        // Adaptez le chemin en fonction de votre situation
        $rootUrl = \Carbon_Fields\Carbon_Fields::directory_to_url(dirname(__FILE__));
        wp_enqueue_script('carbon-field-demo', $rootUrl . '/demo.js', ['carbon-fields-core']);
    }

}

Côté JS il faudra créer un composant React pour rendre l'interface.

// cf.vendor contient les dépendances nécessaires
// On importe la fonction de rendu react provenant de WordPress
const h = cf.vendor['@wordpress/element'].createElement;

// Le nom du champs est en minuscule et sans le _Field.
window.cf.core.registerFieldType('demo', function ({id, value, name}) {
    // On peut écrire du JSX si on a l'outils pour le convertir en JavaScript
    return h('div', {}, [
        h('input', {id, defaultValue: value.firstname, name: `${name}[firstname]`}),
        h('input', {id, defaultValue: value.lastname, name: `${name}[lastname]`})
    ])
})

Ensuite on va enregistrer notre champs.

\Carbon_Fields\Carbon_Fields::extend(Demo_Field::class, function ($container) {
    return new Demo_Field(
        $container['arguments']['type'],
        $container['arguments']['name'],
        $container['arguments']['label'],
    );
});

Et on pourra l'utiliser dans nos différents Container.

// Le nom du champs est en minuscule et sans le _Field.
Field::make('demo', 'property_demo', 'Champs de démonstration')
Publié
Technologies utilisées
Auteur :
Grafikart
Partager