Cum Pot Folosi jQuery UI În Plugin-ul Meu

28 apr. 2013, 03:21:59
Vizualizări: 14.4K
Voturi: 10

Este o zi tristă când caut ceva pe Google și nu găsesc nimic. Încerc să folosesc datepicker-ul implicit (sau ORICE datepicker în acest moment) și nu reușesc din cauza lipsei mele de cunoștințe despre WordPress/PHP. În plugin-ul meu, încerc să înregistrez jQuery și UI și se pare că stric alte părți din WordPress în acest proces. Poate cineva să-mi spună ce fac greșit și dacă poate oferi o soluție funcțională, voi renunța la tot codul meu:

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');
}

Am nevoie ca jQuery să fie disponibil atât în zona de administrare, cât și în front-end pentru introducerea datelor de către utilizatori. Vă rog, cineva să mă ajute. Sunt aproape să-mi smulg unghiile de la picioare, după ce mi-am smuls deja toți părul... Presupun că încarc resursele la momentul greșit, dar din nou, din cauza cunoștințelor mele limitate despre WordPress, m-am îngropat repede.

ACTUALIZARE: Am modificat scriptul meu și acum încarc doar jQuery UI și am testat că atât jQuery cât și UI sunt încărcate și funcționează, dar nu există un obiect în 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');
}

Testul meu:

jQuery(document).ready(function(){
    //jQuery('.datepick').mask("99/99/9999");
    //jQuery('.phone').mask("(999) 999-9999");
    jQuery( '.datepick' ).datepicker( 'option', 'dateFormat', 'yyyy-mm-dd' ); // <-- aceasta eșuează ????    
    alert('jQuery TREBUIE SĂ FIE ÎNCĂRCAT!!!'); // <---a funcționat
    jQuery('<div>wordpress nebun și php-ul lor</div>').dialog(); // <--- și asta a funcționat
});
4
Comentarii

Anularea înregistrării bibliotecilor încorporate precum jQuery este probabil rădăcina tuturor problemelor. Ele nu funcționează la fel ca cele de pe ajax.googleapis.com.

fuxia fuxia
28 apr. 2013 03:25:18

Deci, cum ar putea cineva să folosească jQuery UI Datepicker?

clockwiseq clockwiseq
28 apr. 2013 03:31:07

Îl poți folosi pur și simplu prin încărcarea lui în plugin-ul tău folosind wp_enqueue_script( 'jquery-ui' );

Vinod Dalvi Vinod Dalvi
28 apr. 2013 04:26:23

Care acțiune ar trebui să folosesc pentru a încărca scripturile?

clockwiseq clockwiseq
28 apr. 2013 05:40:56
Toate răspunsurile la întrebare 3
2

Având în vedere că toate bibliotecile necesare pentru datepicker sunt incluse în WordPress și sunt înregistrate cu toate dependențele corespunzătoare, tot ce trebuie să faci este:

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

Dacă inspectezi sursa paginii, vei vedea că jQuery, jQuery-UI și jQuery-UI-Datepicker sunt încărcate.

Desigur, va trebui să încarce orice alte scripturi în mod similar cu ceea ce faci deja, deși ar trebui să le înregistrezi cu dependențele lor - al treilea parametru.

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

De exemplu...

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

În acest fel, poți încărca acel script cu...

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

...știind că și dependențele - jQuery - vor fi încărcate.

28 apr. 2013 04:30:42
Comentarii

răspuns excelent! o întrebare, în ce eveniment fac toate acestea? am nevoie de asta atât în secțiunea de administrare, cât și în partea frontală.

clockwiseq clockwiseq
28 apr. 2013 05:25:13

Ceea ce am postat - wp_enqueue_scripts - se va încărca peste tot în partea frontală, cu excepția paginii de login. Dar este recomandat să încărcați scripturile doar pe paginile specifice care au nevoie de ele, astfel încât puteți modifica acel callback pentru a fi mai specific pe pagină. Pentru backend folosiți admin_enqueue_scripts, dar din nou, este ideal să le încărcați doar acolo unde sunt necesare. Există mai multe hook-uri specifice paginilor în backend. Nu pot spune exact de care aveți nevoie fără a ști unde vă sunt necesare scripturile.

