プラグインでjQuery UIを使用する方法


9

私がGoogleで何かを返しても何も返さないのは、世界で悲しい日です。デフォルトの日付ピッカー(またはこの時点では任意の日付ピッカー)を使用しようとしていますが、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の両方がロードされ、これら2つは成功したが、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' ); // <-- this fails ????    
    alert('jQuery BETTER BE LOADED!!!'); // <---this worked
    jQuery('<div>crazy wordpress and their php</div>').dialog(); // <--- this worked too
});

jQueryのような組み込みライブラリの登録を解除することは、おそらくすべての問題の原因です。彼らはからのものと同じように動作しませんajax.googleapis.com
fuxia

では、jQuery UI Datepickerをどのように使用するのでしょうか。
clockwiseq

wp_enqueue_script( 'jquery-ui');を使用してプラグインにエンキューするだけで使用できます。
Vinod Dalvi 2013

スクリプトをキューに入れる必要があるのはどのアクションですか?
clockwiseq

回答:


9

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がすべてロードされていることがわかります。

もちろん、既存の方法と同じように、他のスクリプトを自分でロードする必要がありますが、それらの依存関係、つまり3番目のパラメーターを登録する必要があります。

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--もロードされることを知っています。


素晴らしい反応!1つの質問、どのイベントでこれをすべて行うのですか?これは、管理セクションとフロントエンドで必要です。
clockwiseq

私が投稿したものwp_enqueue_scripts--ログインページを数えずに、フロントエンドのどこにでもロードされます。しかし、スクリプトを必要とする特定のページにのみスクリプトをロードして、コールバックをページ固有に変更することができます。バックエンドを使用する場合admin_enqueue_scriptsでも、本当に必要な場所にのみロードする必要があります。バックエンドにはいくつかのページ固有のフックがあります。スクリプトが必要な場所を知らないと、必要なものがわかりません。
s_ha_dum 2013

6

@s_ha_dumの優れた答えを補足するに、プラグインページで組み込みのjQuery UI日付ピッカーを使用する方法を示す例を次に示します。

結果は次のようになります。

ここに画像の説明を入力してください

GitHubからダウンロードしてください

最も重要な部分:

  • オプションページスラッグを使用して、すべての管理ページ(background)ではなく、ページのみにスクリプトとスタイルシートをエンキューします。
  • 必ずを設定datepicker({ dateFormat: "yy-mm-dd" })してください。そうすることで、コールバックハンドラーで何を期待できるかがわかります。
  • WordPressには日付ピッカーの組み込みスタイルがないため、別のスタイルシートをエンキューする必要があります。しかし、コアスタイルにうまく適合するCSSを備えた@helenhousandiからの素晴らしいデモプラグインもあります。

最初に基本クラスを作成して、他の回答でも使用できるものを用意し、日付ピッカースクリプトの実際のコードを具体的かつシンプルに保ちました。

基本クラス 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 );
    }
}

ここで、最も重要な部分のみを再定義する必要があります。素敵で短い。

特別授業 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.'
        );
    }
}

まだ改善の余地はたくさんありますが、最初はそれが役立つはずです。


2

jQueryをテーマに含める方法はいくつかあります。私はいつも、WPバンドルバージョンを使用しています。正しく設定するには、WPページに以下のファイルがページの読み込みに含まれるようにする必要があります。ベローズスクリプトとスタイルを読み込むには、テーマのfunctions.phpファイルにベローズコードを追加します。

フロントエンド用のスクリプト

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

バックエンド用のスクリプト

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

single.php、ページ、プラグインページなど、特定のページにフックする関数を作成できます。私は 'options- general.php 'を追加またはフックして、Settigns-> Date Pickerに表示しました。このコードをfuntions.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');

?>

このコードを追加すると、Admin Menu-> Settigns-> Date Pickerに日付ピッカーが表示されます。このオプションを取得するためのヘルプが必要な場合は、任意のクエリで「jQuery DatePickerをWordPressテーマまたはプラグイン追加する」でコメントを投げてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.