Wie verwende ich die jQuery-Benutzeroberfläche in meinem Plugin?

9

Es ist ein trauriger Tag auf der Welt, an dem ich etwas google und es nichts zurückgibt. Ich versuche, den Standard-Datepicker (oder JEDEN Datepicker zu diesem Zeitpunkt) zu verwenden, und kann dies aufgrund meiner mangelnden Kenntnisse in Wordpress / PHP nicht. In meinem Plugin versuche ich, jquery und die Benutzeroberfläche zu registrieren und beschädige anscheinend dabei andere Teile von WordPress. Kann mir bitte jemand sagen, was ich falsch mache und wenn er eine funktionierende Lösung bieten kann, werde ich meinen gesamten Code verschrotten:

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

Ich benötige jQuery, um im Admin-Bereich sowie im Front-End für die Eingabe von Benutzerdaten verfügbar zu sein. Bitte jemand helfen. Ich bin kurz davor, meine Zehennägel abzuziehen, da ich bereits alle Haare herausgerissen habe ... Ich gehe davon aus, dass ich mich zum falschen Zeitpunkt in die Warteschlange stellen muss, aber aufgrund meiner begrenzten Kenntnisse in WordPress habe ich mich selbst ausgegraben schnell ein Grab.

UPDATE: Ich habe mein Skript geändert und lade jetzt nur die jQuery-Benutzeroberfläche und habe getestet, dass jQuery und die Benutzeroberfläche beide geladen sind und für diese beiden erfolgreich sind, jedoch kein vorhandenes Objekt im 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');
}

Mein 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
});
im Uhrzeigersinnq
quelle
Das Abmelden von integrierten Bibliotheken wie jQuery ist wahrscheinlich die Wurzel aller Probleme. Sie arbeiten nicht so wie die von ajax.googleapis.com.
Fuxia
Wie würde man den jQuery UI Datepicker verwenden?
im Uhrzeigersinn
Sie können es verwenden, indem Sie es einfach mit wp_enqueue_script ('jquery-ui') in Ihr Plugin einreihen.
Vinod Dalvi
Welche Aktion soll ich die Skripte in die Warteschlange stellen?
im Uhrzeigersinn

Antworten:

9

Da alle Bibliotheken, die Sie für den Datepicker benötigen, in WordPress gebündelt und mit allen entsprechenden Abhängigkeiten registriert sind, müssen Sie nur Folgendes tun:

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

Wenn Sie sich dann die Quelle der Seite ansehen, werden Sie sehen, dass jQuery, jQuery-UI und jQuery-UI-Datepicker alle geladen sind.

Natürlich müssen Sie alle anderen Skripte selbst so laden, wie Sie es bereits sind, obwohl Sie sie mit ihren Abhängigkeiten registrieren sollten - dritter Parameter.

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

Zum Beispiel...

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

Auf diese Weise können Sie das mit ...

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

... und wissen, dass die Abhängigkeiten - jQuery - ebenfalls geladen werden.

s_ha_dum
quelle
tolle Antwort! eine Frage, in welcher Veranstaltung mache ich das alles? Ich brauche dies sowohl im Admin-Bereich als auch im Frontend.
im Uhrzeigersinn
Was ich gepostet habe wp_enqueue_scripts- wird überall im Frontend geladen, ohne die Anmeldeseite zu zählen. Sie möchten die Skripte jedoch wirklich nur auf die bestimmten Seiten laden, die sie benötigen, damit Sie diesen Rückruf so ändern können, dass er seitenspezifischer ist. Für die Backend-Verwendung admin_enqueue_scriptsmöchten Sie sie aber wirklich nur dort laden, wo sie benötigt werden. Es gibt mehrere seitenspezifische Hooks im Backend. Ich kann nicht sagen, was Sie brauchen, ohne zu wissen, wo Sie die Skripte brauchen.
s_ha_dum
6

Um die hervorragende Antwort von @ s_ha_dum zu ergänzen , finden Sie hier ein Beispiel, das zeigt, wie Sie die integrierte Datumsauswahl für die jQuery-Benutzeroberfläche auf Ihrer Plugin-Seite verwenden.

Das Ergebnis sieht folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

Auf GitHub herunterladen .

Die wichtigsten Teile:

  • Verwenden Sie Ihren Optionsseiten-Slug, um die Skripte und Stylesheets nur auf Ihrer Seite in die Warteschlange zu stellen, nicht auf allen Administrationsseiten ( Hintergrund ).
  • Stellen Sie sicher datepicker({ dateFormat: "yy-mm-dd" }), dass Sie festlegen , damit Sie wissen, was Sie von Ihrem Rückruf-Handler erwarten.
  • In WordPress gibt es keinen integrierten Stil für die Datumsauswahl. Sie müssen daher ein separates Stylesheet in die Warteschlange stellen. Es gibt aber auch ein nettes Demo-Plugin von @helenhousandi mit CSS, das gut in die Kernstile passt.

Ich habe zuerst eine Basisklasse erstellt, um etwas zu haben, das ich auch in anderen Antworten verwenden kann, und um den tatsächlichen Code für das Datumsauswahlskript spezifisch und einfach zu halten.

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

Jetzt müssen wir nur noch die wichtigsten Teile neu definieren. Schön kurz.

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

Es gibt noch viel Raum für Verbesserungen, aber zunächst sollte es nützlich sein.

Fuxia
quelle
2

Es gibt verschiedene Möglichkeiten, jQuery in ein Thema aufzunehmen. Ich verwende immer die WP-Bundle-Version, die ich sehr einfach finde. Um die Dinge richtig einzurichten, müssen wir sicherstellen, dass die WP-Seite die folgenden Dateien enthält, die beim Laden der Seite berücksichtigt werden sollen. Fügen Sie zum Laden von Balgskript und -stil einen Balgcode in die Datei theme functions.php ein.

Skript für den Front-End-Gebrauch

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

Skript für die Back-End-Verwendung

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

Wir können eine Funktion schreiben, die für bestimmte Seiten wie single.php, page oder plugin page verknüpft werden soll. Ich habe 'options-general.php' hinzugefügt oder angeschlossen, um sie unter Einstellungen> Datumsauswahl anzuzeigen . Fügen Sie einfach diesen Code auch in die Datei funtions.php ein oder folgen Sie diesem Code.

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

?>

Nachdem Sie diesen Code hinzugefügt haben, erhalten Sie eine Datumsauswahl unter Admin-Menü-> Einstellungen-> Datumsauswahl . Wenn Sie Hilfe benötigen, um diese Option zu erhalten, fragen Sie nach einer Abfrage, indem Sie Kommentare zu Add a jQuery DatePicker to WordPress Theme oder Plugin hinzufügen .

csehasib
quelle