Comment définir l'image sélectionnée pour une publication personnalisée de l'extérieur par programme

13

J'essaie de récupérer et d'insérer des images en dehors de l'environnement wordpress dans un message personnalisé via PHP.

Comment déplacer / télécharger cette image vers le format de dossier de date d'annuaire de téléchargement de wordpress tout comme wordpress et définir cette image en tant qu'image en vedette par rapport à la publication personnalisée?

Aussi pour télécharger une image vers une galerie d'articles personnalisée?

Voici mon code

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

J'ai réussi à télécharger l'image dans mon répertoire de téléchargements, mais je ne peux pas créer le dossier de l'année et de la date. ce qu'il y a une fonction wp pour cela ??

Faisal Shehzad
la source

Réponses:

27

Cela ne peut-il pas être fait simplement avec media_sideload_image () ?

Semble assez simple. Seul hic, si vous n'êtes pas dans la zone d'administration, vous devez inclure certaines bibliothèques à partir de WordPress, notamment:

// 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;
            }
        }
    }
}
GhostToast
la source
1
Cette solution fonctionne comme un charme (y)
Omar Tariq
Où puis-je ajouter ce code?
er.irfankhan11
1
A partir de WordPress 4.8 , vous pouvez définir le quatrième paramètre media_sideload_imagepour 'id'et il va retourner le nouvel identifiant de pièce jointe. Par exemple:$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

Essayez cette explication du téléchargement à l'aide d'un chemin d'accès et d'un ID de publication .

Voici le code (pour l'héritage):

/* 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
la source
1

Veuillez vous référer au code suivant qui définit l'image sélectionnée par programme. 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 );

}
}
Liz Eipe C
la source
0

Peut-être que je me méprends, mais pourquoi voudriez-vous faire cela en dehors de l'environnement WordPress? Répliquer cette fonctionnalité serait beaucoup de travail! WordPress fait bien plus que simplement télécharger le fichier et le placer dans un répertoire spécifique, par exemple contrôler quels utilisateurs sont autorisés à télécharger des fichiers, ajouter des enregistrements de base de données pour les téléchargements et configurer les relations d'image en vedette, exécuter des actions et des filtres pour les plugins externes dépendants de téléchargement de fichiers - tout en respectant les paramètres du site (en ce qui concerne les conventions de dénomination, l'emplacement de téléchargement des médias, etc.).

Si vous cherchez simplement à télécharger des fichiers sans être connecté à la section d'administration de WordPress, par exemple pour télécharger des fichiers à partir d'un site externe, vous voudrez peut-être jeter un œil à l' API XML-RPC et en particulier à la uploadFileméthode.

Une autre option pourrait être d'écrire vous-même une mini API. Fondamentalement, ce que vous voudriez faire est le suivant:

  1. Obtenez le fichier sur le serveur via le téléchargement (ou demandez au serveur de le télécharger à partir d'une URL spécifiée).
  2. Utilisez wp_upload_dir()pour obtenir le chemin du répertoire de téléchargement et sanitize_file_name()pour construire le chemin et écrire le fichier à l'emplacement résultant.
  3. Utilisez wp_insert_attachment()pour stocker la pièce jointe dans la base de données ( wp_check_filetype()sera utile pour le réglage post_mime_type). Optionnellement également défini post_parentet la _thumbnail_idtouche méta si vous le souhaitez.
  4. Exposez votre API à des utilisateurs externes ou exigez une connexion, si nécessaire. Si vous utilisez un formulaire public à tout le moins, utilisez wp_create_nonce()et wp_verify_nonce()pour rendre le formulaire un peu plus sûr.
Simon
la source
j'écris un service web pour une application. L'application m'envoie un tableau de fichiers à travers lequel je veux insérer les données et l'image du post.J'ai inséré les détails du post dans la base de données mais coincé dans la partie image.
Faisal Shehzad
Vérifiez la documentation pour wp_insert_attachment(), il devrait faire beaucoup de ce dont vous avez besoin, je pense. Je déconseille fortement de modifier manuellement la base de données en dehors de WordPress si c'est ce que vous faites. À la place, regardez simplement la source WordPress et essayez d'identifier les parties responsables de l'ajout de données de publication, de la gestion des téléchargements de fichiers et de l'insertion de pièces jointes. En d'autres termes, à peu près ce que j'ai décrit dans ma réponse ci-dessus.
Simon
@Simon J'ai le même problème. Une autre raison que vous voudrez peut-être télécharger est lorsque vous avez un travail par lots d'images que vous souhaitez joindre à différents messages et ne pas le faire manuellement.
hitautodestruct
1
@hitautodestruct: Absolument, je le fais souvent lors de la migration de données à partir de sites existants, de systèmes hérités, d'exportations de bases de données, etc. propre qui place les images au bon endroit (ce qui était dans une certaine mesure ce que je percevais comme la question).
Simon