使用前端帖子编辑表单更改帖子缩略图

时间:2014-04-07 作者:CoreyRS

如果用户在前端post编辑屏幕上选择新文件,我将尝试更改post缩略图。这类似于我用来上传数据并在前端添加新帖子表单上设置帖子缩略图的代码:

<?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;
  } 
}
?>
唯一的区别是,在我尝试使用的上述代码中:

update_post_meta( $post_id, \'_thumbnail_id\', $attachment_id );
而不是:

set_post_thumbnail( $post_id, $attachment_id );
由于某些原因,在后期编辑屏幕上,图像文件甚至不会上载。当我使用update post meta时,它会删除旧的缩略图,所以我猜它在那里完成了它的工作,但由于文件没有上载,因此无法用新的缩略图替换它。令人困惑的是,为什么文件使用upload_user_file 功能在添加新帖子屏幕上,但不在编辑帖子屏幕上。

有什么想法吗?

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

使用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!
}
您需要指定文件控件名称,然后可以调用set_post_thumbnail 函数或设置post meta“\\u thumbnail\\u id”

set_post_thumbnail( $post_id, $attachment_id );

EDIT:

由于某些原因,在后期编辑屏幕上,图像文件甚至不会上载。

能否再次检查是否已将enctype=“多部分/表单数据”属性正确设置为表单标记?

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在