web-dev-qa-db-fra.com

Création d'un widget avec un certain nombre de champs personnalisés

J'essaie de créer des widgets personnalisés.

J'en ai créé un qui ne nécessitait qu'un autre champ de titre. Cependant, je suis maintenant bloqué lorsque je tente de créer un widget qui me permet d’avoir plusieurs champs. J'ai besoin des champs suivants pour le widget:

  • Titre
  • Texte d'introduction
  • Texte principal
  • Adresse électronique

Je veux que le formulaire de widget permette à l'utilisateur de mettre à jour les champs ci-dessus avec du texte. Je veux ensuite sortir le texte qu'ils ont écrit dans mon widget barre latérale.

J'ai le code suivant qui est pour le widget précédent que j'ai créé (sans champs supplémentaires à part le titre)

class registercv_widget extends WP_Widget {

        function __construct() {
            parent::__construct(
                'registercv_widget',
                __('Register CV Widget', 'registercv_widget_domain'),
                array( 'description' => __( 'Provides a "Register CV" button which launches a pop-up', 'registercv_widget_domain' ), )
            );
        }

        public function widget( $args, $instance ) {
            $title = apply_filters( 'widget_title', $instance['title'] );
            echo $args['before_widget'];
            echo '<div class="widget-wrapper">';
            if ( ! empty( $title ) )
                echo $args['before_title'] . $title . $args['after_title'];

    // This is where you run the code and display the output
            echo __( '<div class="register-button"><span><div class="button white">Send your CV</div></span></div>', 'registercv_widget_domain' );
            echo '</div>';
            echo $args['after_widget'];
        }

    // Widget Backend
        public function form( $instance ) {
            if ( isset( $instance[ 'title' ] ) ) {
                $title = $instance[ 'title' ];
            }
            else {
                $title = __( 'Register as a candidate', 'registercv_widget_domain' );
            }
    // Widget admin form
            ?>
            <p>
                <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
            </p>
        <?php
        }

    // Updating widget replacing old instances with new
        public function update( $new_instance, $old_instance ) {
            $instance = array();
            $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
            return $instance;
        }
    }

    function registercv_load_widget() {
        register_widget( 'registercv_widget' );
    }
    add_action( 'widgets_init', 'registercv_load_widget' );

Cela fonctionne bien mais comment puis-je ajouter des champs supplémentaires à cela?

J'ai tenté de copier toutes les instances de $title et de les refaire mais avec $text_one mais je ne comprends pas comment ce champ est enregistré. Quelqu'un peut aider?

1
user1486133

Je suppose que vous voulez ajouter plus de champs personnalisés dans le formulaire d’arrière-plan du widget. Pour cela, il vous suffit de créer un nouveau champ dans la fonction form( $instance );.

Donc, le code ressemblera à

        // Widget Backend
        public function form( $instance ) {
            if ( isset( $instance[ 'title' ] ) ) {
                $title = $instance[ 'title' ];
            }
            else {
                $title = __( 'Register as a candidate', 'registercv_widget_domain' );
            }

            if ( isset( $instance[ 'name' ] ) ) {
                $name = $instance[ 'name' ];
            }
            else {
                $name = __( 'Enter your name', 'registercv_widget_domain' );
            }

            // Widget admin form
            ?>
            <p>
                <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
            </p>

             <p>
                <label for="<?php echo $this->get_field_id( 'name' ); ?>"><?php _e( 'Name:' ); ?></label>
                <input class="widefat" id="<?php echo $this->get_field_id( 'name' ); ?>" name="<?php echo $this->get_field_name( 'name' ); ?>" type="text" value="<?php echo esc_attr( $name ); ?>" />
            </p>
        <?php
        }

Le code ci-dessus va créer un nouveau champ dans le formulaire. Ensuite, nous devrons sauvegarder/mettre à jour la valeur de ce nouveau champ dans la base de données, suivez le code ci-dessous:

// Updating widget replacing old instances with new
    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';

        $instance['name'] = ( ! empty( $new_instance['name'] ) ) ? strip_tags( $new_instance['name'] ) : '';
        return $instance;
    }
1
WisdmLabs