帮助我的第一个Metabox帮助器类

时间:2014-04-27 作者:Daniel

我正在开发一个metabox助手类,除了无线电图像字段之外,一切都很好。图像会显示出来,但无法单击。

        // Print radio_image input.
    private function radio_image_input( $field ) {

        $selected_value = $field[\'value\'];

        $radio_image_field = \'\';
        $radio_image_field .=\'
                <style>
                    .optionimg{border:3px solid #cecece; margin-right:4px;cursor:pointer;}
                    .optionimg.optselected{border-color:#ababab;}
                    .form-table td em{font-style:normal;color:#999999;font-size:12px;}
                </style>
                <script>
                jQuery(document).ready(function(){
                    jQuery( \\\'.optionimg\\\').click(function(){
                        jQuery(this).parent().find( \\\'.optionimg\\\').removeClass( \\\'optselected\\\' );
                        jQuery(this).addClass( \\\'optselected\\\' );
                    });
                });
                </script>
            \';
        if ( ! empty( $field[\'choices\'] ) ) {
            foreach ( (array) $field[\'choices\'] as $value => $label )
                $radio_image_field .= sprintf(
                    \'<img src="\'.$label.\'" class="optionimg \'.$selected_value.\'" onclick="document.getElementById(\\\'\'.$field[\'id\'].$choices.\'\\\').checked=true" style="display:inline-block;" /><input type="radio" name="%s" id="%s" value="%s" style="display:none;"/>\',
                    esc_attr( $field[\'id\'] ),
                    esc_attr( $value ),
                    esc_attr( $value ),
                    esc_html( $label )
                );
        }

        return $radio_image_field;
    }
我认为问题出在JS上,但我不知道为什么/在哪里。

全班在此:

if ( ! class_exists( \'TheUx_Metabox_API\' ) ) {

    class TheUx_Metabox_API {

        // Holds options for menu page.
        var $options = array();

        // Holds settings fields data.
        var $fields = array();

        // Supported input field types to white label while saving.
        var $supported_fields = array();

        // Holds current folder path.
        var $dir_path;

        // Holds current folder URI.
        var $dir_uri;


        function __construct( $options = array(), $fields = array() ) {

            // Set directory path.
            $this->dir_path = str_replace( \'\\\\\', \'/\', dirname( __FILE__ ) );

            // Set directory uri.
            $this->dir_uri  = trailingslashit( home_url() ) . str_replace( str_replace( \'\\\\\', \'/\', ABSPATH ), \'\', $this->dir_path );

            // Default page options.
            $options_default = array(
                \'metabox_id\'    => \'\',
                \'metabox_title\' => \'\',
                \'post_type\'     => \'\',
                \'context\'       => \'normal\',
                \'priority\'      => \'high\',
            );

            $this->options = wp_parse_args( $options, $options_default );
            extract( $this->options );

            // Titles and slugs should not be empty.
            if ( empty( $metabox_id ) || empty( $metabox_title ) || empty( $post_type ) )
                return false;

            // Set input fields.
            $this->fields = (array) $fields;

            // Default field options.
            $field_default = array(
                \'title\'    => \'\',
                \'type\'     => \'\',
                \'desc\'     => \'\',
                \'choices\'  => array(),
                \'multiple\' => false,
                \'sanit\'    => \'\',
            );

            // To eliminate PHP warning we need to set default empty values.
            foreach ( $this->fields as $key => $field )
                $this->fields[ $key ] = wp_parse_args( $field, $field_default );

            // Set list of input field types. We are white labeling these field types while saving meta.
            $this->supported_fields = (array) apply_filters( \'theux_metabox_api_supported_fields\', array( 
                \'text\', 
                \'textarea\', 
                \'radio\', 
                \'radio_image\', 
                \'checkbox\', 
                \'select\', 
                \'multicheck\', 
                \'upload\', 
                \'color\', 
                \'editor\' 
            ));

            add_action( \'add_meta_boxes\', array( $this, \'register_metabox\' ) );
            add_action( \'save_post\', array( $this, \'save_metabox\' ), 10, 2 );

            add_action( \'admin_head\', array( $this, \'color_picker_js\' ) );
            add_action( \'admin_head\', array( $this, \'upload_js\' ) );
        } // end of __construct


        /**
         * HTML helper functions. 
         * A simple HTML helper functions to generate the form fields.
         */

        // Print Help/descripting for field.
        private function help_text( $field ) {
            if ( empty( $field[\'desc\'] ) )
                return \'\';

            return \'<p class="description">\' . wp_kses_data( $field[\'desc\'] ) . \'</p>\';
        }

        // Returns the form table html.
        public function get_form_table( $fields, $show_help = true ) {

            $form_table = \'\';
            $form_table .= \'<table class="form-table">\';

            foreach ( (array) $fields as $field )
                $form_table .= $this->get_table_row( $field, $show_help );

            $form_table .= \'</table>\';

            return apply_filters( \'theux_metabox_api_form_table\', $form_table, $fields, $show_help );
        }

        // Echo/display the HTML form table.
        public function display_form_table( $fields, $show_help = true ) {

            echo $this->get_form_table( $fields, $show_help );
        }


        // Returns the table row html.
        public function get_table_row( $field, $show_help ) {

            $table_row = \'<tr valign="top">\';
                $table_row .= sprintf( \'<th><label for="%s">%s</label></th>\', esc_attr( $field[\'id\'] ), $field[\'title\'] );
                $table_row .= sprintf( \'<td>%s</td>\', $this->get_field( $field, $show_help ) );
            $table_row .= \'</tr>\';

            return apply_filters( \'theux_metabox_api_table_row\', $table_row, $field, $show_help );
        }


        // Returns a input field based on field options.
        public function get_field( $field, $show_help = true ) {

            $field_default = array(
                \'title\'    => \'\',
                \'id\'       => \'\',
                \'type\'     => \'\',
                \'default\'  => \'\',
                \'choices\'  => array(),
                \'value\'    => \'\',
                \'desc\'     => \'\',
                \'sanit\'    => \'\',
                \'multiple\' => false, // for multiselect fiield
            );

            $field = wp_parse_args( $field, $field_default );
            $input_html = \'\';

            switch ( $field[\'type\'] ) {
                case \'text\'       : $input_html .= $this->text_input( $field ); break;
                case \'textarea\'   : $input_html .= $this->textarea_input( $field ); break;
                case \'select\'     : $input_html .= $this->select_input( $field ); break;
                case \'radio\'      : $input_html .= $this->radio_input( $field ); break;
                case \'radio_image\': $input_html .= $this->radio_image_input( $field ); break;
                case \'checkbox\'   : $input_html .= $this->checkbox_input( $field ); break;
                case \'multicheck\' : $input_html .= $this->multicheck_input( $field ); break;
                case \'upload\'     : $input_html .= $this->upload_input( $field ); break;
                case \'color\'      : $input_html .= $this->color_input( $field ); break;
                case \'editor\'     : $input_html .= $this->editor_input( $field ); break;
            }

            if ( $show_help && \'checkbox\' !== $field[\'type\'] )
                $input_html .= $this->help_text( $field );

            return apply_filters( \'theux_metabox_api_input_field\', $input_html, $field, $show_help );
        }

        // Displays a input field based field options
        public function display_field( $field, $show_help = true ) {
            echo $this->get_field( $field, $show_help );
        }


        // Print text input.
        private function text_input( $field ) {
            return sprintf(
                \'<input type="text" name="%s" id="%s" value="%s" class="regular-text"/>\',
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'value\'] )
            );
        }

        // Print textarea input.
        private function textarea_input( $field ) {
            return sprintf(
                \'<textarea name="%s" id="%s" rows="5" cols="40">%s</textarea>\',
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'id\'] ),
                esc_textarea( $field[\'value\'] )
            );
        }

        // Print select input.
        private function select_input( $field ) {
            $selected_value = $field[\'value\'];
            $multiple = ( true == $field[\'multiple\'] || \'true\' == $field[\'multiple\'] ) ? true : false ;

            if ( $multiple )
                $field[\'id\'] = $field[\'id\'] . \'[]\';

            $select_field = sprintf(
                \'<select name="%s" id="%s"%s>\',
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'id\'] ),
                ( $multiple ? \' multiple\' : \'\' )
            );

            if ( ! empty( $field[\'choices\'] ) ) {
                foreach ( (array) $field[\'choices\'] as $value => $label ) {
                    $selected = $multiple ? selected( in_array( $value, (array) $selected_value ), true, false ) : selected( $selected_value, $value, false );
                    $select_field .= sprintf(
                        \'<option value="%s"%s>%s</option>\',
                        esc_attr( $value ),
                        $selected,
                        esc_html( $label )
                    );
                }
            }

            $select_field .= \'</select>\';
            return $select_field;
        }

        // Print checkbox input.
        private function checkbox_input( $field ) {
            return sprintf(
                \'<label><input type="checkbox" name="%s" id="%s"%s> %s</label>\',
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'id\'] ),
                checked( $field[\'value\'], \'on\', false ),
                __( $field[\'desc\'] )
            );
        }

        // Print radio input.
        private function radio_input( $field ) {
            $selected_value = $field[\'value\'];
            $radio_field = \'\';

            if ( ! empty( $field[\'choices\'] ) ) {
                foreach ( (array) $field[\'choices\'] as $value => $label )
                    $radio_field .= sprintf(
                        \'<label><input type="radio" name="%s" id="" value="%s"%s> %s</label><br/>\',
                        esc_attr( $field[\'id\'] ),
                        esc_attr( $value ),
                        checked( $selected_value, $value, false ),
                        esc_html( $label )
                    );
            }

            return $radio_field;
        }

        // Print radio_image input.
        private function radio_image_input( $field ) {

            $selected_value = $field[\'value\'];

            $radio_image_field = \'\';
            $radio_image_field .=\'
                    <style>
                        .optionimg{border:3px solid #cecece; margin-right:4px;cursor:pointer;}
                        .optionimg.optselected{border-color:#ababab;}
                        .form-table td em{font-style:normal;color:#999999;font-size:12px;}
                    </style>
                    <script>
                    jQuery(document).ready(function(){
                        jQuery( \\\'.optionimg\\\').click(function(){
                            jQuery(this).parent().find( \\\'.optionimg\\\').removeClass( \\\'optselected\\\' );
                            jQuery(this).addClass( \\\'optselected\\\' );
                        });
                    });
                    </script>
                \';
            if ( ! empty( $field[\'choices\'] ) ) {
                foreach ( (array) $field[\'choices\'] as $value => $label )
                    $radio_image_field .= sprintf(
                        \'<img src="\'.$label.\'" class="optionimg \'.$selected_value.\'" onclick="document.getElementById(\\\'\'.$field[\'id\'].$choices.\'\\\').checked=true" style="display:inline-block;" /><input type="radio" name="%s" id="%s" value="%s" style="display:none;"/>\',
                        esc_attr( $field[\'id\'] ),
                        esc_attr( $value ),
                        esc_attr( $value ),
                        esc_html( $label )
                    );
            }

            return $radio_image_field;
        }


        // Print multi-checkbox input.
        private function multicheck_input( $field ) {
            $selected_value = (array) $field[\'value\'];
            $multicheck_field = \'\';

            if ( ! empty( $field[\'choices\'] ) ) {
                foreach ( (array) $field[\'choices\'] as $value => $label )
                    $multicheck_field .= sprintf(
                        \'<label><input type="checkbox" name="%s[]" id="" value="%s"%s> %s</label><br/>\',
                        esc_attr( $field[\'id\'] ),
                        esc_attr( $value ),
                        checked( in_array( $value, $selected_value ), true, false ),
                        esc_html( $label )
                    );
            }

            return $multicheck_field;
        }

        // Print upload input.
        private function upload_input( $field ) {

            // We require to enqueue media uploader scripts and styles.
            wp_enqueue_media();

            return sprintf(
                \'<input type="text" name="%s" id="%s" value="%s" class="regular-text hd-upload-input"/>\' .
                \'<input type="button" value="%s" class="hd-upload-button button button-secondary" id="hd_upload_%s"/>\',
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'value\'] ),
                __( \'Upload\', \'theux\' ),
                esc_attr( $field[\'id\'] )
            );
        }

        // Print color picker input.
        private function color_input( $field ) {

            // We require to enqueue color picker scripts and styles.
            wp_enqueue_style( \'wp-color-picker\' );
            wp_enqueue_script( \'wp-color-picker\' );

            $default_color = empty( $field[\'default\'] ) ? \'\' : \' data-default-color="\' . esc_attr( $field[\'default\'] ) . \'"\';

            return sprintf(
                \'<input type="text" name="%s" id="%s" value="%s" class="hd-color-picker"%s/>\',
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'id\'] ),
                esc_attr( $field[\'value\'] ),
                $default_color
            );
        }

        // Print tinymce editor input.
        private function editor_input( $field ) {
            $settings = array(
                \'media_buttons\' => false,
                \'textarea_rows\' => 5,
                \'textarea_cols\' => 45,
            );

            $content = $field[\'value\'];
            $content = empty( $content ) ? \'\' : $content;

            ob_start();
            wp_editor( $content, $field[\'id\'], $settings );
            return ob_get_clean();
        }



        /**
         * Main functions. 
         * The follow functions will register, print, save and sanitise the metabox.
         */

        // Register metabox.
        function register_metabox() {

            extract( $this->options );
            foreach ( (array) $post_type as $type )
                if ( post_type_exists( $type ) )
                    add_meta_box( $metabox_id, esc_html( $metabox_title ), array( $this, \'display_metabox\' ), $type, $context, $priority );
        }

        // Print metabox content.
        function display_metabox( $post ) {

            foreach ( (array) $this->fields as $meta_key => $meta_field ) {
                $this->fields[ $meta_key ][\'id\'] = $meta_key;
                $this->fields[ $meta_key ][\'value\'] = get_post_meta( $post->ID, $meta_key, true );
            }

            wp_nonce_field( $this->options[\'metabox_id\'] . \'_\' . $post->ID, $this->options[\'metabox_id\'] . \'_\' . $post->ID . \'_nonce\' );
            do_action( \'theux_metabox_api_metabox_before\', $this->options, $this->fields );

            echo \'<div class="hd-metabox-inner \' . sanitize_html_class( $this->options[\'metabox_id\'] ) . \'">\';
                $this->display_form_table( $this->fields, true );
            echo \'</div>\';

            do_action( \'theux_metabox_api_metabox_after\', $this->options, $this->fields );
        }

        // Save metabox.
        function save_metabox( $post_id, $post ) {

            extract( $this->options );

            if ( ! isset( $_POST[ $metabox_id . \'_\' . $post_id . \'_nonce\' ] ) || ! wp_verify_nonce( $_POST[ $metabox_id . \'_\' . $post_id . \'_nonce\' ], $metabox_id . \'_\' . $post_id ) )
                return $post_id;

            if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
                return $post_id;

            $post_type = get_post_type_object( $post->post_type );

            if ( ! current_user_can( $post_type->cap->edit_post, $post_id ) )
                return $post_id;

            foreach ( (array) $this->fields as $meta_key => $meta_field ) {

                $meta_field[\'id\'] = $meta_key;

                // White label field types
                if ( ! in_array( $meta_field[\'type\'], $this->supported_fields ) )
                    continue;

                $post_value = isset( $_POST[ $meta_key ] ) ? $_POST[ $meta_key ] : \'\';
                $new_value = $this->sanitize_value( $post_value, $meta_field );
                $old_value = get_post_meta( $post_id, $meta_key, true );

                if ( ( $new_value || 0 == $new_value ) && $new_value != $old_value )
                    update_post_meta( $post_id, $meta_key, $new_value, $old_value );
                elseif ( \'\' == $new_value && $old_value )
                    delete_post_meta( $post_id, $meta_key, $new_value );
            }

            do_action( \'theux_metabox_api_save_metabox\', $post_id, $post );
        }

        // Sanitize metabox value.
        function sanitize_value( $new_value, $field ) {

            if ( ! isset( $field[\'sanit\'] ) )
                $field[\'sanit\'] = \'\';

            switch ( $field[\'sanit\'] ) {

                case \'int\' :
                    return is_array( $new_value ) ? array_map( \'intval\', $new_value ) : intval( $new_value );
                    break;

                case \'absint\' :
                    return is_array( $new_value ) ? array_map( \'absint\', $new_value ) : absint( $new_value );
                    break;

                case \'email\' :
                    return is_array( $new_value ) ? array_map( \'sanitize_email\', $new_value ) : sanitize_email( $new_value );
                    break;

                case \'url\' :
                    return is_array( $new_value ) ? array_map( \'esc_url_raw\', $new_value ) : esc_url_raw( $new_value );
                    break;

                case \'bool\' :
                    return (bool) $new_value;
                    break;

                case \'color\' :
                    return $this->sanitize_hex_color( $new_value );
                    break;

                case \'html\' :
                    if ( current_user_can( \'unfiltered_html\' ) )
                        return is_array( $new_value ) ? array_map( \'wp_kses_post\', $new_value ) : wp_kses_post( $new_value );
                    else
                        return is_array( $new_value ) ? array_map( \'wp_strip_all_tags\', $new_value ) : wp_strip_all_tags( $new_value );
                    break;

                case \'nohtml\' :
                    return is_array( $new_value ) ? array_map( \'wp_strip_all_tags\', $new_value ) : wp_strip_all_tags( $new_value );
                    break;

                default :
                    return apply_filters( \'theux_metabox_api_sanitize_option\', $new_value, $field, $setting );
                    break;
            }
        }

        // Sanitize hex color (taken from WP core).
        function sanitize_hex_color( $color ) {

            if ( \'\' === $color )
                return \'\';

            if ( preg_match(\'|^#([A-Fa-f0-9]{3}){1,2}$|\', $color ) )
                return $color;

            return null;
        }


        /**
         * Enqueue helper functions. 
         * These functions will load the necessary javascript code.
         */

        // Color picker.
        public function color_picker_js() {

            echo \'<script>\';
            echo \'jQuery(document).ready(function($){\';
            echo \'$(".hd-color-picker").wpColorPicker();\';
            echo \'});\';
            echo \'</script>\';

        } // End of function color_picker_js()

        // Upload image.
        public function upload_js() {
            echo \'<script>\';
            echo \'jQuery(document).ready(function($){\';
            echo \'$("body").on("click", ".hd-upload-button", function(e) {\';
            echo \'e.preventDefault();\';
            echo \'var upload_input = $(this).siblings(".hd-upload-input"),\';
            echo \'hd_uploader;\';
            echo \'if (hd_uploader) {\';
            echo \'hd_uploader.open();\';
            echo \'return;\';
            echo \'}\';
            echo \'hd_uploader = wp.media.frames.file_frame = wp.media({\';
            echo \'title: "Upload Media",\';
            echo \'button: {\';
            echo \'text: "Select",\';
            echo \'},\';
            echo \'multiple: false\';
            echo \'});\';
            echo \'hd_uploader.on("select", function() {\';
            echo \'var media_file = hd_uploader.state().get("selection").first().toJSON();\';
            echo \'upload_input.val(media_file.url);\';
            echo \'});\';
            echo \'hd_uploader.open();\';
            echo \'});\';
            echo \'});\';
            echo \'</script>\';
        } // End of function upload_js()


    } // TheUx_Metabox_API end
}; // class_exists check
如何使用的示例:

$layoutimg = array(
    \'default\'       => get_template_directory_uri() . \'/assets/images/\'.\'mb-default.png\',
    \'one-col\'       => get_template_directory_uri() . \'/assets/images/\'.\'mb-1c.png\',
    \'two-col-left\'  => get_template_directory_uri() . \'/assets/images/\'.\'mb-2cl.png\',
    \'two-col-right\' => get_template_directory_uri() . \'/assets/images/\'.\'mb-2cr.png\'
);

// ========
// = Post =
// ========

$example_options_post = array(
    \'metabox_title\' =>  __(\'Layout Options\',\'domain\'),// Metabox Title
    \'metabox_id\'    => \'post_metabox\',   // Unique metabox id. it is alphanumeric and does not contains spaces.
    \'post_type\'     => \'post\',       // Post Type : you can also define as array. array( \'post\', \'page\' )
    \'context\'       => \'normal\',                    // Metabox Context. Should be any of these \'normal\', \'advanced\' or \'side\'
    \'priority\'      => \'high\',                      // Metabox Priority. Should be any of these \'high\', \'core\', \'default\' or \'low\',
);

$example_fields_post = array(
    \'hd_radio_meta\' => array(
        \'title\'   => __(\'Layout\',\'domain\'),
        \'type\'    => \'radio_image\',
        \'choices\' => $layoutimg,
        \'desc\'    => \'<em>\'.__(\'Select the layout you want on this specific page.\',\'domain\').\'</em>\',
        \'sanit\'   => \'nohtml\',
    )   
);

$example_metabox_post = new TheUx_Metabox_API( $example_options_post, $example_fields_post );

1 个回复
SO网友:Dharmang

问题似乎出现在metabox类api定义的第279行,下面是您的代码:

\'<img src="\'.$label.\'" class="optionimg \'.$selected_value.\'" onclick="document.getElementById(\\
\'\'.$field[\'id\'].$choices.\'\\\').checked=true" style="display:inline-block;" /><input type="radio" 
name="%s" id="%s" value="%s" style="display:none;"/>\',
$choices 范围中没有定义变量(WAMP引发的错误),我认为应该替换$field[\'id\'].$choices 具有$value 如下代码所示:

\'<img src="\'.$label.\'" class="optionimg \'.$selected_value.\'" onclick="document.getElementById(\\
\'\'.$value.\'\\\').checked=true" style="display:inline-block;" /><input type="radio"
name="%s" id="%s" value="%s" style="display:none;"/>\',
希望有帮助。

结束

相关推荐

Php-用于新POST和编辑POST的条件语句

这个问题是在为编辑创建自定义元框时出现的。php页面。是否有条件语句针对已经存在的帖子和尚未创建的帖子?想法:If editing post (post exists) { // Display custom input field } else if adding post (post does not exist) // Hide custom input field } 此代码段将在自定义元框中使用。我不太确定要搜索什么,因为它似乎很广泛。。。最简单(也