Cómo cargar a wordpress mediante programación – problema de guardar archivos

6 minutos de lectura

avatar de usuario
klirr

Tengo datos que recorro, estos datos incluyen el título, el contenido, la ruta al archivo en el servidor y otra información diversa.

El objetivo es recorrer los datos y, en el ciclo, crear una publicación de Worpress con una imagen que tenga post_meta product_image como: add_post_meta ($ post_id, ‘_product_image’, $ added_id, true);

Mi bucle se ve así:

    while($row = $STH->fetch()) {  

        $my_post = array(
          'post_title'    => $row->title,
          'post_content'  => $row->description,
          'post_status'   => 'publish',
          'post_author'   => $current_user->ID,
          'post_category' => array(6)
        );


        // Insert the post into the database
        $post_id = wp_insert_post( $my_post );

        add_post_meta( $post_id, 'product_price', 199, true );
        add_post_meta( $post_id, 'product_sub_price', 20, true);

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

        $filename = $row->image_local_name;

        // Path to the file i want to upload into wordpress.
        $path = ABSPATH . 'add/foo/uploads/' . $row->image_local_name;  // Path to file.
        var_dump($path);

        $file_url = $row->image_url;
        $filename = $row->image_local_name;

        $wp_filetype = wp_check_filetype(basename($filename), null );

        $wp_upload_dir = wp_upload_dir();

        // Path i want to save the image(s).
        $save_path = $wp_upload_dir['basedir'] . $wp_upload_dir['subdir'] . $filename;
        var_dump($save_path);


        $attachment = array(
            'post_author' => $current_user->ID, 
            'post_date' => current_time('mysql'),
            'post_date_gmt' => current_time('mysql'),
            'post_title' => $filename, 
            'post_status' => 'inherit',
            'comment_status' => 'closed',
            'ping_status' => 'closed',
            'post_name' => $filename,                                           
            'post_modified' => current_time('mysql'),
            'post_modified_gmt' => current_time('mysql'),
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'guid' =>  $wp_upload_dir['basedir'] . $filename,   // not sure if this is correct, some advise?
            'post_mime_type' => $wp_filetype['type'],
            'post_excerpt' => '',
            'post_content' => ''
        );


        $attach_id = wp_insert_attachment( $attachment, $save_path, $post_id );

        var_dump($attach_id);

        $attach_data = wp_generate_attachment_metadata( $attach_id, $path );

        var_dump($attach_data);

        $update = wp_update_attachment_metadata( $attach_id,  $attach_data );

        var_dump($update);

        // Add the attach_id to post_meta key: product_image with the value of the attach_id
        add_post_meta( $post_id, '_product_image', $attach_id, true);
    } 

Producción: http://pastebin.com/LpNzc1pP

Parece que está almacenado correctamente en la base de datos, pero las imágenes creadas por wordpress, por ejemplo: carreras de autos-con-tachuelas-incluido-envío gratis-colchón-amp ribb.jpg

La imagen se guarda en seis versiones, eso es correcto, pero no se guardan en uploads/08 donde quiero que se coloquen estas imágenes.

Las imágenes se almacenan aquí:

/Applications/MAMP/htdocs/websites/foo.dev/public_html/add/foo/uploads/

¿Cómo hago para que estas imágenes se guarden en el lugar correcto?

use este código 100% de trabajo

<form method="post" enctype="multipart/form-data">
      <input type="file" name="fileToUpload">
      <input type="submit" name="upload" value="Upload">
