¿Cómo uso jQuery UI en mi plugin?

9

Es un día triste en el mundo cuando busco algo en Google y no me devuelve nada. Estoy tratando de usar el selector de fecha predeterminado (o CUALQUIER marcador de fecha en este momento) y no puedo debido a mi falta de conocimiento con Wordpress / PHP. En mi plugin, estoy intentando registrar jquery y la interfaz de usuario y aparentemente estoy rompiendo otras partes de WordPress en el proceso. ¿Puede alguien decirme qué estoy haciendo mal y si pueden proporcionar una solución de trabajo, eliminaré todo mi código:

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

Necesito que jQuery esté disponible en el área de administración, así como en el front-end para la entrada de datos del usuario. Por favor alguien ayuda. Estoy a punto de arrancarme las uñas de los pies ya que ya me he arrancado todo el cabello ... Supongo que debo estar haciendo cola en el momento equivocado, pero nuevamente, debido a mi limitado conocimiento de WordPress, me he cavado. Una tumba rápidamente.

ACTUALIZACIÓN: Modifiqué mi script y ahora solo estoy cargando la interfaz de usuario de jQuery y he probado que jQuery y la interfaz de usuario están cargadas y tienen éxito para esos dos, pero no un objeto existente en el 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');
}

Mi prueba:

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
});
a la derechaq
fuente
Dar de baja las bibliotecas integradas como jQuery es probablemente la raíz de todos los problemas. No funcionan de la misma manera que los de ajax.googleapis.com.
fuxia
Entonces, ¿cómo se usaría el jQuery UI Datepicker?
clockwiseq
Puede usarlo simplemente colocándolo en su complemento usando wp_enqueue_script ('jquery-ui');
Vinod Dalvi el
¿Qué acción debo poner en cola los scripts?
sentido horario

Respuestas:

9

Dado que todas las bibliotecas que necesita para el selector de fechas están incluidas en WordPress y están registradas con todas las dependencias apropiadas, todo lo que realmente necesita hacer es:

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

Si observa el origen de la página, verá que jQuery, jQuery-UI y jQuery-UI-Datepicker están todos cargados.

Por supuesto, tendrá que cargar cualquier otro script usted mismo de la manera en que ya lo está, aunque debe registrarlos con sus dependencias: tercer parámetro.

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

Por ejemplo...

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

De esa manera, podrías cargar eso con ...

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

... y sepa que las dependencias, jQuery, también se cargarán.

s_ha_dum
fuente
gran respuesta! Una pregunta, ¿en qué evento hago todo esto? Necesito esto en la sección de administración, así como en el front-end.
clockwiseq
Lo que publiqué wp_enqueue_scripts... se cargará en todas partes en el front end, sin contar la página de inicio de sesión. Pero realmente desea cargar los scripts solo en las páginas particulares que los necesitan para poder modificar esa devolución de llamada para que sea más específica de la página. Para el uso del backend, admin_enqueue_scriptspero de nuevo, realmente solo desea cargarlos donde sea necesario. Hay varios ganchos específicos de página en el backend. No puedo decir qué necesitas sin saber dónde necesitas los scripts.
s_ha_dum
6

Para complementar la excelente respuesta de @ s_ha_dum , aquí hay un ejemplo que muestra cómo usar el selector de fecha jQuery UI incorporado en su página de complementos.

El resultado se verá así:

ingrese la descripción de la imagen aquí

Descargar en GitHub .

Las partes más importantes:

  • Utilice su slug de página de opciones para poner en cola los scripts y las hojas de estilo en su página solamente, no en todas las páginas de administración ( fondo ).
  • Asegúrese de configurar datepicker({ dateFormat: "yy-mm-dd" }), para que sepa qué esperar en su controlador de devolución de llamada.
  • No hay un estilo incorporado para el selector de fecha en WordPress, por lo que debe colocar una hoja de estilo por separado. Pero también hay un buen complemento de demostración de @helenhousandi con CSS que se adapta muy bien a los estilos principales.

Primero construí una clase base para tener algo que pueda usar en otras respuestas también y para mantener el código real para el script de selección de fecha específico y simple.

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

Ahora tenemos que redefinir solo las piezas más importantes. Agradable y corto.

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

Todavía hay mucho espacio para mejoras, pero para empezar debería ser útil.

fuxia
fuente
2

Hay varias formas de incluir jQuery en un tema. Siempre uso la versión incluida de WP que me parece muy simple. Para configurar correctamente las cosas, debemos asegurarnos de que la página WP tenga los siguientes archivos para ser incluidos en la carga de la página. Para cargar el script y el estilo de los fuelles, agregue el código de los fuelles en el archivo functions.php del tema.

Script para uso frontal

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 para uso de 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'); 

Podemos escribir una función que se enganche para páginas específicas, como single.php, page o plugin page. He agregado o enganchado en 'options-general.php' para mostrar en Settigns-> Date Picker . Simplemente ponga este código también archivo funtions.php o debajo de ese código.

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

?>

Después de agregar este código, obtendrá un selector de fecha en Menú de administración-> Configuración-> Selector de fecha . Si necesita ayuda para obtener esta opción, solicite cualquier consulta y agregue comentarios sobre Agregar un jQuery DatePicker al tema o complemento de WordPress .

csehasib
fuente