Come impostare l'immagine in evidenza su post personalizzati dall'esterno a livello di codice


13

Sto cercando di recuperare e inserire immagini al di fuori dell'ambiente wordpress in un post personalizzato tramite PHP.

Come spostare / caricare l'immagine nel formato della cartella della data di anno della directory di caricamento di wordpress proprio come fa wordpress e impostare quell'immagine sull'immagine in primo piano rispetto al post personalizzato?

Anche per caricare l'immagine nella galleria di post personalizzati?

Di seguito è il mio codice

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

sono riuscito a caricare l'immagine nella mia directory dei caricamenti ma non riesco a creare la cartella dell'anno e della data. questo c'è qualche funzione wp per questo ??

Risposte:


27

Non è possibile farlo semplicemente con media_sideload_image () ?

Sembra piuttosto semplice. L'unico problema è che se non sei nell'area di amministrazione, devi includere alcune librerie da WordPress che includono:

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

1
Questa soluzione funziona come un incantesimo (y)
Omar Tariq,

Dove posso aggiungere questo codice?
er.irfankhan11,

1
A partire da WordPress 4.8 è possibile impostare il quarto parametro media_sideload_imagesu 'id'e restituirà il nuovo ID allegato. Ad esempio:$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

Prova questa spiegazione del caricamento utilizzando un percorso e un ID post .

Ecco il codice (per legacy):

/* 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;
}

1

Si prega di fare riferimento al seguente codice che imposta l'immagine in primo piano a livello di codice. http://www.pearlbells.co.uk/code-snippets/set-featured-image-wordpress-programmatically/

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

}
}

0

Forse sto fraintendendo, ma perché dovresti farlo al di fuori dell'ambiente WordPress? Replicare questa funzionalità richiederebbe molto lavoro! WordPress fa molto di più che semplicemente caricare il file e posizionarlo in una directory specifica, ad esempio controllando quali utenti sono autorizzati a caricare file, aggiungendo record di database per i caricamenti e impostando relazioni di immagini in evidenza, eseguendo azioni e filtri per plugin esterni dipendenti da caricamento di file - il tutto aderendo alle impostazioni del sito (per quanto riguarda le convenzioni di denominazione, la posizione di caricamento dei media, ecc.).

Se cerchi semplicemente di caricare file senza aver effettuato l'accesso alla sezione di amministrazione di WordPress, ad esempio per caricare file da un sito esterno, potresti voler dare un'occhiata all'API XML-RPC e in particolare al uploadFilemetodo.

Un'altra opzione potrebbe essere quella di scrivere una mini API da soli. Fondamentalmente quello che vorresti fare è questo:

  1. Ottieni il file sul server tramite upload (o fai scaricare il server da un URL specificato).
  2. Utilizzare wp_upload_dir()per ottenere il percorso della directory di caricamento e sanitize_file_name()per costruire il percorso e scrivere il file nella posizione risultante.
  3. Utilizzare wp_insert_attachment()per archiviare l'allegato nel database ( wp_check_filetype()sarà utile per l'impostazione post_mime_type). Se post_parentlo _thumbnail_iddesideri, imposta anche e la meta chiave.
  4. Esporre l'API a utenti esterni o richiedere l'accesso, se necessario. Se usi almeno un modulo pubblico wp_create_nonce()e wp_verify_nonce()per renderlo un po 'più sicuro.

sto scrivendo un servizio web per un'applicazione. L'applicazione mi invia un array FILE attraverso il quale voglio inserire i dati e l'immagine del post Ho inserito i dettagli del post nel database ma bloccato nella parte dell'immagine.
Faisal Shehzad,

Controlla la documentazione per wp_insert_attachment(), dovrebbe fare molto quello che ti serve, penso. Scoraggerei fortemente la modifica manuale del database al di fuori di WordPress, se è quello che stai facendo. Invece, basta guardare l'origine di WordPress e provare a identificare le parti responsabili dell'aggiunta dei dati dei post, della gestione dei caricamenti dei file e dell'inserimento degli allegati. In altre parole, praticamente quello che ho delineato nella mia risposta sopra.
Simon,

@Simon Ho lo stesso problema. Un altro motivo che potresti voler caricare è quando hai un lavoro batch di immagini che vuoi allegare a post diversi e non farlo manualmente.
hitautodestruct,

1
@hitautodestruct: Assolutamente, lo faccio spesso quando eseguo la migrazione di dati da siti esistenti, sistemi legacy, esportazioni di database, ecc. Il punto è che dovresti sempre sforzarti di sfruttare la funzionalità principale di WordPress per ottenere questo risultato, piuttosto che scrivere semplicemente uno script del tuo proprio che posiziona le immagini nella posizione corretta (che era in qualche modo ciò di cui ho percepito la domanda).
Simon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.