web-dev-qa-db-fra.com

Conserver la valeur des métadonnées d'affichage sur le backend - Custom Metabox

J'essayais d'ajouter un type de message personnalisé et une boîte méta personnalisée. Ce que j'ai fait Mais je suis confronté à un autre problème qui est. Quand je donne une valeur quelconque à la Custom Metabox, j'ai créé sa ne sauvegarde pas les données sur le backend. Cela fonctionne parfaitement sur Frontend.

Maintenant, depuis que je ne conserve pas la valeur dans le backend chaque fois que je mets à jour le message, je dois entrer la valeur à chaque fois.

Voici ce que j'ai fait jusqu'à présent:

function news_post_type() {
  $labels = array(
    'name'               => _x( 'News', 'post type general name' ),
    'singular_name'      => _x( 'News', 'post type singular name' ),
    'add_new'            => _x( 'Add New', 'book' ),
    'add_new_item'       => __( 'Add New' ),
    'edit_item'          => __( 'Edit News' ),
    'new_item'           => __( 'New News' ),
    'all_items'          => __( 'All News' ),
    'view_item'          => __( 'View News' ),
    'search_items'       => __( 'Search News' ),
    'not_found'          => __( 'Not found' ),
    'not_found_in_trash' => __( 'Not found in the Trash' ), 
    'parent_item_colon'  => '',
    'menu_name'          => 'News'
  );
  $args = array(
    'labels'        => $labels,
    'description'   => 'This section contains the News section of the site',
    'public'        => true,
    'menu_position' => 5,
    'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments'),
    'has_archive'   => true,
  );
  register_post_type( 'news', $args ); 
}
add_action( 'init', 'news_post_type' );

et pour le metabox:

add_action( 'add_meta_boxes', 'news_date_box' );

function news_date_box() {
    add_meta_box( 
        'news_date_box',
        __( 'News Date', 'myplugin_textdomain' ),
        'news_date',
        'news',
        'side',
        'high'
    );
}

function news_date( $post ) {

  wp_nonce_field( plugin_basename( __FILE__ ), 'news_date_content_nonce' );

  echo '<input type="text" id="news_date" name="news_date" placeholder="Enter Date"/>';

}

add_action( 'save_post', 'news_date_save' );

function news_date_save( $post_id ) {

  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
  return;

  if ( !wp_verify_nonce( $_POST['news_date_content_nonce'], plugin_basename( __FILE__ ) ) )
  return;

  if ( 'page' == $_POST['post_type'] ) {
    if ( !current_user_can( 'edit_page', $post_id ) )
    return;
  } else {
    if ( !current_user_can( 'edit_post', $post_id ) )
    return;
  }

  $news_date = $_POST['news_date'];
  update_post_meta( $post_id, 'news_date', $news_date );
}

J'ai cherché la solution mais je n'en ai trouvé aucune et je me suis retrouvé ici. Je peux faire une erreur dans le code ci-dessus ou je dois ajouter des codes supplémentaires. Toute suggestion sur la façon de résoudre cette situation.

Merci d'avance.

1
Muhammad Russell

Modifier votre fonction news_date() pour être comme suit:

function news_date( $post ) {

wp_nonce_field( plugin_basename( __FILE__ ), 'news_date_content_nonce' );

// get the current value of 'news_date' to use in the <input>
$value = get_post_meta ($post->ID, 'news_date', true) ;

echo '<input type="text" id="news_date" name="news_date" placeholder="Enter Date" value="' . $value . '"/>';

}

Une autre suggestion serait de changer

add_action( 'save_post', 'news_date_save' );

à

add_action( 'save_post_news', 'news_date_save' );

et alors vous êtes assuré que votre fonction news_date_save() n'est appelée que lorsqu'un article dont le post_type == 'news' est enregistré.

Cela vous permettra de vous débarrasser de if ( 'page' == $_POST['post_type'] ) { if/then/else, car alors la condition dans cette if sera jamais évaluée à vrai.

1