Почему после сохранения виджета в wordpress мой js код перестает работать?

Привет всем! У меня проблемка. Я создал виджет, добавил инпуты и селекты. В первом селекте я получаю сайт из мультисайта, после этого сохраняю и у меня в след селекте появляюся категории с этого сайта, выбираю категорию, после этого снова сохранение и в след. селекте посты из категории. Всё прогружается только после кнопки save соответственно. Я набросал скриптик на js, который бы сразу при change вытаскивал всё без надобности в кнопки save, чтобы сразу видеть изменения. Он работает, сохраняет с нужными данными, но как только я нажимаю save, то всё, больше скрипт не работает, как будто мой js становится недоступным, почему так происходит, кто знает ответ?

class Glenbrook_Sites_Widget1 extends WP_Widget {
	public function __construct() {
		parent::__construct(
			'glenbrook_sites_widget1',
			'Glenbrook Sites Widget 1',
			array(
				'description' => '',
				'customize_selective_refresh' => true
			)
		);

		add_action( 'widgets_init', function() {
			register_widget( 'Glenbrook_Sites_Widget1' );
		} );

		add_action( 'admin_enqueue_scripts', function() {
			wp_enqueue_script( 'scripts_admin.js', get_template_directory_uri() . '/js/scripts_admin.js', array( 'jquery' ) );
		} );
	}

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

		$site_id = $instance['site'];
		$post_id = $instance['post'];
		$post_id = remove_postfix( $post_id, '-' );

		switch_to_blog( $site_id );

		$post_data = get_post( $post_id );

		if ( ! empty( $instance['title'] ) ) {
            echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'];
        }

		$output = '<div class="widgets__widget widget widget_dark-pine-green widget_theme_index inlinefix">';
			$output .= '<p class="widget__heading"><span class="widget__important widget__important_dark-turquoise">PAYMENTS</span>' . esc_html__( $instance['title_block'], 'glenbrook' ) . '</p>';
			$output .= '<p class="widget__subtitle">' . nl2br( $post_data->post_title ) . '</p>';
			$output .= '<p class="widget__text">' . nl2br( $post_data->post_content ) . '</p>';
			$output .= '<a href="' . get_permalink( $post_data->ID ) . '" class="button button_turquoise widget__button">' . esc_html__( $instance['text_button'], 'glenbrook' ) . '</a>';
		$output .= '</div>';

		echo $output;

		restore_current_blog();

		echo $args['after_widget'];
	}

	public function form( $instance ) {
		$title_block = isset( $instance['title_block'] ) ? $instance['title_block'] : __( 'NEWS', 'glenbrook' );
		$text_button = isset( $instance['text_button'] ) ? $instance['text_button'] : __( 'Find out more', 'glenbrook' );
		$site_id = isset( $instance['site'] ) ? $instance['site'] : '';
		$category_id = isset( $instance['category'] ) ? $instance['category'] : '';
		$post_id = isset( $instance['post'] ) ? $instance['post'] : '';
		$sites = get_last_updated();
		if( ! empty( $site_id ) ) {
			switch_to_blog( $site_id );
			$categories = get_categories();
			restore_current_blog();
		}
		if( ! empty( $category_id ) ) {
			$result_posts = array();
			switch_to_blog( $site_id );
			$posts = new WP_Query( 'cat=' . $category_id );
			$i = 1;
			if ( $posts->have_posts() ) :
				while ( $posts->have_posts() ) :
					$posts->the_post();

					$post_id = get_the_ID();
					$post_id = $post_id . '-' . $site_id;

					$result_posts[ $i ]['title'] = get_the_title();

					$result_posts[ $i ]['id'] = $post_id;
					$i++;
				endwhile;
			else:
			endif;
			restore_current_blog();
		}
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title_block' ); ?>"><?php _e( 'Title Block:', 'glenbrook' ); ?></label>
			<input value="<?php echo esc_attr( $title_block ); ?>" name="<?php echo $this->get_field_name( 'title_block' ); ?>" id="<?php echo $this->get_field_id( 'title_block' ); ?>" class="widefat" type="text">
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'site' ); ?>"><?php _e( 'Site:', 'glenbrook' ); ?></label>
			<select name="<?php echo $this->get_field_name( 'site' ); ?>" id="<?php echo $this->get_field_id( 'site' ); ?>" class="widefat">
				<?php foreach( $sites as $site ): ?>
					<option <?php selected( $site['blog_id'], $site_id, true ); ?> value="<?php echo $site['blog_id']; ?>"><?php echo $site['domain']; ?></option>
				<?php endforeach; ?>
			</select>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'category' ); ?>"><?php _e( 'Category:', 'glenbrook' ); ?></label>
			<select name="<?php echo $this->get_field_name( 'category' ); ?>" id="<?php echo $this->get_field_id( 'category' ); ?>" class="widefat">
				<?php foreach( $categories as $category ): ?>
				<?php $cat_id = $category->cat_ID . '-' . $site_id; ?>
					<option <?php selected( $cat_id, $category_id, true ); ?> value="<?php echo $cat_id; ?>"><?php echo $category->name; ?></option>
				<?php endforeach; ?>
				<!-- <option value="0">Not Categories</option> -->
			</select>
		</p>
		<p>
			<?php print_r( $result ); ?>
			<label for="<?php echo $this->get_field_id( 'post' ); ?>"><?php _e( 'Post:', 'glenbrook' ); ?></label>
			<select name="<?php echo $this->get_field_name( 'post' ); ?>" id="<?php echo $this->get_field_id( 'post' ); ?>" class="widefat">
				<?php foreach( $result_posts as $current_post ): ?>
					<option <?php selected( $current_post['id'], $post_id, true ); ?> value="<?php echo $current_post['id']; ?>"><?php echo $current_post['title']; ?></option>
				<?php endforeach; ?>
				<!-- <option value="0">Not posts</option> -->
			</select>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'text_button' ); ?>"><?php _e( 'Text Button:', 'glenbrook' ); ?></label>
			<input value="<?php echo esc_attr( $text_button ); ?>" name="<?php echo $this->get_field_name( 'text_button' ); ?>" id="<?php echo $this->get_field_id( 'text_button' ); ?>" class="widefat" type="text">
		</p>
		<?php
	}
}

$glenbrook_sites_widget1 = new Glenbrook_Sites_Widget1();


$( '#widget-glenbrook_sites_widget1-2-site' ).on( 'change', function() {
		$( '#widget-glenbrook_sites_widget1-2-savewidget' ).click();
	} );

	$( '#widget-glenbrook_sites_widget1-2-category' ).on( 'change', function() {
		$( '#widget-glenbrook_sites_widget1-2-savewidget' ).click();
	} );
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
Wordpress заново загружает html-код виджета после того, как вы его сохраняете, т.е. фактически, виджет, на элементы которого вы вешали ваш JS, удаляется и заменяется новым. Для того, чтобы все работало, вам необходимо вешать "живые" события на все элементы необходимых вам идентификаторов, отталкиваясь от, например, документа.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
e_snegirev
@e_snegirev
Ну, нужен код скрипта) и виджета
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы