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

13

Estoy tratando de buscar 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 al formato de carpeta de fecha de año del directorio de carga de WordPress al igual que WordPress y configurar esa imagen como imagen destacada en la publicación personalizada?

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

Abajo 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 cargas pero no puedo crear la carpeta de año y fecha. ¿Hay alguna función de wp para ello?

Faisal Shehzad
fuente

Respuestas:

27

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

Parece bastante simple La única trampa 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;
            }
        }
    }
}
Tostada fantasma
fuente
1
Esta solución funciona a las mil maravillas (y)
Omar Tariq
¿Dónde puedo agregar este código?
er.irfankhan11
1
A partir de WordPress 4.8 se puede establecer el cuarto parámetro en el media_sideload_imageque 'id'y va a devolver el nuevo identificador de archivo adjunto. Por ejemplo:$new_att_id = media_sideload_image($image, $post_id, "image description...", 'id'); if(!is_wp_error($new_att_id)) { set_post_thumbnail($post_id, $new_att_id); }
Don Wilson
1

Pruebe esta explicación de carga mediante una ruta y una ID de 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;
}
Hitautodestruct
fuente
1

Consulte el siguiente código que establece la imagen destacada mediante programación. http://www.pearlbells.co.uk/code-snippets/set-featured-image-wordpress-programmatic/

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 );

}
}
Liz Eipe C
fuente
0

Tal vez estoy malentendido, 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 tienen permiso para cargar archivos, agregar registros de bases de datos para cargas y configurar relaciones de imágenes destacadas, ejecutar acciones y filtros para complementos externos que dependen de carga de archivos: todo 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, es posible que desee echar un vistazo a la API XML-RPC y específicamente al uploadFilemétodo.

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

  1. Obtenga el archivo en el servidor mediante la carga (o haciendo que el servidor lo descargue desde una URL especificada).
  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. Úselo wp_insert_attachment()para almacenar el archivo adjunto en la base de datos ( wp_check_filetype()será útil para la configuración post_mime_type). Opcionalmente también establece post_parenty la _thumbnail_idmeta clave si lo deseas.
  4. Exponga su API a usuarios externos, o requiera inicio de sesión, según sea necesario. Si utiliza un formulario público como mínimo, wp_create_nonce()y wp_verify_nonce()para que el formulario sea un poco más seguro.
Simón
fuente
Estoy escribiendo un servicio web para una aplicación. La aplicación me envía una matriz de ARCHIVO a través de la cual quiero insertar los datos y la imagen de la publicación. He insertado los detalles de la publicación en la base de datos, pero pegado en la parte de la imagen.
Faisal Shehzad
Verifique la documentación wp_insert_attachment(), creo que debería hacer mucho de lo que necesita. Me desaconsejaría modificar manualmente la base de datos fuera de WordPress si eso es lo que está haciendo. En cambio, solo mire la fuente de WordPress e intente identificar las partes responsables de agregar datos de publicación, manejar cargas de archivos e insertar archivos adjuntos. En otras palabras, más o menos lo que describí en mi respuesta anterior.
Simon
@ Simon tengo el mismo problema. Otra razón por la que es posible que desee cargar es cuando tiene un trabajo por lotes de imágenes que desea adjuntar a diferentes publicaciones y no hacerlo manualmente.
hitautodestruct
1
@hitautodestruct: Absolutamente, a menudo lo hago cuando migro datos de sitios existentes, sistemas heredados, exportaciones de bases de datos, etc. Mi punto es que siempre debe esforzarse por aprovechar la funcionalidad principal de WordPress para lograr esto, en lugar de simplemente escribir un script de su propio que coloca las imágenes en la ubicación correcta (que fue, en cierta medida, de lo que percibí que se trataba la pregunta).
Simon