janochen
  • 0
Мастер

Как добавить текстовое поле только в одно из полей этого пользовательского метабокса?

  • 0

Это код, который я использовал для создания мета-боксов:

<?php

$key = "project";
$meta_boxes = array(
    "project_services" => array(
        "name" => "project_services",
        "title" => "Services",
        "description" => "List the services provided for the project."),
    "project_name" => array(
        "name" => "project_name",
        "title" => "Name",
        "description" => "Write the name of the project."),
    "project_overview" => array(
        "name" => "project_overview",
        "title" => "Overview",
        "description" => "Write an overview of the project.")
    );

function create_meta_box() {
    global $key;

    if( function_exists( 'add_meta_box' ) ) {
        add_meta_box( 'new-meta-boxes', ucfirst( $key ) . ' Description', 'display_meta_box', 'post', 'normal', 'high' );
    }
}

function display_meta_box() {
    global $post, $meta_boxes, $key;
?>

<div class="form-wrap">

<?php
    wp_nonce_field( plugin_basename( __FILE__ ), $key . '_wpnonce', false, true );

    foreach($meta_boxes as $meta_box) {
        $data = get_post_meta($post->ID, $key, true);
?>

<div class="form-field form-required">
<label for="<?php echo $meta_box[ 'name' ]; ?>"><?php echo $meta_box[ 'title' ]; ?></label>
<input type="text" name="<?php echo $meta_box[ 'name' ]; ?>" value="<?php echo htmlspecialchars( $data[ $meta_box[ 'name' ] ] ); ?>" />
<p><?php echo $meta_box[ 'description' ]; ?></p>
</div>

<?php } ?>

</div>
<?php
}

function save_meta_box( $post_id ) {
    global $post, $meta_boxes, $key;

    foreach( $meta_boxes as $meta_box ) {
        $data[ $meta_box[ 'name' ] ] = $_POST[ $meta_box[ 'name' ] ];
    }

    if ( !wp_verify_nonce( $_POST[ $key . '_wpnonce' ], plugin_basename(__FILE__) ) )
        return $post_id;

    if ( !current_user_can( 'edit_post', $post_id ))
        return $post_id;

    update_post_meta( $post_id, $key, $data );
}

add_action( 'admin_menu', 'create_meta_box' );
add_action( 'save_post', 'save_meta_box' );

?>

Затем я изменил ввод на текстовое поле:

<textarea name="<?php echo $meta_box[ 'name' ]; ?>">
<?php echo htmlspecialchars( $data[ $meta_box[ 'name' ] ] ); ?>
</textarea>

Это превращает все три поля в текстовые области. Я хотел бы сделать только третье поле, project_overview текстовое поле. Какие-либо предложения?

Share
  1. Измените определение массива примерно так, чтобы добавить новый элемент массива, указывающий тип поля.

    "project_overview" => array(
        "name" => "project_overview",
        "title" => "Overview",
        "description" => "Write an overview of the project.",
        "type"=>"textarea")
    

    Затем в вашем коде замените

    <input type="text" name="<?php echo $meta_box[ 'name' ]; ?>" value="<?php echo htmlspecialchars( $data[ $meta_box[ 'name' ] ] ); ?>" />
    

    с чем-то вроде этого

    <? if ( $meta_box['type'] == 'textarea') { ?
       <textarea name="<?php echo $meta_box[ 'name' ]; ?>">
       <?php echo htmlspecialchars( $data[ $meta_box[ 'name' ] ] ); ?>
       </textarea> 
    } 
    else  { ?>
       <input type="text" name="<?php echo $meta_box[ 'name' ]; ?>" 
       value="<?php echo      htmlspecialchars( $data[ $meta_box[ 'name' ] ] ); ?>" />
    } ?>
    

    Лучше, если вы завернете фрагмент кода выше в функцию, например

    function print_meta_box ( $meta_box ) {
      switch (meta_box ['type'] ) {
          case 'textarea':
                .... your code ...
                break;
          default:
      }  
    }
    
    • 0

Оставить ответ

You must login to add an answer.