从元框回调函数加载脚本和样式

时间:2011-06-09 作者:kaiser

案例:

我得到了一组基于输入数组中的数据构建表单字段的类。该类可以构建以下类型的表单字段:

输入(基本、隐藏、密码)

  • 文本区域
  • 收音机
  • 复选框
  • 选择颜色选择器
  • 日期选择器
  • 文件上载
  • 编辑:类使用wp_register_script/_style &;wp_enqueue_script/_style 加载脚本(&O);样式。包含动作的函数在类中钩住,如下所示:add_action( \'admin_enqueue_scripts\', array( &$this, \'enqueue\' ) );.

    示例:

    (内部functions.php)

    // meta box callback function
    function test_meta_box_cb()
    {   
        $input_args = array(
             \'type\'         => \'color\'
            ,\'id\'           => \'color-id\'
            ,\'label\'        => \'Input Colorpicker Label\'
            ,\'opt_name\'     => \'abc_xyz\'
            ,\'value\'        => \'009ee0\'
         );
        new FormClass( $input_args, true );
    }
    // add the meta box
    function add_test_meta_box()
    {
        add_meta_box( \'test_box\', __(\'TestBox\'), \'test_meta_box_cb\', \'post\', \'advanced\', \'high\' );
    }
    add_action( \'add_meta_boxes\', \'add_test_meta_box\' );
    
    问题:这样,我需要wp_enqueue_script &;wp_enqueue_style 不起作用。我渲染了表单字段,但没有脚本或样式。

    问题的情况和回溯:

    到目前为止,我可以将问题追溯到wordpress核心架构:

    直到do_action(\'add_meta_boxes\', $post_type, $post) 调用了get(在edit form advanced.php中)

  • 该调用发生在管理标头之后很久。调用了php(其中包含do_action(\'admin_enqueue_scripts\', $hook_suffix);).

      问题:

      如何在调用元框表单字段之前加载样式wp_enqueue_style &;wp_register_style?

      注意:我需要在许多不同的szenarios中使用这个类,所以将它绑定到add_meta_box 功能不好。我即将创建一个抽象层来划分对元框和样式/脚本部分的调用,但为什么我要在核心函数之上添加另一层呢?

  • 3 个回复
    最合适的回答,由SO网友:Anh Tran 整理而成

    您的问题是添加脚本、样式inside 类,因为类实例是在钩子add_meta_box 被解雇时wp_enqueue_script/style 已完成。

    您的解决方案是添加脚本、样式outside 函数和类。由于元框仅用于编辑页面,因此可以执行以下操作:

    // the editing pages are actually post.php and post-new.php
    add_action(\'admin_print_styles-post.php\', \'custom_js_css\');
    add_action(\'admin_print_styles-post-new.php\', \'custom_js_css\');
    
    function custom_js_css() {
        wp_enqueue_style(\'your-meta-box\', $base_url . \'/meta-box.css\');
        wp_enqueue_script(\'your-meta-box\', $base_url . \'/meta-box.js\', array(\'jquery\'), null, true);
    }
    
    实际上,我写了一个meta box class for WP, 这使用了另一种方法。我的类不是像您那样为表单字段编写表单类,而是元框的包装器。如果你感兴趣,值得一看。

    SO网友:EAMann

    您应该将脚本挂接到wp_enqueue_scripts 动作和你的风格wp_print_styles 行动在您的函数中,在实际使用之前,进行检查以确保您在使用元框的页面上wp_enqueue_script()wp_enqueue_style().

    例如,在我的一个插件中,我有:

    public static function enqueue_scripts_and_styles() {
        if( is_admin() ) {
            wp_enqueue_script( \'media-upload\' );
            wp_enqueue_script( \'thickbox\' );
            wp_enqueue_style( \'thickbox\' );
        } else {
            wp_enqueue_style( \'wp-publication-archive-frontend\', WP_PUB_ARCH_INC_URL . \'/front-end.css\', \'\', \'2.0\', \'all\' );
        }
    }
    
    我把它挂在init (在所有其他脚本和样式进入队列之前激发)。

    SO网友:Rarst

    在当前表单中,您的代码将对象简化为某种函数调用(创建、做某事、死亡)。如果您希望对象在创建和销毁该对象之前很久就执行某些操作,则这种用法是行不通的。

    我将执行以下操作,而不是在metabox内容中创建对象:

    提前一段时间创建对象

    结束

    相关推荐

    Getting metabox value?

    我使用Wordpress参考中的代码制作了一个自定义元数据库:http://codex.wordpress.org/Function_Reference/add_meta_box<?php /* Define the custom box */ // WP 3.0+ // add_action(\'add_meta_boxes\', \'myplugin_add_custom_box\'); // backwards compatible