web-dev-qa-db-fra.com

Modifier la vignette de la publication à l'aide du formulaire de modification de publication

J'essaie de faire en sorte que la miniature de publication soit modifiée si un utilisateur sélectionne un nouveau fichier sur un écran de modification de publication frontale. Ceci est similaire au code que j'utilise pour télécharger des données et définir la vignette de publication sur un front-end pour ajouter un nouveau formulaire de publication:

<?php
$query = new WP_Query( array( 'post_type' => 'properties', 'posts_per_page' => '-1' ) );

if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
  if( isset($_GET['post']) && $_GET['post'] == $post->ID) {         
    $current_post = $post->ID;
    $content = get_the_content();
    $price = get_post_meta($post->ID, 'shru_price', true);
    $address = get_post_meta($post->ID, 'shru_address', true);
    $thumbid = get_post_thumbnail_id( $post->ID );
    $thumbnail = wp_get_attachment_image_src( $thumbid, 'single-image' );
  }
endwhile; endif;
wp_reset_query();

global $current_post;

$postContentError = '';

if (
  isset( $_POST['submitted'] )
  && isset( $_POST['post_nonce_field'] )
  && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' )
) {
  if ( trim( $_POST['postContent'] ) === '' ) {
    $postContentError = 'Please enter a description of this property.';
    $hasError = true;
  }
  $post_information = array(
    'ID' => $current_post,
    'post_content' => $_POST['postContent'],
    'post_type' => 'properties',
    'post_status' => 'publish'
  );
  $post_id = wp_update_post( $post_information );

  function upload_user_file( $file = array() ) {
    global $post_id;        
    require_once( ABSPATH . 'wp-admin/includes/admin.php' );
    $file_return = wp_handle_upload( $file, array('test_form' => false ) );
    if( isset($file_return['error']) || isset($file_return['upload_error_handler']) ) {
      return false;
    } else {
      $filename = $file_return['file'];
      $attachment = array(
        'post_mime_type' => $file_return['type'],
        'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
        'post_content' => '',
        'post_status' => 'inherit',
        'guid' => $file_return['url']
      );
      $attachment_id = wp_insert_attachment($attachment, $file_return['url'], $post_id );
      require_once(ABSPATH . 'wp-admin/includes/image.php');
      $attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
      wp_update_attachment_metadata( $attachment_id, $attachment_data );
      if( 0 < intval( $attachment_id ) ) {
        return $attachment_id;
      }
    }
    return false;
  }

  if( ! empty( $_FILES ) ) {
    foreach( $_FILES as $file ) {
      if( is_array( $file ) ) {
        $attachment_id = upload_user_file( $file );
      }
    }
  }

  $propertyfor = $_POST['propertyfor'];
  $propertytype = $_POST['propertytype'];
  $bedrooms = $_POST['bedrooms'];

  if( $post_id ) {

    // Update Custom Meta
    $price = esc_attr( strip_tags( $_POST['shru_price'] ) );
    update_post_meta( $post_id, 'shru_price', $price);
    $address = esc_attr( strip_tags( $_POST['shru_address'] ) ); 
    update_post_meta( $post_id, 'shru_address', $address );
    update_post_meta ($post_id, '_thumbnail_id', $attachment_id );

    // Update taxonomies        
    wp_set_object_terms( $post_id, $propertyfor, 'propertyfor' );
    wp_set_object_terms( $post_id, $propertytype, 'propertytype' );
    wp_set_object_terms( $post_id, $bedrooms, 'bedrooms' );

    // Redirect
    wp_redirect(home_url('/listings'));
    exit;
  } 
}
?>

La seule différence est que, dans le code ci-dessus, j'essaie d'utiliser:

update_post_meta( $post_id, '_thumbnail_id', $attachment_id );

au lieu de:

set_post_thumbnail( $post_id, $attachment_id );

Pour une raison quelconque, sur l'écran de post-édition, le fichier image n'est même pas téléchargé. Lorsque j'utilise update post meta, il supprime l'ancienne vignette. Je suppose donc que le travail est effectué là-bas, mais comme le fichier n'est pas téléchargé, il ne peut pas le remplacer par un nouveau. La confusion est la raison pour laquelle le fichier est téléchargé à l'aide de la fonction upload_user_file dans l'écran Ajouter un nouveau message, mais pas dans l'écran de modification.

Des idées?

1
CoreyRS

c'est beaucoup plus facile avec la fonction incorporée WordPress media_handle_upload

http://codex.wordpress.org/Function_Reference/media_handle_upload

// These files need to be included as dependencies when on the front end.
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );

// Let WordPress handle the upload.
// Remember, 'my_image_upload' is the name of our file input in our form above.
$attachment_id = media_handle_upload( 'my_image_upload', $_POST['post_id'] );

if ( is_wp_error( $attachment_id ) ) {
    // There was an error uploading the image.
} else {
    // The image was uploaded successfully!
}

Vous devrez spécifier votre nom de contrôle de fichier, puis vous pourrez appeler set_post_thumbnail fonction OR set post meta '_thumbnail_id'

set_post_thumbnail( $post_id, $attachment_id );

EDIT:

Pour une raison quelconque, sur l'écran de post-édition, le fichier image n'est même pas téléchargé.

Pouvez-vous vérifier que vous avez correctement défini l'attribut enctype = "multipart/form-data" sur votre balise de formulaire?

3
Dharmang