</form>
<?php
    if(@$_POST['upload']){
                $file_name = $_FILES['fileToUpload']['name'];
                $file_temp = $_FILES['fileToUpload']['tmp_name'];

                $upload_dir = wp_upload_dir();
                $image_data = file_get_contents( $file_temp );
                $filename = basename( $file_name );
                $filetype = wp_check_filetype($file_name);
                $filename = time().'.'.$filetype['ext'];

                if ( wp_mkdir_p( $upload_dir['path'] ) ) {
                  $file = $upload_dir['path'] . "https://stackoverflow.com/" . $filename;
                }
                else {
                  $file = $upload_dir['basedir'] . "https://stackoverflow.com/" . $filename;
                }

                file_put_contents( $file, $image_data );
                $wp_filetype = wp_check_filetype( $filename, null );
                $attachment = array(
                  'post_mime_type' => $wp_filetype['type'],
                  'post_title' => sanitize_file_name( $filename ),
                  'post_content' => '',
                  'post_status' => 'inherit'
                );

                $attach_id = wp_insert_attachment( $attachment, $file );
                require_once( ABSPATH . 'wp-admin/includes/image.php' );
                $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
                wp_update_attachment_metadata( $attach_id, $attach_data );

                echo $attach_id;
            }

          ?>

Si bien no tengo una solución para su problema específico, veo lo que está tratando de lograr y sugeriría un método alternativo usando la API de WordPress media_handle_sideload() o media_sideload_image() funciones para poner los archivos de imagen en la biblioteca de medios y adjuntarlos a las publicaciones automáticamente.

Así que en lugar de:

    $filename = $row->image_local_name;

    $wp_filetype = wp_check_filetype(basename($filename), null );

    $wp_upload_dir = wp_upload_dir();

    // Path i want to save the image(s).
    $save_path = $wp_upload_dir['basedir'] . $wp_upload_dir['subdir'] . $filename;
    var_dump($save_path);


    $attachment = array(
        'post_author' => $current_user->ID, 
        'post_date' => current_time('mysql'),
        'post_date_gmt' => current_time('mysql'),
        'post_title' => $filename, 
        'post_status' => 'inherit',
        'comment_status' => 'closed',
        'ping_status' => 'closed',
        'post_name' => $filename,                                           
        'post_modified' => current_time('mysql'),
        'post_modified_gmt' => current_time('mysql'),
        'post_parent' => $post_id,
        'post_type' => 'attachment',
        'guid' =>  $wp_upload_dir['basedir'] . $filename,   // not sure if this is correct, some advise?
        'post_mime_type' => $wp_filetype['type'],
        'post_excerpt' => '',
        'post_content' => ''
    );


    $attach_id = wp_insert_attachment( $attachment, $save_path, $post_id );

    var_dump($attach_id);

    $attach_data = wp_generate_attachment_metadata( $attach_id, $path );

    var_dump($attach_data);

    $update = wp_update_attachment_metadata( $attach_id,  $attach_data );

    var_dump($update);

    // Add the attach_id to post_meta key: product_image with the value of the attach_id
    add_post_meta( $post_id, '_product_image', $attach_id, true);

Podrías usar:

$myAttachmentId = media_handle_sideload( $file_url, $post_id );

Eso cargará la imagen en la Biblioteca de medios como un archivo adjunto a la publicación y luego puede convertirla en una “Imagen del producto” al:

$myProductImage = add_post_meta( $post_id, '_product_image', $myAttachmentId, true );

wp_insert_attachment no mueve los archivos a ninguna parte. Debe moverlos usted mismo a la carpeta correcta. Desde el Referencia de funciones de WordPress: “Utilice la ruta absoluta y no la URI del archivo. El archivo DEBE estar en el directorio de carga”.

Recomiendo usar el wp_upload_bits función para mover el archivo ya que la función sabe si su blog está configurado para directorios anuales/mensuales, y le da la ruta y la URL del archivo:

$upload = wp_upload_bits( $filename, null, file_get_contents($path) );
if ( $upload['error'] )
    echo "Failed uploading: " . $upload['error'];

En tus $attachment matriz, uso ['guid'] => $upload['url']después:

$attach_id = wp_insert_attachment( $attachment, $upload['file'], $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $upload['file'] );
$update = wp_update_attachment_metadata( $attach_id, $attach_data );

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad