0

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

//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"/>

请求:如果我能得到一个解决方案,帮助将任何选择的图像输入字段分配为特色图像,那就太好了,但此刻,至少我需要将第一个图像输入设置为特色图像-图像/后缩略图。请提出解决方案。

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


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

该线程建议了一种使用帖子中找到的第一张图片设置特色图片的方法,因此我想到了这个想法。但是代码似乎也不起作用。

$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;
            }

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

4

2 回答 2

0

将带有 _thumbnail_id 的 post_meta 保存为 meta_key 并将 attach_id 保存为 meta_value 不会使该图像成为特色图像,您可以使用wp_insert_attachment它来帮助您很多。确保您阅读了那里的法典和示例。该函数应与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;
        }
  ?>
于 2013-10-16T06:18:22.637 回答
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;  
    }
于 2017-12-04T09:18:27.477 回答