2

現在、メタボックスの作成に取り組んでいます。私は次のチュートリアルといくつかの自己適応を使用しました。チュートリアルのリンク:http ://wp.tutsplus.com/tutorials/reusable-custom-meta-boxes-part-1-intro-and-basic-fields/

次のエラーメッセージが表示されます。

注意:未定義のインデックス:/customers/0/d/a/xxx/httpd.www/wordpress/wp-content/plugins/ds-flexslider/includes/cpt-manager.phpの181行目のdsmeta_image注意:未定義のインデックス:dsmeta_image_caption /customers/0/d/a/xxx/httpd.www/wordpress/wp-content/plugins/ds-flexslider/includes/cpt-manager.phpの181行目

変数が存在しないようです。私はMetaboxの配列フィールドを使用しており、正しく理解していればforeachループを作成して説明しています。

この問題はどうですか。メタボックスを保存するときにエラーが発生します...

フィールド配列の設定の一部:

// Create the fields array
$prefix = 'dsmeta_';
$custom_meta_fields = array(
    array(
        'label' => 'Image',
        'desc' => '',
        'id' => $prefix . 'image',
        'type' => 'image'
    ),
    array(
        'label' => 'Image caption',
        'desc' => '',
        'id' => $prefix . 'image_caption',
        'type' => 'text'
    )
);

保存機能の一部:

add_action('save_post', 'dsslider_manager_save_extras');
function dsslider_manager_save_extras($post_id) {
    global $custom_meta_fields;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }

    // loop through fields and save the data
    foreach ($custom_meta_fields as $field) {
        $old = get_post_meta($post_id, $field['id'], true);
        $new = $_POST[$field['id']];
        if ($new && $new != $old) {
            update_post_meta($post_id, $field['id'], $new);
        } elseif ('' == $new && $old) {
            delete_post_meta($post_id, $field['id'], $old);
        }
    } // end foreach
}

リクエスト後に更新

ここで、フィールドのメタボックスを追加します。

    // Add meta box support
// This registers a function to be called when the WordPress admin interface is visited
add_action("admin_init", "dsslider_manager_add_meta");
function dsslider_manager_add_meta(){

    // Create this cool new meta box for Portfolio Options
    add_meta_box("dsslider-meta", "Brandbox Options", "dsslider_manager_meta_options", "brandbox-slider", "normal", "high");
}

そして、これがメタフィールドを構築するための関数です:

function dsslider_manager_meta_options(){

    global $custom_meta_fields, $post;
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
        // (integer) (optional) The post ID whose custom fields will be retrieved. 
        // Default: Current post
        return $post_id;
?>

<div class="dsslider_manager_extras">

    <div class="ds-metabox" data-max_rows="5" data-min_rows="0">

        <table class="meta ds-input-table">

<?php


        foreach ($custom_meta_fields as $field) {
            $custom = get_post_meta($post->ID, $field['id'], true); // Returns a multidimensional array with all custom fields of a particular post or page. 

            // Past HTML markup
?>          

            <tbody class="ui-sortable">
            <?php 

                echo '<tr class="row">';
                echo '<td class="order"></td>';
                echo '<td>';

                switch($field['type']) {
                    // case items will go here

                    // image
                    case 'image':
                        $image = get_template_directory_uri().'/images/image.png';
                        echo '<span class="custom_default_image" style="display:none">'.$image.'</span>';

                        if($custom) { 
                            $image = wp_get_attachment_image_src($custom, 'thumbnail'); 
                            $image = $image[0]; 

                        } // end if statement

                        echo '<img src="' . $image . '" class="custom_preview_image" alt="" />

                        <input type="button" class="button add-image" name="' . $field['id'] . '" value="' . $custom . '"><a href="#" class="remove-image">Remove Image</a>';
                    break;

                    // text
                    case 'text':

                        echo '<input type="text" class="text" name="' . $field['id'] . '" value="' . $custom . '">';

                    break;

                } //end switch

                echo '</td>';
                echo '</tr>';

        } // End foreach loop
             ?>
            </tbody>
        </table><!-- End .meta ds-input-table -->

        <ul class="ds-repeater-footer hl clearfix">
            <li class="right">
                <a href="#" class="repeatable-add ds-button">Add New Slide</a>
            </li>
        </ul><!-- End ul.hl clearfix repeater-footer -->

    </div><!-- End .ds-metabox -->

</div><!-- End .dsslider_manager_extras -->

<?php           
}
4

1 に答える 1

3

問題は、$ custom_meta_fields配列を使用して、入力フィールドを生成し、補完的なキー名を使用して$_POST配列から情報を取得していることです。

これは通常は問題になりませんが、実際には、使用しているフィールドの一部が実際には$_POST配列に情報を渡していないのです。例:

case 'image':
    $image = get_template_directory_uri().'/images/image.png';
    echo '<span class="custom_default_image" style="display:none">'.$image.'</span>';

    if($custom) { 
        $image = wp_get_attachment_image_src($custom, 'thumbnail'); 
        $image = $image[0]; 

    } // end if statement

    echo '<img src="' . $image . '" class="custom_preview_image" alt="" />

    <input type="button" class="button add-image" name="' . $field['id'] . '" value="' . $custom . '"><a href="#" class="remove-image">Remove Image</a>';
break;

//Later on....
foreach ($custom_meta_fields as $field) {
    $old = get_post_meta($post_id, $field['id'], true);
    $new = $_POST[$field['id']]; //<-- BOOM
    if ($new && $new != $old) {
        update_post_meta($post_id, $field['id'], $new);
    } elseif ('' == $new && $old) {
        delete_post_meta($post_id, $field['id'], $old);
    }
} // end foreach

そのforeachループでは、フォームがその特定のキーを渡すことがないため、存在しない変数$_POST['dsmeta_image']を取得しようとしています。簡単な修正は次のようになります。

foreach ($custom_meta_fields as $field) {
    if(isset($_POST[$field['id'])){
        $old = get_post_meta($post_id, $field['id'], true);
        $new = $_POST[$field['id']];
        if ($new && $new != $old) {
            update_post_meta($post_id, $field['id'], $new);
        } elseif ('' == $new && $old) {
            delete_post_meta($post_id, $field['id'], $old);
        }
    }
    else
        continue;
} // end foreach

Buttonタイプの入力フィールドは、$_POST配列に情報を送信しないことにも注意する必要があります。これがあなたの意図であった場合は、隠しフィールドなどを介して必要な情報を送信する必要があります。

お役に立てれば。

于 2012-12-27T21:32:09.213 に答える