Come posso usare l'interfaccia utente di jQuery nel mio plugin


9

È un giorno triste al mondo in cui Google qualcosa e non restituisce nulla. Sto cercando di utilizzare il datepicker predefinito (o QUALUNQUE datepicker a questo punto) e non sono in grado di farlo a causa della mia mancanza di conoscenza con Wordpress / PHP. Nel mio plugin, sto tentando di registrare jquery e l'interfaccia utente e apparentemente sto rompendo altre parti di WordPress nel processo. Qualcuno può dirmi cosa sto facendo di sbagliato e se sono in grado di fornire una soluzione funzionante, eliminerò tutto il mio codice:

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

Ho bisogno che jQuery sia disponibile nell'area di amministrazione e nel front-end per l'immissione dei dati dell'utente. Per favore qualcuno aiuti. Sono vicino a togliermi le unghie dei piedi perché mi sono già strappato tutti i capelli ... Sto assumendo che devo accodarmi nel momento sbagliato nel tempo, ma di nuovo, a causa della mia conoscenza limitata di WordPress, mi sono scavato una tomba in fretta.

AGGIORNAMENTO: ho modificato il mio script e ora sto caricando solo l'interfaccia utente di jQuery e ho verificato che jQuery e l'interfaccia utente sono entrambi caricati e hanno esito positivo per quei due, ma non un oggetto esistente nel 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');
}

Il mio test:

jQuery(document).ready(function(){
    //jQuery('.datepick').mask("99/99/9999");
    //jQuery('.phone').mask("(999) 999-9999");
    jQuery( '.datepick' ).datepicker( 'option', 'dateFormat', 'yyyy-mm-dd' ); // <-- this fails ????    
    alert('jQuery BETTER BE LOADED!!!'); // <---this worked
    jQuery('<div>crazy wordpress and their php</div>').dialog(); // <--- this worked too
});

La cancellazione di librerie integrate come jQuery è probabilmente la radice di tutti i problemi. Funzionano non allo stesso modo di quelli di ajax.googleapis.com.
fuxia

Quindi, come si usa l'Up Datepicker dell'interfaccia utente jQuery?
senso orario,

Puoi usarlo semplicemente accodandolo nel tuo plugin usando wp_enqueue_script ('jquery-ui');
Vinod Dalvi,

Quale azione devo accodare agli script?
senso

Risposte:


9

Dato che tutte le librerie necessarie per il datepicker sono in bundle con WordPress e sono registrate con tutte le dipendenze appropriate, tutto ciò che devi davvero fare è:

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

Se poi guardi l'origine della pagina vedrai che jQuery, jQuery-UI e jQuery-UI-Datepicker sono tutti caricati.

Ovviamente, dovrai caricare qualsiasi altro script da solo in modo semplice come sei già, anche se dovresti registrarli con le loro dipendenze - terzo parametro.

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

Per esempio...

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

In questo modo, potresti caricarlo con ...

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

... e sappi che anche le dipendenze - jQuery - verranno caricate.


ottima risposta! una domanda, in quale evento devo fare tutto questo? Ne ho bisogno nella sezione di amministrazione e nel front-end.
senso

Quello che ho pubblicato-- wp_enqueue_scripts- verrà caricato ovunque sul front-end, senza contare la pagina di accesso. Ma vuoi davvero caricare gli script solo sulle pagine particolari che ne hanno bisogno in modo da poter modificare quel callback per essere più specifico della pagina. Per l'uso del backend, admin_enqueue_scriptsma ancora una volta, vuoi davvero caricarli solo dove necessario. Esistono diversi hook specifici della pagina sul backend. Non so dire di cosa hai bisogno senza sapere dove hai bisogno degli script.
s_ha_dum,

6

Per completare l'eccellente risposta di @ s_ha_dum , ecco un esempio che mostra come utilizzare il selettore di date dell'interfaccia utente jQuery integrato nella pagina del plug-in.

Il risultato sarà simile al seguente:

inserisci qui la descrizione dell'immagine

Scarica su GitHub .

Le parti più importanti:

  • Usa il tuo slug della pagina delle opzioni per accodare gli script e i fogli di stile solo sulla tua pagina, non su tutte le pagine di amministrazione ( sfondo ).
  • Assicurati di impostare datepicker({ dateFormat: "yy-mm-dd" }), in modo da sapere cosa aspettarti dal gestore di callback.
  • Non esiste uno stile incorporato per il selettore di date in WordPress, quindi devi accodare un foglio di stile separato. Ma c'è anche un simpatico plugin demo di @helenhousandi con CSS che si adatta perfettamente agli stili principali.

Ho creato prima una classe base per avere qualcosa che posso usare anche in altre risposte e per mantenere il codice effettivo per lo script di selezione della data specifico e semplice.

Classe base Wpse_Plugin_Options_Page

/**
 * Basic code, for a better documented example see
 * @link {https://github.com/toscho/T5-Admin-Menu-Demo}
 * @author toscho
 *
 * We do not use the so called Settings API here, because that is way too
 * complicated.
 * admin-post.php is used instead: simple, clean markup, works.
 */
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,                       // page title
            $this->title,                       // menu title
            'manage_options',                   // capability
            $this->menu_slug,                   // menu slug
            array ( $this, 'render_page_base' ) // callback function
        );

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

Ora dobbiamo ridefinire solo i pezzi più importanti. Bello e breve.

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

    // not inherited
    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">Pick a date
                <input type="text" id="%1$s" name="%2$s" value="%3$s" />
            </label> %4$s</p>',
            'datepicker',
            $this->option,
            $value,
            get_submit_button( 'Save', '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 => 'Date saved.'
        );
    }
}

C'è ancora molto spazio per i miglioramenti, ma all'inizio dovrebbe essere utile.


2

Esistono diversi modi per includere jQuery in un tema. Uso sempre la versione in bundle di WP che trovo molto semplice. Per impostare correttamente le cose, dobbiamo assicurarci che la pagina WP abbia i seguenti file da includere nel caricamento della pagina. Per caricare lo script e lo stile di soffietto aggiungi il codice di soffietto sul file delle funzioni theme.php

Script per l'utilizzo front-end

function add_e2_date_picker(){
//jQuery UI date picker file
wp_enqueue_script('jquery-ui-datepicker');
//jQuery UI theme css file
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 per uso back-end

function add_e2_date_picker(){
//jQuery UI date picker file
wp_enqueue_script('jquery-ui-datepicker');
//jQuery UI theme css file
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'); 

Possiamo scrivere una funzione da agganciare per pagine specifiche, come single.php, page o plugin page. Ho aggiunto o agganciato 'opzioni-general.php' per la visualizzazione su Settigns-> Selezione data . Basta inserire questo codice anche nel file funtions.php o sotto il codice.

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

?>

Dopo aver aggiunto questo codice, avrai un selettore di date nel menu Ammin .-> Impostazioni-> Selettore data . Se hai bisogno di aiuto per ottenere questa opzione, chiedi a qualsiasi query di inviare commenti su Aggiungi un jpery DatePicker al tema o al plug-in di WordPress .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.