s_ha_dum s_ha_dum
28 apr. 2013 06:59:46
0

Pentru a completa răspunsul excelent al lui @s_ha_dum, iată un exemplu care arată cum să folosești selectorul de date jQuery UI încorporat pe pagina ta de plugin.

Rezultatul va arăta astfel:

Selector de date jQuery UI în WordPress

Cele mai importante aspecte:

  • Folosește slug-ul paginii tale de opțiuni pentru a încărca scripturile și foile de stil doar pe pagina ta, nu pe toate paginile de administrare (context).
  • Asigură-te să setezi datepicker({ dateFormat: "yy-mm-dd" }), astfel încât să știi ce să aștepți în gestionarul tău de callback.
  • Nu există un stil încorporat pentru selectorul de date în WordPress, așa că trebuie să încarci o foaie de stil separată. Dar există și un plugin demo frumos de la @helenhousandi cu CSS care se potrivește perfect cu stilurile de bază.

Am construit mai întâi o clasă de bază pentru a avea ceva ce pot folosi și în alte răspunsuri și pentru a păstra codul actual pentru scriptul selectorului de date specific și simplu.

Clasa de bază Wpse_Plugin_Options_Page

/**
 *
 * Nu folosim așa-numita API de Setări aici, pentru că este mult prea
 * complicată.
 * În schimb, folosim admin-post.php: simplu, markup curat, funcționează.
 */
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,                       // titlul paginii
            $this->title,                       // titlul meniului
            'manage_options',                   // capabilitate
            $this->menu_slug,                   // slug-ul meniului
            array ( $this, 'render_page_base' ) // funcția de callback
        );

        $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( 'nope' );

        if ( ! isset ( $_POST[ $this->option ] ) )
            die( 'something is missing' );

        $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 );
    }
}

Acum trebuie doar să redefinim cele mai importante părți. Frumos și scurt.

Clasa specială 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' );

    // nu este moștenit
    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">Alege o dată
                <input type="text" id="%1$s" name="%2$s" value="%3$s" />
            </label> %4$s</p>',
            'datepicker',
            $this->option,
            $value,
            get_submit_button( 'Salvează', '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 => 'Dată salvată.'
        );
    }
}

Există încă mult loc pentru îmbunătățiri, dar ca început ar trebui să fie util.

28 apr. 2013 08:33:14
0

Există mai multe modalități de a include jQuery într-o temă. Eu folosesc întotdeauna versiunea inclusă în WP, pe care o consider foarte simplă. Pentru a configura corect lucrurile, trebuie să ne asigurăm că pagina WP va avea următoarele fișiere incluse în încărcarea paginii. Pentru a încărca scripturile și stilurile de mai jos, adăugați codul în fișierul functions.php al temei.

Script pentru utilizare în front-end

function add_e2_date_picker(){
//Fișierul jQuery UI date picker
wp_enqueue_script('jquery-ui-datepicker');
//Fișierul CSS al temei 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'); 

Script pentru utilizare în back-end

function add_e2_date_picker(){
//Fișierul jQuery UI date picker
wp_enqueue_script('jquery-ui-datepicker');
//Fișierul CSS al temei 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'); 

Putem scrie o funcție care să fie asociată pentru pagini specifice, cum ar fi single.php, page sau pagina unui plugin. Am adăugat sau asociat la 'options-general.php' pentru afișare în Setări->Date Picker. Introduceți acest cod și în fișierul functions.php sau sub aceste coduri.

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');

?>

După adăugarea acestui cod, veți avea un selector de dată în Meniu Admin->Setări->Date Picker. Dacă aveți nevoie de ajutor pentru a obține această opțiune, puneți orice întrebare prin comentarii la Adăugați un jQuery DatePicker la o Temă sau Plugin WordPress.

8 mar. 2016 14:24:32