Can i categorise my meta box?

时间:2013-09-02 作者:Bogdan Bătrânu

我有这个密码

<?php
$prefix = \'wtf_\';

$meta_box = array(
    \'id\' => \'propertybox\',
    \'title\' => \'Property listing details\',
    \'page\' => \'listings\',
    \'context\' => \'normal\',
    \'priority\' => \'high\',
    \'fields\' => array(
            array(
            \'name\' => \'Propert ID number\',
            \'desc\' => \'Enter a property ID number, if any \',
            \'id\' => $prefix . \'pid\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),


        array(
            \'name\' => \'Bath\',
            \'desc\' => \'Number of bathrooms.\',
            \'id\' => $prefix . \'bath\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'An\',
            \'desc\' => \'Anul constructiei\',
            \'id\' => $prefix . \'an\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Etaj\',
            \'desc\' => \'Etajul\',
            \'id\' => $prefix . \'etaj\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Balcone\',
            \'desc\' => \'Numar balcoane\',
            \'id\' => $prefix . \'balcon\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Parcare\',
            \'desc\' => \'Numar locuri de parcare\',
            \'id\' => $prefix . \'parcare\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Suprafata totala\',
            \'desc\' => \'Suprafata totala a terenului (Casa/vila)\',
            \'id\' => $prefix . \'suprafatatotala\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Front stradal\',
            \'desc\' => \'Suprafata front stradal\',
            \'id\' => $prefix . \'front\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Suprafata curte libera \',
            \'desc\' => \'Suprafata curte libera \',
            \'id\' => $prefix . \'suprafatacurte\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Amprenta casei \',
            \'desc\' => \'Suprafata amprentei  \',
            \'id\' => $prefix . \'amprenta\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Regim inaltime\',
            \'desc\' => \'Regim inaltime  \',
            \'id\' => $prefix . \'inaltime\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Certificat urbanism \',
            \'desc\' => \'certificat urbanism\',
            \'id\' => $prefix . \'certificat\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Asking price\',
            \'desc\' => \'Enter the actual asking price \',
            \'id\' => $prefix . \'price\',
            \'type\' => \'text\',
            \'std\' => \'\'
        )


    ),

);


