web-dev-qa-db-ja.com

いくつかのカスタムフィールドを持つウィジェットを作成する

私はいくつかのカスタムウィジェットを作成しようとしています。

私は一つ作成しましたが、それは違うタイトルフィールドを必要とするだけでした。しかし、私は今、私が複数のフィールドを持つことを可能にするウィジェットを作成しようとしているときに動けなくなりました。ウィジェットには以下のフィールドが必要です。

  • タイトル
  • 紹介テキスト
  • 本文
  • 電子メールアドレス

ウィジェットフォームで、ユーザーが上記のフィールドをテキストで更新できるようにします。私のサイドバーウィジェットに書いたテキストを出力したいのです。

私が作った前のウィジェット用の以下のコードを持っています(タイトル以外の追加フィールドはありません)。

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' );

これはうまくいきますが、 どうすればこれにフィールドを追加できますか?

$titleのすべてのインスタンスをコピーして再度作成しようとしましたが、$text_oneを使用しましたが、このフィールドがどのように登録されているのかわかりません。誰かが手伝ってくれる?

1
user1486133

私はあなたがウィジェットバックエンドフォームにもっとカスタムフィールドを追加したいと思います、これのためにあなたはform( $instance );関数で新しいフィールドを作成する必要があるだけです。

そのため、コードは次のようになります。

        // 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
        }

上記のコードはフォームに新しいフィールドを作成します。次に、この新しいフィールドの値をデータベースに保存/更新する必要があります。下記のコードに従ってください。

// 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