将所选的图像文件输入设置为来自wp前端的特色图像

时间:2013-10-16 05:24:59

标签: image wordpress forms

情景:我允许从前端创建帖子。该表单还有四个图像上传字段。我使用下面粘贴的代码作为图像附件并设置后缩略图。

//insert attachments
    if ($_FILES) {
    foreach ($_FILES as $file => $array) {
        $newupload = insert_attachment($file,$pid);
        }
        } 


 //attachment helper function   
 function insert_attachment($file_handler,$post_id,$setthumb='false') {
    if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK){ return __return_false(); 
        } 
        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        require_once(ABSPATH . "wp-admin" . '/includes/file.php');
        require_once(ABSPATH . "wp-admin" . '/includes/media.php');

        $attach_id = media_handle_upload( $file_handler, $post_id );
        //set post thumbnail
        if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id); //you will need to comment out this line if you use my solution
        return $attach_id;//you will need to comment out this line if you use my solution
            }

通过此代码设置的缩略图后/精选图片是上传的最新图片。我尝试了谷歌搜索“从前端wordpress设置后缩略图”并通过大量文章擦过,但没有一个接近我在这里问。我在SE上遇到的关于前端发布的大多数主题,都是关于设置特色图片或关于多个上传的讨论。我还检查了提示的所有建议的问题,而我正在写这个问题只是为了确定它是否曾被问过。

如果重要,这里是表格中使用的html,相当标准。

<input type="file" name="image-one" id="image-one"/>
<input type="file" name="image-two" id="image-two"/>
<input type="file" name="image-three" id="image-three"/>

请求:如果我能得到一个有助于将任何选定的图像输入字段分配为特征图像的解决方案,那将是很好的,但此时,至少我需要设置FIRST图像输入设置作为特色图片/后缩略图。请提出解决方案。

  

底线是我在设置缩略图后没有问题   但问题是可以选择任何上传的   图像作为缩略图后或至少第一个图像,而不是   最后一张图像由当前代码设置。


进展报告: 永远不知道它是否有助于解决这个问题。但是当我打印_($ newupload)时,我得到了id,例如。 54287,保存为缩略图后的最后一个图像输入附件。

This thread建议使用帖子中找到的第一张图片来设置精选图片,这样我就想到了这个想法。但是代码似乎也没有用。

$attachments = get_children(array(
            'post_parent' => $pid, 
            'post_status' => 'inherit', 
            'post_type' => 'attachment', 
            'post_mime_type' => 'image', 
            'order' => 'ASC', 
            'orderby' => 'ID'
        ));
        if ($attachments) {
            foreach ($attachments as $attachment) {
                set_post_thumbnail($pid, $attachment->ID);
                break;
            }

结束语:进度报告中的代码暂时为我完成了工作,即将第一个图像文件输入设置为精选图像/后缩略图和我我甚至不确定这是否是最好的方法。我仍然在寻找一种解决方案,可以灵活地选择任何图像输入字段作为特色图像。如果您决定使用此功能,请记住注释掉原始代码中的倒数第二行和第三行。

2 个答案:

答案 0 :(得分:0)

使用_thumbnail_id保存post_meta作为meta_key,将attach_id保存为meta_value不会使该图像成为特色图像,您可以使用wp_insert_attachment来帮助您解决这个问题。请务必阅读其中的codex和示例。该功能应与wp_update_attachment_metadata()wp_generate_attachment_metadata()一起使用,这样您的功能图像将通过wordpress正确创建。

编辑:
我已经查看了你的代码,我认为在这种情况下使用它然后我的schetch更容易。我已经为insert_attachment添加了文件计数和参数。检查此代码,让我知道会发生什么。

示例:

<?php
//insert attachments
if ($_FILES) {
array_reverse($_FILES);
$i = 0;//this will count the posts
foreach ($_FILES as $file => $array) {
    if ($i == 0) $set_feature = 1; //if $i ==0 then we are dealing with the first post
    else $set_feature = 0; //if $i!=0 we are not dealing with the first post
    $newupload = insert_attachment($file,$pid, $set_feature);
    $i++; //count posts
    }
    } 


//attachment helper function   
function insert_attachment($file_handler,$post_id,$setthumb='false') {
    if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK){ return __return_false(); 
    } 
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');

    $attach_id = media_handle_upload( $file_handler, $post_id );
    //set post thumbnail if setthumb is 1
    if ($setthumb == 1) update_post_meta($post_id,'_thumbnail_id',$attach_id);
    return $attach_id;
        }
  ?>

答案 1 :(得分:0)

我们可以使用以下功能设置来自前端的后期特色图像, 很简单你需要调用这个函数

post_imgs_update($ new_post_id);

创建新帖后

。并在functions.php

中添加以下功能
if ( ! function_exists( 'post_imgs_update' ) ) :
        function post_imgs_update($new_post_id) {

            $data = array();
            $attachment_ids = array();
            // code for save featured image
            if( isset( $_POST['nonce'] ) && wp_verify_nonce( $_POST['nonce'], 'image_upload' ) ){  // here nonce text is "image_upload" you need to add in form
                    $files = reArrayFiles($_FILES['files']);

                if(!empty($_FILES['files'])){
                    //$i = 0; 
                    $set_featured_img = 0 ;

                    foreach( $files as $file ){
                        if( is_array($file) ){
                            $attachment_id = upload_user_file( $file, basename($file['name']) );
                            if ( is_numeric($attachment_id) ) {
                                if ($set_featured_img == '0') {
                                    set_post_thumbnail($new_post_id, $attachment_id);
                                    $set_featured_img++;
                                    $attachment_ids[] = $attachment_id;
                                }
                                else{
                                    $attachment_ids[] = $attachment_id;
                                }

                            }
                        }
                    }
                    //add to array
                    $mediaurl = array();
                    foreach ($attachment_ids as $img_id) {
                        $imgurl = wp_get_attachment_url( $img_id );
                        $image_gallery[$img_id] = $imgurl;
                    }

                    update_post_meta( $new_post_id, '_stw_property_multi_images', $image_gallery);      // 2nd arg field key
                }

            } 
            else {
                    $data['status'] = false;
                    $data['message'] = __('Nonce verify failed','realestate');
            }

            return $new_post_id;

        }
    endif;

    if ( ! function_exists( 'reArrayFiles' ) ) :
        function reArrayFiles(&$file_post) {
            $file_ary = array();
            $file_count = count($file_post['name']);
            $file_keys = array_keys($file_post);
            for ($i=0; $i<$file_count; $i++) {
                foreach ($file_keys as $key) {
                    $file_ary[$i][$key] = $file_post[$key][$i];
                }
            }
            return $file_ary;
        }
    endif;

    if ( ! function_exists( 'upload_user_file' ) ) :
        function upload_user_file( $file = array(), $title = false ) {
            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_content' => '',
                    'post_type' => 'attachment',
                    'post_status' => 'inherit',
                    'guid' => $file_return['url']
                );
                if($title){
                    $attachment['post_title'] = $title;
                }
                $attachment_id = wp_insert_attachment( $attachment, $filename );
                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;
        }
    endif;


    function my_handle_attachment($file_handler,$post_id,$set_thu=false) {
        $attachurlarray = array();
        // check to make sure its a successful upload
        if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();

        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        require_once(ABSPATH . "wp-admin" . '/includes/file.php');
        require_once(ABSPATH . "wp-admin" . '/includes/media.php');

        $attach_id = media_handle_upload( $file_handler, $post_id );
        return $attach_id;  
    }