add_action(\'admin_menu\', \'mytheme_add_box\');

// Add meta box
function mytheme_add_box() {
    global $meta_box;

    add_meta_box($meta_box[\'id\'], $meta_box[\'title\'], \'mytheme_show_box\', $meta_box[\'page\'], $meta_box[\'context\'], $meta_box[\'priority\']);
}

// Callback function to show fields in meta box
function mytheme_show_box() {
    global $meta_box, $post;

    // Use nonce for verification
    echo \'<input type="hidden" name="mytheme_meta_box_nonce" value="\', wp_create_nonce(basename(__FILE__)), \'" />\';

    echo \'<table class="form-table">\';

    foreach ($meta_box[\'fields\'] as $field) {
        // get current post meta data
        $meta = get_post_meta($post->ID, $field[\'id\'], true);

        echo \'<tr>\',
                \'<th style="width:20%"><label for="\', $field[\'id\'], \'">\', $field[\'name\'], \'</label></th>\',
                \'<td>\';
        switch ($field[\'type\']) {
            case \'text\':
                echo \'<input type="text" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'" value="\', $meta ? $meta : $field[\'std\'], \'" size="30" style="width:97%" />\',
                    \'<br />\', $field[\'desc\'];
                break;
            case \'textarea\':
                echo \'<textarea class="theEditor" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'" cols="60" rows="4" style="width:97%">\', $meta ? $meta : $field[\'std\'], \'</textarea>\',
                    \'<br />\', $field[\'desc\'];

                break;
            case \'select\':
                echo \'<select name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'">\';
                foreach ($field[\'options\'] as $option) {
                    echo \'<option\', $meta == $option ? \' selected="selected"\' : \'\', \'>\', $option, \'</option>\';
                }
                echo \'</select>\',
                \'<br />\', $field[\'desc\'];
                break;
            case \'radio\':
                foreach ($field[\'options\'] as $option) {
                    echo \'<input type="radio" name="\', $field[\'id\'], \'" value="\', $option[\'value\'], \'"\', $meta == $option[\'value\'] ? \' checked="checked"\' : \'\', \' />\', $option[\'name\'];
                }
                break;
            case \'checkbox\':
                echo \'<input type="checkbox" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'"\', $meta ? \' checked="checked"\' : \'\', \' />\';
                break;
        }
        echo    \'<td>\',
            \'</tr>\';
    }

    echo \'</table>\';
}

add_action(\'save_post\', \'mytheme_save_data\');

// Save data from meta box
function mytheme_save_data($post_id) {
    global $meta_box;

    // verify nonce
    if (!wp_verify_nonce($_POST[\'mytheme_meta_box_nonce\'], basename(__FILE__))) {
        return $post_id;
    }

    // check autosave
    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) {
        return $post_id;
    }

    // check permissions
    if (\'page\' == $_POST[\'post_type\']) {
        if (!current_user_can(\'edit_page\', $post_id)) {
            return $post_id;
        }
    } elseif (!current_user_can(\'edit_post\', $post_id)) {
        return $post_id;
    }

    foreach ($meta_box[\'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);
        }
    }
}

?>
我希望前3个(房产id号,bath,an)在房产清单中分类,其他的在豪宅清单中详细分类

enter image description here

我已经这样做了:但它不会显示第一个框,现在显示的是propertybox,而只是mansionbox

<?php
$prefix = \'wtf_\';

$meta_box = array(
    \'id\' => \'propertybox\',
    \'title\' => \'Property listing details\',
    \'page\' => \'listings\',
    \'context\' => \'normal\',
    \'priority\' => \'high\',
    \'fields\' => array(
            array(
            \'name\' => \'Propert ID number\',
            \'desc\' => \'Enter a property ID number, if any \',
            \'id\' => $prefix . \'pid\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),


        array(
            \'name\' => \'Bath\',
            \'desc\' => \'Number of bathrooms.\',
            \'id\' => $prefix . \'bath\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),
    ),

);

$meta_box = array(
    \'id\' => \'mansionbox\',
    \'title\' => \'mansion listing details\',
    \'page\' => \'listings\',
    \'context\' => \'normal\',
    \'priority\' => \'high\',
    \'fields\' => array(      
        array(
            \'name\' => \'An\',
            \'desc\' => \'Anul constructiei\',
            \'id\' => $prefix . \'an\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Etaj\',
            \'desc\' => \'Etajul\',
            \'id\' => $prefix . \'etaj\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Balcone\',
            \'desc\' => \'Numar balcoane\',
            \'id\' => $prefix . \'balcon\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Parcare\',
            \'desc\' => \'Numar locuri de parcare\',
            \'id\' => $prefix . \'parcare\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Suprafata totala\',
            \'desc\' => \'Suprafata totala a terenului (Casa/vila)\',
            \'id\' => $prefix . \'suprafatatotala\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Front stradal\',
            \'desc\' => \'Suprafata front stradal\',
            \'id\' => $prefix . \'front\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Suprafata curte libera \',
            \'desc\' => \'Suprafata curte libera \',
            \'id\' => $prefix . \'suprafatacurte\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Amprenta casei \',
            \'desc\' => \'Suprafata amprentei  \',
            \'id\' => $prefix . \'amprenta\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Regim inaltime\',
            \'desc\' => \'Regim inaltime  \',
            \'id\' => $prefix . \'inaltime\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Certificat urbanism \',
            \'desc\' => \'certificat urbanism\',
            \'id\' => $prefix . \'certificat\',
            \'type\' => \'text\',
            \'std\' => \'\'
        ),      

        array(
            \'name\' => \'Asking price\',
            \'desc\' => \'Enter the actual asking price \',
            \'id\' => $prefix . \'price\',
            \'type\' => \'text\',
            \'std\' => \'\'
        )


    ),

);

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

你在问题中发布的代码非常非常不完整,无论如何,我会尽力给你一个答案。

您可以根据需要定义任意多个元框,并在每个元框中放置所需的字段。例如:

add_action( \'add_meta_boxes\', \'my_meta_boxes\' );
function my_meta_boxes(){
    //We define the two metaboxes I want
    add_meta_box("propertybox", "Property Options", "propertybox", "listings", "normal", "high");
    add_meta_box("mansionbox", "Mansion Options", "mansionbox", "listings", "normal", "high");
 }

//Function for propertybox
function propertybox(){
   //Write here the HTML for the output of the "Property" metabox
}

//Function for mansionbox
function mansionbox(){
   //Write here the HTML for the output of the "Mansion" metabox
}
使用此方法调整代码(功能齐全):

$prefix = \'wtf_\';

$property_fields = array(
         array(
            \'name\' => \'Propert ID number\',
            \'desc\' => \'Enter a property ID number, if any \',
            \'id\'   =>   $prefix.\'pid\',
            \'type\' => \'text\',
            \'std\'   => \'\'
         ),
         array(
            \'name\' => \'Bath\',
            \'desc\' => \'Number of bathrooms.\',
            \'id\'   => $prefix.\'bath\',
            \'type\' => \'text\',
            \'std\'  => \'\'
         ),      
         array(
             \'name\' => \'An\',
             \'desc\' => \'Anul constructiei\',
             \'id\'   => $prefix.\'an\',
             \'type\' => \'text\',
             \'std\'  => \'\'
         ));

$mansion_fields = array(    

    array(
        \'name\' => \'Etaj\',
        \'desc\' => \'Etajul\',
        \'id\' => $prefix . \'etaj\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Balcone\',
        \'desc\' => \'Numar balcoane\',
        \'id\' => $prefix . \'balcon\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Parcare\',
        \'desc\' => \'Numar locuri de parcare\',
        \'id\' => $prefix . \'parcare\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Suprafata totala\',
        \'desc\' => \'Suprafata totala a terenului (Casa/vila)\',
        \'id\' => $prefix . \'suprafatatotala\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Front stradal\',
        \'desc\' => \'Suprafata front stradal\',
        \'id\' => $prefix . \'front\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Suprafata curte libera \',
        \'desc\' => \'Suprafata curte libera \',
        \'id\' => $prefix . \'suprafatacurte\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Amprenta casei \',
        \'desc\' => \'Suprafata amprentei  \',
        \'id\' => $prefix . \'amprenta\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),        

    array(
        \'name\' => \'Regim inaltime\',
        \'desc\' => \'Regim inaltime  \',
        \'id\' => $prefix . \'inaltime\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Certificat urbanism \',
        \'desc\' => \'certificat urbanism\',
        \'id\' => $prefix . \'certificat\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ),      

    array(
        \'name\' => \'Asking price\',
        \'desc\' => \'Enter the actual asking price \',
        \'id\' => $prefix . \'price\',
        \'type\' => \'text\',
        \'std\' => \'\'
    ));

add_action( \'add_meta_boxes\', \'my_meta_boxes\' );
function my_meta_boxes(){
    //Don\'t forget to change "post" with post_type where you want to add the metaboxes
    add_meta_box("propertybox", "Property Options", "propertybox", "listings", "normal", "high");
    add_meta_box("mansionbox", "Mansion Options", "mansionbox", "listings", "normal", "high");
 }

function propertybox(){
    global $prefix;
    global $property_fields;
   //Put here the fields you want display inside the "Property options" box.
    build_fieds($property_fields);
}

function mansionbox(){
    global $prefix;
    global $mansion_fields;

    build_fieds($mansion_fields);
}

function build_fieds($fields){
     global $post;

     echo \'<table class="form-table">\';

foreach ($fields as $field) {
    // get current post meta data
    $meta = get_post_meta($post->ID, $field[\'id\'], true);

    echo \'<tr>\',
            \'<th style="width:20%"><label for="\', $field[\'id\'], \'">\', $field[\'name\'], \'</label></th>\',
        \'<td>\';
    switch ($field[\'type\']) {
        case \'text\':
            echo \'<input type="text" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'" value="\', $meta ? $meta : $field[\'std\'], \'" size="30" style="width:97%" />\',
            \'<br />\', $field[\'desc\'];
            break;
        case \'textarea\':
            echo \'<textarea class="theEditor" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'" cols="60" rows="4" style="width:97%">\', $meta ? $meta : $field[\'std\'], \'</textarea>\',
            \'<br />\', $field[\'desc\'];

            break;
        case \'select\':
            echo \'<select name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'">\';
            foreach ($field[\'options\'] as $option) {
                echo \'<option\', $meta == $option ? \' selected="selected"\' : \'\', \'>\', $option, \'</option>\';
        }
            echo \'</select>\',
        \'<br />\', $field[\'desc\'];
            break;
        case \'radio\':
            foreach ($field[\'options\'] as $option) {
                echo \'<input type="radio" name="\', $field[\'id\'], \'" value="\', $option[\'value\'], \'"\', $meta == $option[\'value\'] ? \' checked="checked"\' : \'\', \' />\', $option[\'name\'];
        }
            break;
        case \'checkbox\':
            echo \'<input type="checkbox" name="\', $field[\'id\'], \'" id="\', $field[\'id\'], \'"\', $meta ? \' checked="checked"\' : \'\', \' />\';
            break;
    }
    echo    \'<td>\',
        \'</tr>\';
}

 echo \'</table>\';
}

add_action(\'save_post\', \'mytheme_save_data\');

// Save data from meta box
function mytheme_save_data($post_id) {

    global $mansion_fields;
    global $property_fields;

    // check autosave
    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE) {
        return $post_id;
    }

    // check permissions
    if (\'page\' == $_POST[\'post_type\']) {
        if (!current_user_can(\'edit_page\', $post_id)) {
            return $post_id;
        }
    } elseif (!current_user_can(\'edit_post\', $post_id)) {
        return $post_id;
    }

    foreach ($property_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);
        }
     }

    foreach ($mansion_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);
       }
     }
}

SO网友:gmazzap

你的问题是$meta_box = array( 用于两个元数据库,因此$meta_box 变量在第二次赋值中被重写,当然php知道您想要添加一个元框,而不是两个元框。

你必须这样做:

$metaboxes = array();

$prefix = \'wtf_\';

$metaboxes[] = array(
  \'id\' => \'propertybox\',
  .. other settings here
);

$metaboxes[] = array(
  \'id\' => \'mansionbox\',
  .. other settings here
);

foreach ( $metaboxes as $metabox ) {
  // put here the code you are using to add the metabox
}

结束