似乎无法运行JQuery(WordPress插件)

时间:2015-05-07 作者:Script99

我试图学习如何使用Wordpress创建插件,但我偶然发现了这个问题:

每当我尝试运行JQuery时,我都会得到未定义的错误等。。。

我尝试了在互联网上找到的不同方法,如取消注册/注册/排队,但似乎没有任何效果。

目标是在插件设置页面中填充文本区域,而无需重新加载/保存页面以创建实时预览。

这就是我现在正在做的:

class plugin 
{
  public function __construct()
  { 
    add_action("wp_enqueue_scripts", "jquery_enqueue");
    add_action( \'admin_menu\', array( $this, \'plugin_page\' ) );
    add_action( \'admin_init\', array( $this, \'page_init\' ) );
  }

  public function jquery_enqueue() 
  {
    wp_deregister_script(\'jquery\');
    wp_register_script(\'jquery\', "http" . ($_SERVER[\'SERVER_PORT\'] == 443 ? "s" : "") . "://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", false, null);
    wp_enqueue_script(\'jquery\');
  }

  public function plugin_page()
  {
    add_menu_page(
        \'...\',
        \'...\',
        \'...\',
        \'...\',
         array( $this, \'create_admin_page\' )
    );
   }

public function create_admin_page()
    {
        // Set class property
        $this->options = get_option( \'my_option_name\' );
        ?>
        <div class="wrap">
            <h2>Test</h2>           
            <form method="post" action="options.php">
            <?php
                // This prints out all hidden setting fields
                settings_fields( \'...\' );   
                do_settings_sections( \'...\' );
            ?>
            <script>                
                $( document ).ready(function() {
                    $( "#my_option_name" ).change(function() {
                        $.post( 
                          \'classes/dummy.class.php\'
                        ).success(function(x){
                            json = $.parseJSON(x);
                            $(\'textarea\').text(json);
                        });
                    });
                });
            </script>
            </form>
            <textarea></textarea>
        </div>
        <?php
    }}
我遗漏了一些代码,只包含了重要的部分。

1 个回复
最合适的回答,由SO网友:helgatheviking 整理而成

这是一个常见的问题。我刚开始的时候,它一直困扰着我,因为它没有任何意义,除非你知道,否则很难找到它。问题是WordPress捆绑了一个设置为noConflict模式的jQuery版本。因此,要运行脚本,必须使用noConflict wrappers

jQuery(document).ready(function($) {
    // Inside of this function, $() will work as an alias for jQuery()
    // and other libraries also using $ will not be accessible under this shortcut
});
Update

无需加载不同版本的jQuery。这只会让事情复杂化。让WordPress加载它自己的版本。删除您的jquery_enqueue() 方法

下一步调整create_admin_page() 不直接打印脚本。我认为正在发生的是add_menu_page() 之前运行wp_enqueue_scripts 因此jQuery还不可用。因此,错误。您可以通过向admin_print_footer_scripts

经过如此修改create_admin_page() 现在看起来是这样的:

public function create_admin_page()
    {
        // Set class property
        $this->options = get_option( \'my_option_name\' );
        add_action( \'admin_print_footer_scripts\', array( $this, \'footer_scripts\' ) );
        ?>
        <div class="wrap">
            <h2>Test</h2>           
            <form method="post" action="options.php">
            <?php
                // This prints out all hidden setting fields
                settings_fields( \'...\' );   
                do_settings_sections( \'...\' );
            ?>
            </form>
            <textarea></textarea>
        </div>
        <?php
    }
您的新功能是:

public function footer_scripts()
    { ?>
            <script>                
                jQuery( document ).ready(function($) {
                    $( "#my_option_name" ).change(function() {
                        $.post( 
                          \'classes/dummy.class.php\'
                        ).success(function(x){
                            json = $.parseJSON(x);
                            $(\'textarea\').text(json);
                        });
                    });
                });
            </script>

结束