Imagine încărcată nu apare în tipul de postare personalizat

16 oct. 2013, 16:07:11
Vizualizări: 2.29K
Voturi: 1

Scriu un plugin care ar trebui să permită utilizatorilor să creeze un tip de postare personalizat numit reseller și să atașeze o imagine. Imaginea este încărcată în folderul uploads și apare în biblioteca de media cu un thumbnail gol. Imaginea nu este vizibilă nici în lista de 'resellers' din interfața de administrare pentru tipul de postare personalizat.

Poate cineva să vadă ce am omis? Funcțiile relevante încep de la linia 362 aici:

https://gist.github.com/codecowboy/80fd6363c58558a74c9e

Secțiunea relevantă:

   public function wps_reseller_cpt() {
        $labels = array(
            'name'               => _x( 'WPS Resellers', 'post type general name' ),
            'singular_name'      => _x( 'WPS Reseller', 'post type singular name' ),
            'add_new'            => _x( 'Add New', 'book' ),
            'add_new_item'       => __( 'Add New Reseller' ),
            'edit_item'          => __( 'Edit Reseller' ),
            'new_item'          => __( 'New Reseller' ),
            'all_items'          => __( 'All Resellers' ),
            'view_item'          => __( 'View Reseller' ),
            'search_items'       => __( 'Search Resellers' ),
            'not_found'          => __( 'No resellers found' ),
            'not_found_in_trash' => __( 'No Reseller found in the Trash' ),
            'parent_item_colon'  => '',
            'menu_name'          => 'Resellers'
        );
        $args = array(
            'labels'        => $labels,
            'description'   => 'Conține datele despre reselleri și reselleri specifici',
            'public'        => true,
            'menu_position' => 50,
            'supports'      => array( 'title', 'editor','image', 'thumbnail', 'custom-fields' ),
            'has_archive'   => false,
        );
        register_post_type( 'wps-reseller', $args );
    }

    public function create_reseller_profile_form(){
        require_once plugin_dir_path( __FILE__ ) . 'views/public-create_reseller_profile_form.php';
    }

    public function intercept_reseller_profile_form() {
        if ( !empty( $_POST['wps-reseller-user-submission'] ) ) {
            $this->wps_reseller_process_form();
        } else {
            return $template;
        }
    }

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

        if ( wp_verify_nonce( $_POST['reseller_user_form'], 'add_reseller_form') &&
            !empty( $_POST['reseller-title'] ) &&
            !empty( $_POST['reseller-description'] ) &&
            !empty( $_FILES['reseller-image']) )
        {
            $file = $_FILES['reseller-image'];
            $uploads = wp_upload_dir();
            $new_reseller_profile_data = array(
                'post_status' => 'draft',
                'post_title' => $_POST['reseller-title'],
                'post_content' => $_POST['reseller-description'],
                'post_type' => 'wps-reseller'
            );

            $file_errors = $this->wps_parse_file_errors($file);
            $upload_overrides = array( 'test_form' => FALSE );
            if($file_errors['error'] == 0) {
                if($new_reseller_id = wp_insert_post( $new_reseller_profile_data )){
                    $uploaded_file = wp_handle_upload( $file, $upload_overrides );

                    $wp_filetype = wp_check_filetype( basename( $uploaded_file['file'] ), null );
                    $attachment = array(
                        'post_mime_type' => $wp_filetype['type'],
                        'post_title' => preg_replace('/\.[^.]+$/', '', basename( $uploaded_file['file'] ) ),
                        'post_content' => '',
                        'post_author' => '',
                        'post_status' => 'inherit',
                        'post_type' => 'attachment',
                        'post_parent' => $new_reseller_id,
                        'guid' => $uploads['baseurl'] . $uploads['subdir'] . '/' . $file['name']
                    );
echo $uploads['baseurl'].'<br />';
echo $file['name'].'<br />';
var_dump($uploads); exit;

                    $attachment_id = wp_insert_post( $attachment );
                    $attach_data = wp_generate_attachment_metadata( $attachment_id, $uploaded_file['file'] );

                    // actualizează metadatele atașamentului
                    wp_update_attachment_metadata( $attachment_id,  $attach_data );
                    set_post_thumbnail( $new_reseller_id, $attachment_id );
                }
            }
        }
    }

    protected function wps_parse_file_errors($file){
        define('MAX_UPLOAD_SIZE', 200000);
        define('TYPE_WHITELIST', serialize(array(
            'image/jpeg',
            'image/png',
            'image/gif'
        )));

        $result = array();
        $result['error'] = 0;

        if($file['error']){
            $result['error'] = "Nu a fost încărcat niciun fișier sau a apărut o eroare la încărcare!";
            return $result;
        }
        $image_data = getimagesize($file['tmp_name']);

        if(!in_array($image_data['mime'], unserialize(TYPE_WHITELIST))){
            $result['error'] = 'Imaginea ta trebuie să fie un jpeg, png sau gif!';
        }elseif(($file['size'] > MAX_UPLOAD_SIZE)){
            $result['error'] = 'Imaginea ta a fost ' . $file['size'] . ' bytes! Nu trebuie să depășească ' . MAX_UPLOAD_SIZE . ' bytes.';
        }
        return $result;
    }

Întrebări:

  1. de ce thumbnail-ul este gol în biblioteca de media? Iată ce se încarcă:

  1. Cum pot face ca imaginea să apară în interfața de administrare?

Dacă adaug fișiere în bibliotecă folosind managerul de media, thumbnail-urile și imaginile apar așa cum este de așteptat.

Dacă este relevant, acesta este un instalat multisite.

3
Comentarii

Te rog să postezi doar codul relevant aici. ... știi asta.

kaiser kaiser
16 oct. 2013 16:55:47

@kaiser știam? gata.

codecowboy codecowboy
16 oct. 2013 17:19:03

După 25 de întrebări presupunem că deja știi :)

kaiser kaiser
16 oct. 2013 17:52:36
Toate răspunsurile la întrebare 1
0

Încearcă acest cod pentru atașamentul tău

 $uploaded_file = wp_handle_upload( $file, $upload_overrides );
 $attachment = array(
        'post_mime_type' => $uploaded_file['type'],
        'post_title' => preg_replace('/\.[^.]+$/', '', basename( $uploaded_file['file'] ) ),
        'post_content' => '',
        'post_author' => '',
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_parent' => $new_reseller_id,
        'guid' => $uploaded_file['file']
    );
 $attachment_id = wp_insert_attachment( $attachment, $uploaded_file['file'] );
 $attach_data = wp_generate_attachment_metadata( $attachment_id, $uploaded_file['file'] );

 // actualizează metadatele atașamentului
 wp_update_attachment_metadata( $attachment_id,  $attach_data );
 //Setează ca imagine reprezentativă
 set_post_thumbnail ($new_reseller_id, $attachment_id );

Pentru a obține imaginea reprezentativă a postării

dacă ești în buclă, atunci

  the_post_thumbnail

îți va afișa imaginea reprezentativă. altfel folosește

   get_the_post_thumbnail ( $new_reseller_id )
17 oct. 2013 13:18:05