web-dev-qa-db-fra.com

Comment générer un widget

J'ai le code suivant pour afficher les widgets dans le personnaliseur.

function arphabet_widgets_init() {

register_sidebar( array(
    'name'          => 'Social Media button',
    'id'            => 'smb',
) );

register_sidebar( array(
    'name'          => 'Link button',
    'id'            => 'lb',
) );

class My_Widget extends WP_Widget {

    public function __construct() {
        $widget_ops = array( 
            'classname' => 'my_widget',
            'description' => 'Adds a new Social Media button',
        );
        parent::__construct( 'my_widget', 'Social Media button', $widget_ops );
    }

public function widget( $args, $instance ) {
    echo $args['before_widget'];
    if ( ! empty( $instance['title'] ) ) {
        echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
    }
    if ( ! empty( $instance['url'] ) ) {
        echo $args['url_title'] . apply_filters( 'widget_url', $instance['url'] ) . $args['after_url'];
    }
    if ( ! empty( $instance['icon'] ) ) {
        echo $args['icon_title'] . apply_filters( 'widget_icon', $instance['icon'] ) . $args['after_icon'];
    }
    echo $args['after_widget'];
}

public function form( $instance ) {
    $title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'New title', 'text_domain' );
    $url = ! empty( $instance['url'] ) ? $instance['url'] : __( 'http://', 'text_domain' );
    $icon = ! empty( $instance['icon'] ) ? $instance['icon'] : __( 'globe', 'text_domain' );
    ?>
    <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php _e( esc_attr( 'Title: (for search engines)' ) ); ?></label> 
    <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
    </p>
    <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'url' ) ); ?>"><?php _e( esc_attr( 'URL:' ) ); ?></label> 
    <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'url' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'url' ) ); ?>" type="text" value="<?php echo esc_attr( $url ); ?>">
    </p>
    <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'icon' ) ); ?>"><?php _e( esc_attr( 'Icon:' ) ); ?></label> 
    <input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'icon' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'icon' ) ); ?>" type="text" value="<?php echo esc_attr( $icon ); ?>">
    </p>
    <?php 
}

public function update( $new_instance, $old_instance ) {
    $instance = array();
    $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
    $instance['url'] = ( ! empty( $new_instance['url'] ) ) ? strip_tags( $new_instance['url'] ) : '';
    $instance['icon'] = ( ! empty( $new_instance['icon'] ) ) ? strip_tags( $new_instance['icon'] ) : '';

    return $instance;
}
}

    dynamic_sidebar( 'smb' );
    dynamic_sidebar( 'lb' );

    register_widget( 'My_Widget' );
}

add_action( 'widgets_init', 'arphabet_widgets_init' );

Cela fonctionne, mais je ne sais pas comment les afficher. C'est ce que j'ai essayé:

     <?php if ( is_active_sidebar( 'smb' ) ) { ?>
        <h1><?php dynamic_sidebar( 'smb' ); ?></h1>
    <?php } ?>

mais cela sort le widget entier. Je souhaite sortir un champ spécifique, tel que le titre ou l'URL.

Je veux qu'il soit sorti comme ça:

<li><a href="[URL]" class="fa fa-[ICON]">[TITLE]</a></li>

1
J. Doe

Regardez ceci, cela peut vous guider dans la direction dont vous avez besoin:

Premier:

register_sidebar( array(
    'name'          => 'Social Media button',
    'id'            => 'smb',
    'before_widget' => '<li>',
    'after_widget'  => '</li>',
) );

Deuxième code:

public function widget( $args, $instance ) {
    $output = $args['before_widget'];

    $output .= '<a href="' . $instance['url'] . '"  class="fa fa-' . 
        $args['icon_title'] . '">' . $instance['title'] . '</a>';
    $output .= $args['after_widget'];

    echo $output; // <li><a href="[URL]" class="fa fa-[ICON]">[TITLE]</a></li> 
}

Le résultat de ces modifications sera:

<h1><li><a href="http://url.com" class="fa fa-">New title</a></li><li><h2 class="widgettitle">test1</h2>
        <div class="textwidget">test2</div>
</li></h1>

Et cela ne se fera que dans la barre sociale.

1
Kim Vinberg