Как использовать jQuery UI в моем плагине WordPress

28 апр. 2013 г., 03:21:59
Просмотры: 14.4K
Голосов: 10

Печальный день, когда я ищу что-то в Google и не нахожу ответов. Я пытаюсь использовать стандартный datepicker (или ЛЮБОЙ datepicker на данный момент) и не могу этого сделать из-за недостатка знаний в WordPress/PHP. В своем плагине я пытаюсь зарегистрировать jQuery и UI, но в процессе ломаю другие части WordPress. Может кто-нибудь сказать, что я делаю не так? Если у кого-то есть рабочее решение, я готов выбросить весь свой код:

add_action('init', 'add_styles');

function add_styles(){
    wp_deregister_style('simpleschoolstyles');
    wp_register_style('simpleschoolstyles', SSM_STYLEFILE);

    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js');

    wp_deregister_script( 'jquery-ui' );
    wp_register_script('jquery-ui', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js');

    wp_deregister_style( 'jquery-ui' );
    wp_register_style( 'jquery-ui', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/pepper-grinder/jquery-ui.min.css' );

    wp_deregister_script('maskedinput');
    wp_register_script('maskedinput', SSM_PLUGIN_URL . '/includes/js/jquery.maskedinput.min.js');

    wp_deregister_script('simpleschool');
    wp_register_script('simpleschool', SSM_PLUGIN_URL . '/includes/js/simpleschool.js');
}

add_action('wp_enqueue_scripts', 'load_scripts');
add_action('admin_enqueue_scripts', 'load_scripts');

function load_scripts()
{
    wp_enqueue_style('jquery-ui');    
    wp_enqueue_style('simpleschoolstyles');
    wp_enqueue_script('jquery');       
    wp_enqueue_script('jquery-ui');
    wp_enqueue_script('maskedinput');
    wp_enqueue_script('simpleschool');
}

Мне нужно, чтобы jQuery был доступен как в административной части, так и на фронтенде для ввода данных пользователем. Пожалуйста, помогите. Я уже почти вырвал все волосы и готов взяться за ногти на ногах... Полагаю, я подключаю скрипты не в тот момент, но из-за ограниченного знания WordPress быстро закопал себя.

ОБНОВЛЕНИЕ: Я изменил свой скрипт и теперь подгружаю только jQuery UI. Проверил, что jQuery и UI загружаются успешно, но не работают с существующим объектом в DOM:

add_action('init', 'init_scripts');

function init_scripts(){
    wp_deregister_style('simpleschoolstyles');
    wp_register_style('simpleschoolstyles', SSM_STYLEFILE);

    //wp_deregister_script( 'jquery-ui' );
    wp_register_script('jquery-ui', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js');

    //wp_deregister_style( 'jquery-ui' );
    wp_register_style( 'jquery-ui-pepper-grinder', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/pepper-grinder/jquery-ui.min.css' );

    //wp_deregister_script('maskedinput');
    wp_register_script('maskedinput', SSM_PLUGIN_URL . '/includes/js/jquery.maskedinput.min.js');

    //wp_deregister_script('simpleschool');
    wp_register_script('simpleschool', SSM_PLUGIN_URL . '/includes/js/simpleschool.js');

    wp_enqueue_style('jquery-ui-pepper-grinder');
    wp_enqueue_style('simpleschoolstles');
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'jquery-ui' );
    wp_enqueue_script('simpleschool');
}

Мой тест:

jQuery(document).ready(function(){
    //jQuery('.datepick').mask("99/99/9999");
    //jQuery('.phone').mask("(999) 999-9999");
    jQuery( '.datepick' ).datepicker( 'option', 'dateFormat', 'yyyy-mm-dd' ); // <-- это не работает ????
    alert('jQuery ДОЛЖЕН БЫТЬ ПОДКЛЮЧЕН!!!'); // <--- это сработало
    jQuery('<div>безумный wordpress и их php</div>').dialog(); // <--- это тоже сработало
});
4
Комментарии

Отключение встроенных библиотек, таких как jQuery, вероятно, является корнем всех проблем. Они работают не так, как те, что загружаются с ajax.googleapis.com.

fuxia fuxia
28 апр. 2013 г. 03:25:18

Тогда как использовать jQuery UI Datepicker?

clockwiseq clockwiseq
28 апр. 2013 г. 03:31:07

Вы можете использовать его, просто подключив в своём плагине с помощью wp_enqueue_script( 'jquery-ui' );

Vinod Dalvi Vinod Dalvi
28 апр. 2013 г. 04:26:23

Какое действие следует использовать для подключения скриптов?

clockwiseq clockwiseq
28 апр. 2013 г. 05:40:56
Все ответы на вопрос 3
2

Учитывая, что все необходимые библиотеки для работы datepicker включены в состав WordPress и зарегистрированы со всеми необходимыми зависимостями, всё что вам нужно сделать:

function enqueue_my_scripts_wpse_97533() {
  wp_enqueue_script('jquery-ui-datepicker');
}
add_action('wp_enqueue_scripts','enqueue_my_scripts_wpse_97533');

Если затем посмотреть исходный код страницы, вы увидите, что jQuery, jQuery-UI и jQuery-UI-Datepicker будут загружены.

Конечно, вам нужно будет загружать другие скрипты самостоятельно примерно так же, как вы уже делаете, но следует регистрировать их с указанием зависимостей – третий параметр.

wp_register_script( $handle, $src, $deps, $ver, $in_footer ); 

Например...

wp_register_script(
    'maskedinput',
    SSM_PLUGIN_URL.'/includes/js/jquery.maskedinput.min.js',
    array('jquery')
);

Таким образом, вы можете загрузить его с помощью...

function enqueue_my_scripts_wpse_97533_v2() {
  wp_enqueue_script('maskedinput');
}
add_action('wp_enqueue_scripts','enqueue_my_scripts_wpse_97533_v2');

...и быть уверенными, что зависимости (jQuery) также будут загружены.

28 апр. 2013 г. 04:30:42
Комментарии

отличный ответ! один вопрос, в каком событии мне нужно это делать? мне нужно это и в админке, и на фронтенде.

clockwiseq clockwiseq
28 апр. 2013 г. 05:25:13

То, что я написал — wp_enqueue_scripts — будет загружаться везде на фронтенде, кроме страницы входа. Но лучше загружать скрипты только на тех страницах, где они нужны, так что вы можете изменить колбэк, чтобы он был более специфичным. Для админки используйте admin_enqueue_scripts, но опять же, загружать их стоит только там, где они нужны. В админке есть несколько хуков для конкретных страниц. Я не могу сказать, какие именно вам нужны, не зная, где требуются скрипты.

s_ha_dum s_ha_dum
28 апр. 2013 г. 06:59:46
0

В дополнение к отличному ответу @s_ha_dum, вот пример, показывающий, как использовать встроенный jQuery UI date picker на странице вашего плагина.

Результат будет выглядеть так:

Пример выбора даты с помощью jQuery UI Datepicker

Самые важные моменты:

  • Используйте слаг вашей страницы настроек для подключения скриптов и стилей только на вашей странице, а не на всех страницах админки (подробнее).
  • Убедитесь, что установили datepicker({ dateFormat: "yy-mm-dd" }), чтобы знать, что ожидать в обработчике обратного вызова.
  • В WordPress нет встроенного стиля для выбора даты, поэтому вам нужно подключить отдельную таблицу стилей. Но есть также отличный демонстрационный плагин от @helenhousandi с CSS, который хорошо сочетается с основными стилями.

Сначала я создал базовый класс, чтобы иметь что-то, что можно использовать и в других ответах, а также чтобы оставить фактический код для скрипта выбора даты простым и специфичным.

Базовый класс Wpse_Plugin_Options_Page

/**
 *
 * Мы не используем здесь так называемый Settings API, потому что он слишком
 * сложный.
 * Вместо этого используется admin-post.php: просто, чистая разметка, работает.
 */
class Wpse_Plugin_Options_Page
{
    protected static $instance = NULL;
    protected $slug      = '';
    protected $menu_slug = 'wpse_demo';
    protected $option    = 'wpse_option';
    protected $title     = 'WPSE Demo';
    protected $styles    = array();
    protected $scripts   = array();

    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    public function wp_loaded()
    {
        add_action(
            "admin_post_update_$this->option",
            array ( $this, 'admin_post' )
        );
        add_action(
            'admin_menu',
            array ( $this, 'admin_menu' )
        );
    }

    public function admin_menu()
    {
        $slug = add_options_page(
            $this->title,                       // заголовок страницы
            $this->title,                       // заголовок меню
            'manage_options',                   // права доступа
            $this->menu_slug,                   // слаг меню
            array ( $this, 'render_page_base' ) // функция обратного вызова
        );

        $this->slug = $slug;

        add_action( "admin_print_styles-$slug",  array ( $this, 'enqueue_style' ) );
        add_action( "admin_print_scripts-$slug", array ( $this, 'enqueue_script' ) );
        add_action( "page_content_$slug",        array ( $this, 'render_page_content' ) );
    }

    public function render_page_base()
    {
        $this->print_message();

        printf(
            '<div class="wrap"><h2>%1$s</h2><form method="post" action="%2$s">',
            $GLOBALS['title'],
            admin_url( 'admin-post.php' )
        );

        printf(
            '<input type="hidden" name="action" value="%s"/>',
            "update_$this->option"
        );
        wp_nonce_field( "update_$this->option" );

        do_action( 'page_content_' . $this->slug );

        print '</form></div>';
    }

    protected function print_message()
    {
        if ( ! isset ( $_GET['msg'] ) )
            return;

        $text = $this->get_message_text( $_GET['msg'] );

        if ( ! $text )
            return;

        print "<div id='message' class='updated fade'><p>$text</p></div>";
    }

    protected function get_message_text( $id )
    {
        $messages = $this->get_messages();

        if ( isset ( $messages[ $id ] ) )
            return $messages[ $id ];

        return FALSE;
    }

    protected function get_messages()
    {
        return array();
    }

    public function render_page_content()
    {
        echo $this->slug;
    }

    public function enqueue_style()
    {
        foreach ( $this->styles as $style )
            wp_enqueue_style( $style );

        do_action( 'base_styles_loaded_' . $this->slug );
    }

    public function enqueue_script()
    {
        foreach ( $this->scripts as $script )
            wp_enqueue_script( $script );

        do_action( 'base_scripts_loaded_' . $this->slug );
    }

    public function admin_post()
    {
        if ( ! check_admin_referer( "update_$this->option" ) )
            die( 'нет' );

        if ( ! isset ( $_POST[ $this->option ] ) )
            die( 'что-то отсутствует' );

        $msg = $this->save_option( $_POST[ $this->option ] );

        $url = add_query_arg( 'msg', $msg, $_POST[ '_wp_http_referer' ] );

        wp_safe_redirect( $url, 303 );
        exit;
    }

    protected function save_option( $data )
    {
        return (bool) update_option( $this->option, $data );
    }
}

Теперь нам нужно переопределить только самые важные части. Красиво и коротко.

Специальный класс Wpse_Datepicker_Example

class Wpse_Datepicker_Example extends Wpse_Plugin_Options_Page
{
    protected $title     = 'jQuery Date Picker';
    protected $menu_slug = 'wpse_datepicker';
    protected $option    = 'wpse_datepicker';
    protected $scripts   = array ( 'jquery-ui-datepicker' );

    // не наследуется
    public static function get_instance()
    {
        NULL === self::$instance and self::$instance = new self;
        return self::$instance;
    }

    public function render_page_content()
    {
        $value = esc_attr( get_option( $this->option ) );
        printf(
            '<p style="margin:100px auto;width:30em"><label for="%1$s">Выберите дату
                <input type="text" id="%1$s" name="%2$s" value="%3$s" />
            </label> %4$s</p>',
            'datepicker',
            $this->option,
            $value,
            get_submit_button( 'Сохранить', 'primary', 'submit', FALSE )
        );

        add_action(
            "admin_footer-$this->slug",
            array ( $this, 'print_footer_script' )
        );
    }

    public function enqueue_style()
    {
        wp_register_style(
            'jquery-ui-datepicker',
            'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/themes/pepper-grinder/jquery-ui.min.css'
        );
        wp_enqueue_style( 'jquery-ui-datepicker' );
    }

    public function print_footer_script()
    {
        ?>
<script>
jQuery( "#datepicker" ).datepicker({ dateFormat: "yy-mm-dd" });
</script>
        <?php
    }

    protected function get_messages()
    {
        return array (
            1 => 'Дата сохранена.'
        );
    }
}

Здесь еще много возможностей для улучшений, но для начала это должно быть полезным.

28 апр. 2013 г. 08:33:14
0

Существует несколько способов подключения jQuery в тему. Я всегда использую встроенную в WordPress версию, так как считаю это самым простым вариантом. Для правильной настройки необходимо убедиться, что на странице WordPress будут загружены следующие файлы. Чтобы загрузить указанные скрипты и стили, добавьте следующий код в файл functions.php вашей темы.

Скрипт для фронтенда

function add_e2_date_picker(){
//Файл jQuery UI date picker
wp_enqueue_script('jquery-ui-datepicker');
//CSS-файл темы jQuery UI
wp_enqueue_style('e2b-admin-ui-css','http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.0/themes/base/jquery-ui.css',false,"1.9.0",false);
}
add_action('wp_enqueue_scripts', 'add_e2_date_picker'); 

Скрипт для бэкенда

function add_e2_date_picker(){
//Файл jQuery UI date picker
wp_enqueue_script('jquery-ui-datepicker');
//CSS-файл темы jQuery UI
wp_enqueue_style('e2b-admin-ui-css','http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.0/themes/base/jquery-ui.css',false,"1.9.0",false);
}
add_action('admin_enqueue_scripts', 'add_e2_date_picker'); 

Мы можем написать функцию, которая будет подключена только для определенных страниц, таких как single.php, page или страница плагина. Я добавил (захукал) на 'options-general.php' для отображения в Настройки->Date Picker. Просто добавьте этот код также в файл functions.php или ниже предыдущего кода.

function register_datepiker_submenu() {
    add_submenu_page( 'options-general.php', 'Date Picker', 'Date Picker', 'manage_options', 'date-picker', 'datepiker_submenu_callback' );
}

function datepiker_submenu_callback() { ?>

    <div class="wrap">

    <input type="text" class="datepicker" name="datepicker" value=""/>

    </div>

    <script>
    jQuery(function() {
        jQuery( ".datepicker" ).datepicker({
            dateFormat : "dd-mm-yy"
        });
    });
    </script> 

<?php }
add_action('admin_menu', 'register_datepiker_submenu');

?>

После добавления этого кода вы получите date picker в разделе Меню админки->Настройки->Date Picker. Если вам нужна помощь по настройке, задавайте вопросы в комментариях к статье Добавление jQuery DatePicker в тему WordPress или плагин.

8 мар. 2016 г. 14:24:32