Метод widget() не может получить доступ к переменной $instance WordPress

Я следовал руководству по созданию плагина WordPress, который показывает подкнопку YouTube на вашей странице.

В гайде работает отлично, а у меня почему-то не работает.

Это моя проблема: когда я var_dump($instance) в widget(), он выводит пустой массив, но когда я пытаюсь print_r($instance) внутри моей формы(), он выводит правильную информацию

Вот файл виджета:

<?php
/**
 * Adds Youtube_Subs widget.
 */
class Youtube_Subs_Widget extends WP_Widget {

/**
 * Register widget with WordPress.
 */
function __construct() {
  parent::__construct(
    'youtubesubs_widget', // Base ID
    esc_html__( 'YouTube Subs', 'mp_domain' ), // Name
    array( 'description' => esc_html__( 'Widget to display YouTube subs', 'mp_domain' ), ) // Args
  );
}

/**
 * Front-end display of widget.
 *
 * @see WP_Widget::widget()
 *
 * @param array $args     Widget arguments.
 * @param array $instance Saved values from database.
 */
public function widget( $args, $instance ) {
  echo $args['before_widget']; // Whatever you want to display before widget (<div>, etc)
  if ( ! empty( $instance['title'] ) ) {
    echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
  }

  // Widget Content Output
  var_dump($instance);
  // echo '<div class="g-ytsubscribe" data-channel="'.$instance['channel'].'" data-layout="'.$instance['layout'].'" data-count="'.$instance['count'].'"></div>';

  echo $args['after_widget']; // Whatever you want to display after widget (</div>, etc)
}

/**
 * Back-end widget form.
 *
 * @see WP_Widget::form()
 *
 * @param array $instance Previously saved values from database.
 */
public function form( $instance ) {
  $title = (! empty( $instance['title'] ) ? $instance['title'] : esc_attr( 'YouTube Subs', 'mp_domain' )); 
  
  $channel = (! empty( $instance['channel'] ) ? $instance['channel'] : esc_attr( 'techguyweb', 'mp_domain' )); 

  $layout = (! empty( $instance['layout'] ) ? $instance['layout'] : esc_attr( 'default', 'mp_domain' )); 

  $count = (! empty( $instance['count'] ) ? $instance['count'] : esc_attr( 'default', 'mp_domain' )); 

  ?>
  
  <!-- TITLE -->
  <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>">
      <?php esc_attr_e( 'Title:', 'mp_domain' ); ?>
    </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>

  <!-- CHANNEL -->
  <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'channel' ) ); ?>">
      <?php esc_attr_e( 'Channel:', 'mp_domain' ); ?>
    </label> 

    <input 
      class="widefat" 
      id="<?php echo esc_attr( $this->get_field_id( 'channel' ) ); ?>" 
      name="<?php echo esc_attr( $this->get_field_name( 'channel' ) ); ?>" 
      type="text" 
      value="<?php echo esc_attr( $channel ); ?>">
  </p>

  <!-- LAYOUT -->
  <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'layout' ) ); ?>">
      <?php esc_attr_e( 'Layout:', 'mp_domain' ); ?>
    </label> 

    <select 
      class="widefat" 
      id="<?php echo esc_attr( $this->get_field_id( 'layout' ) ); ?>" 
      name="<?php echo esc_attr( $this->get_field_name( 'layout' ) ); ?>">
      <option value="default" <?php echo ($layout == 'default') ? 'selected' : ''; ?>>
        Default
      </option>
      <option value="full" <?php echo ($layout == 'full') ? 'selected' : ''; ?>>
        Full
      </option>
    </select>
  </p>

  <!-- COUNT -->
  <p>
    <label for="<?php echo esc_attr( $this->get_field_id( 'count' ) ); ?>">
      <?php esc_attr_e( 'Count:', 'mp_domain' ); ?>
    </label> 

    <select 
      class="widefat" 
      id="<?php echo esc_attr( $this->get_field_id( 'count' ) ); ?>" 
      name="<?php echo esc_attr( $this->get_field_name( 'count' ) ); ?>">
      <option value="default" <?php echo ($count == 'default') ? 'selected' : ''; ?>>
        Default
      </option>
      <option value="hidden" <?php echo ($count == 'hidden') ? 'selected' : ''; ?>>
        Hidden
      </option>
    </select>
  </p>
  <?php 

  print_r($instance);
}

/**
 * Sanitize widget form values as they are saved.
 *
 * @see WP_Widget::update()
 *
 * @param array $new_instance Values just sent to be saved.
 * @param array $old_instance Previously saved values from database.
 *
 * @return array Updated safe values to be saved.
 */
public function update( $new_instance, $old_instance ) {
  $instance = $old_instance;

  $instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';

  $instance['channel'] = ( ! empty( $new_instance['channel'] ) ) ? strip_tags( $new_instance['channel'] ) : '';

  $instance['layout'] = ( ! empty( $new_instance['layout'] ) ) ? strip_tags( $new_instance['layout'] ) : '';

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

У меня это связано с моим файлом плагина, в котором я регистрирую виджет:

// Register Widget
 function register_myplugin() {
     register_widget('Youtube_Subs_Widget');
 }

 // Hook in function
 add_action('widgets_init', 'register_myplugin');

Я надеюсь, что кто-то знает, что не так, и может помочь мне исправить мою ошибку, заранее спасибо


person Glaxer    schedule 20.12.2020    source источник


Ответы (1)


Я попытался переустановить файл WordPress, и после этого он сработал.

person Glaxer    schedule 21.12.2020