Cómo configurar la imagen destacada para una publicación personalizada desde el exterior mediante programación

12

Estoy intentando recuperar e insertar imágenes fuera del entorno de WordPress en una publicación personalizada a través de PHP.

¿Cómo mover / cargar esa imagen en formato de carpeta de fecha y año del directorio de carga de wordpress al igual que lo hace wordpress y configurar esa imagen como imagen destacada contra la publicación personalizada?

¿También para subir imágenes a la galería de publicaciones personalizadas?

Debajo está mi código

$filename = $image['name'];
$target_path = "../wp-content/uploads/";
$target_path = $target_path . $filename;
$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
    'guid' => $wp_upload_dir['baseurl'] . '/' . basename( $filename ),
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
    'post_content' => '',
    'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $attachment, $target_path, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
set_post_thumbnail( $post_id, $attach_id );

He logrado subir la imagen a mi directorio de subidas pero no puedo crear la carpeta de año y fecha. ¿Hay alguna función wp para ello?

    
pregunta Faisal Shehzad 27.05.2013 - 09:21

4 respuestas

23

¿No se puede hacer esto simplemente con media_sideload_image () ?

Parece bastante simple. El único problema es que si no está en el área de administración, debe incluir algunas bibliotecas desde WordPress que incluyen:

// only need these if performing outside of admin environment
require_once(ABSPATH . 'wp-admin/includes/media.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');

// example image
$image = 'http://example.com/logo.png';

// magic sideload image returns an HTML image, not an ID
$media = media_sideload_image($image, $post_id);

// therefore we must find it so we can set it as featured ID
if(!empty($media) && !is_wp_error($media)){
    $args = array(
        'post_type' => 'attachment',
        'posts_per_page' => -1,
        'post_status' => 'any',
        'post_parent' => $post_id
    );

    // reference new image to set as featured
    $attachments = get_posts($args);

    if(isset($attachments) && is_array($attachments)){
        foreach($attachments as $attachment){
            // grab source of full size images (so no 300x150 nonsense in path)
            $image = wp_get_attachment_image_src($attachment->ID, 'full');
            // determine if in the $media image we created, the string of the URL exists
            if(strpos($media, $image[0]) !== false){
                // if so, we found our image. set it as thumbnail
                set_post_thumbnail($post_id, $attachment->ID);
                // only want one image
                break;
            }
        }
    }
}
    
respondido por el GhostToast 29.08.2013 - 21:33
1

Intente esta explicación de subidas usando una ruta y la identificación de la publicación .

Aquí está el código (para legado):

/* Import media from url
 *
 * @param string $file_url URL of the existing file from the original site
 * @param int $post_id The post ID of the post to which the imported media is to be     attached
 *
 * @return boolean True on success, false on failure
 */

function fetch_media($file_url, $post_id) {
require_once(ABSPATH . 'wp-load.php');
require_once(ABSPATH . 'wp-admin/includes/image.php');
global $wpdb;

if(!$post_id) {
    return false;
}

//directory to import to    
$artDir = 'wp-content/uploads/2013/06';

//if the directory doesn't exist, create it 
if(!file_exists(ABSPATH.$artDir)) {
    mkdir(ABSPATH.$artDir);
}

//rename the file
$ext = array_pop(explode("/", $file_url));
$new_filename = 'blogmedia-'.$ext;

if (@fclose(@fopen($file_url, "r"))) { //make sure the file actually exists
    copy($file_url, ABSPATH.$artDir.$new_filename);


    $siteurl = get_option('siteurl');
    $file_info = getimagesize(ABSPATH.$artDir.$new_filename);

    //create an array of attachment data to insert into wp_posts table
    $artdata = array();
    $artdata = array(
        'post_author' => 1, 
        'post_date' => current_time('mysql'),
        'post_date_gmt' => current_time('mysql'),
        'post_title' => $new_filename, 
        'post_status' => 'inherit',
        'comment_status' => 'closed',
        'ping_status' => 'closed',
        'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)),                                            'post_modified' => current_time('mysql'),
        'post_modified_gmt' => current_time('mysql'),
        'post_parent' => $post_id,
        'post_type' => 'attachment',
        'guid' => $siteurl.'/'.$artDir.$new_filename,
        'post_mime_type' => $file_info['mime'],
        'post_excerpt' => '',
        'post_content' => ''
    );

    $uploads = wp_upload_dir();
            $save_path = $uploads['basedir'].'/2013/06/'.$new_filename;

    //insert the database record
    $attach_id = wp_insert_attachment( $artdata, $save_path, $post_id );

    //generate metadata and thumbnails
    if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) {
        wp_update_attachment_metadata($attach_id, $attach_data);
    }

    //optional make it the featured image of the post it's attached to
    $rows_affected = $wpdb->insert($wpdb->prefix.'postmeta', array('post_id' => $post_id, 'meta_key' => '_thumbnail_id', 'meta_value' => $attach_id));
}
else {
    return false;
}

return true;
}
    
respondido por el hitautodestruct 20.06.2013 - 12:45
1

Consulte el siguiente código que establece la imagen destacada mediante programación. enlace

function setFeaturedImages() {

$base = dirname(__FILE__);
$imgfile= $base.DS.'images'.DS.'14'.DS.'Ascot_Anthracite-Grey-1.jpg';
$filename = basename($imgfile);
$upload_file = wp_upload_bits($filename, null, file_get_contents($imgfile));
if (!$upload_file['error']) {
    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_parent' => 0,
        'post_title' => preg_replace('/\.[^.]+$/', '', $filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
$attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], 209 );

if (!is_wp_error($attachment_id)) {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    $attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
    wp_update_attachment_metadata( $attachment_id,  $attachment_data );
}

set_post_thumbnail( 209, $attachment_id );

}
}
    
respondido por el Liz Eipe C 06.08.2017 - 01:26
0

Quizás no entiendo bien, pero ¿por qué querrías hacer eso fuera del entorno de WordPress? ¡Replicar esta funcionalidad sería mucho trabajo! WordPress hace mucho más que simplemente cargar el archivo y colocarlo en un directorio específico, por ejemplo, controlar qué usuarios pueden subir archivos, agregar registros de bases de datos para cargar y configurar relaciones de imagen destacadas, ejecutar acciones y filtros para complementos externos que dependen de carga de archivos: todo esto mientras se adhiere a la configuración del sitio (en lo que respecta a las convenciones de nomenclatura, ubicación de carga de medios, etc.).

Si simplemente busca cargar archivos sin haber iniciado sesión en la sección de administración de WordPress, por ejemplo, para cargar archivos desde un sitio externo, le recomendamos que consulte API XML-RPC y específicamente el método uploadFile .

Otra opción podría ser escribir un mini API usted mismo. Básicamente, lo que querrías hacer es esto:

  1. Obtenga el archivo en el servidor a través de la carga (o haga que el servidor lo descargue de una URL específica).
  2. Use wp_upload_dir() para obtener la ruta del directorio de carga y sanitize_file_name() para construir la ruta y escribir el archivo en la ubicación resultante.
  3. Use wp_insert_attachment() para almacenar el archivo adjunto en la base de datos ( wp_check_filetype() será útil para configurar post_mime_type ). Opcionalmente, también puede establecer post_parent y la clave meta _thumbnail_id si lo desea.
  4. Exponga su API a usuarios externos, o requiera iniciar sesión, según sea necesario. Si utiliza un formulario público, al menos use wp_create_nonce() y wp_verify_nonce() para hacer que el formulario sea un poco más seguro.
respondido por el Simon 27.05.2013 - 10:47

Lea otras preguntas en las etiquetas