I’m trying to include a checkbox in my widget back end. But I cannot get the value (on or off) after the user submits it. I thought the value would be stored in “esc_attr( $check )” (as it is when using a text input), but I cannot retrieve it.
This is what I’m trying now:
public function form( $instance ) {
$check = isset( $instance[ 'check' ] ) ? $instance[ 'check' ] : 'off';
echo esc_attr( $check ); // If the input is type text it outputs the value
?>
<input class="widefat" id="<?php echo $this->get_field_id( 'check' ); ?>" name="<?php echo $this->get_field_name( 'check' ); ?>" type="checkbox" />
<?php
}
How can I get this to work? Also how do I get the value of the checkbox in the front end?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
First, on function widget:
function widget( $args, $instance ) {
extract( $args );
// Add this line
$your_checkbox_var = $instance[ 'your_checkbox_var' ] ? 'true' : 'false';
// Change 'your_checkbox_var' for your custom ID
// ...
}
On function update:
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
// Add this line
$instance[ 'your_checkbox_var' ] = $new_instance[ 'your_checkbox_var' ];
// Change 'your_checkbox_var' for your custom ID
// ...
return $instance;
}
Finally, on function form, add this:
<p>
<input class="checkbox" type="checkbox" <?php checked( $instance[ 'your_checkbox_var' ], 'on' ); ?> id="<?php echo $this->get_field_id( 'your_checkbox_var' ); ?>" name="<?php echo $this->get_field_name( 'your_checkbox_var' ); ?>" />
<label for="<?php echo $this->get_field_id( 'your_checkbox_var' ); ?>">Label of your checkbox variable</label>
</p>
<!-- Remember to change 'your_checkbox_var' for your custom ID, as well -->
EDIT:
Let’s see the full code of an ‘About Us’ widget using a checkbox to show/hide an avatar image:
class about_us extends WP_Widget {
function about_us() {
$widget_ops = array( 'classname' => 'about_us', 'description' => __( 'About Us', 'wptheme' ) );
$this->WP_Widget( 'about_us', __( 'About Us', 'wptheme' ), $widget_ops, $control_ops );
}
function widget( $args, $instance ) {
extract( $args );
$title = apply_filters( 'widget_title', $instance[ 'title' ] );
$text = $instance[ 'text' ];
// The following variable is for a checkbox option type
$avatar = $instance[ 'avatar' ] ? 'true' : 'false';
echo $before_widget;
if ( $title ) {
echo $before_title . $title . $after_title;
}
// Retrieve the checkbox
if( 'on' == $instance[ 'avatar' ] ) : ?>
<div class="about-us-avatar">
<?php echo get_avatar( get_the_author_meta( 'user_email' ), '50', '' ); ?>
</div>
<?php endif; ?>
<div class="textwidget">
<p><?php echo esc_attr( $text ); ?></p>
</div>
<?php
echo $after_widget;
}
function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance[ 'title' ] = strip_tags( $new_instance[ 'title' ] );
$instance[ 'text' ] = strip_tags( $new_instance[ 'text' ] );
// The update for the variable of the checkbox
$instance[ 'avatar' ] = $new_instance[ 'avatar' ];
return $instance;
}
function form( $instance ) {
$defaults = array( 'title' => __( 'About Us', 'wptheme' ), 'avatar' => 'off' );
$instance = wp_parse_args( ( array ) $instance, $defaults ); ?>
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>">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( $instance[ 'title' ] ); ?>" />
</p>
<!-- The checkbox -->
<p>
<input class="checkbox" type="checkbox" <?php checked( $instance[ 'avatar' ], 'on' ); ?> id="<?php echo $this->get_field_id( 'avatar' ); ?>" name="<?php echo $this->get_field_name( 'avatar' ); ?>" />
<label for="<?php echo $this->get_field_id( 'avatar' ); ?>">Show avatar</label>
</p>
<p>
<label for="<?php echo $this->get_field_id( 'text' ); ?>">About Us</label>
<textarea class="widefat" id="<?php echo $this->get_field_id( 'text' ); ?>" rows="10" cols="10" name="<?php echo $this->get_field_name( 'text' ); ?>"><?php echo esc_attr( $instance[ 'text' ] ); ?></textarea>
</p>
<?php
}
}
register_widget( 'about_us' );
Tested and working.
Edit (2015-Sept-08): Important! That widget example uses PHP4 style constructors, however WordPress 4.3 switches to PHP5, so you should switch the constructors, too. More information, here.
If you use the plugin ‘theme-check’ you will see a notice suggesting you to use __construct() instead of WP_Widget. Remove the first function and add the following one:
function __construct() {
parent::__construct(
'about_us', // Base ID
__( 'About US', 'wptheme' ), // Name
array( 'description' => __( 'About Us', 'wptheme' ), ) // Args
);
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0