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

12

J'essaie d'extraire 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 sur wordpress avec le format de dossier de répertoire de répertoire d'année d'année, comme le fait Wordpress, et définir cette image comme image sélectionnée par rapport au message personnalisé?

Également pour importer une image dans une galerie de messages personnalisée?

Ci-dessous 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échargement mais je ne peux pas créer le dossier année et date. cela at-il une fonction wp pour cela?

    
posée Faisal Shehzad 27.05.2013 - 09:21

4 réponses

23

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

Cela semble assez simple. Le seul problème est que 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;
            }
        }
    }
}
    
réponse donnée GhostToast 29.08.2013 - 21:33
1

Essayez cette explication de télécharger en utilisant un chemin et publier un identifiant .

Voici le code (pour l'ancien):

/* 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;
}
    
réponse donnée hitautodestruct 20.06.2013 - 12:45
1

Veuillez vous reporter au code suivant pour définir l’image sélectionnée par programme. 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 );

}
}
    
réponse donnée Liz Eipe C 06.08.2017 - 01:26
0

Peut-être que je ne comprends pas bien, mais pourquoi voudriez-vous le faire en dehors de l'environnement WordPress? Répliquer cette fonctionnalité représenterait beaucoup de travail! WordPress fait bien plus que simplement télécharger le fichier et le placer dans un répertoire spécifique, en contrôlant par exemple les utilisateurs autorisés à télécharger des fichiers, en ajoutant des enregistrements de base de données pour la mise en ligne et en définissant des relations avec les images en vedette, en exécutant des actions et des filtres pour les plugins externes en fonction téléchargement de fichier - tout en respectant les paramètres du site (en ce qui concerne les conventions de dénomination, l'emplacement de téléchargement du support, etc.).

Si vous souhaitez simplement télécharger des fichiers sans être connecté à la section administrateur de WordPress, par exemple pour télécharger des fichiers depuis un site externe, vous pouvez consulter le API XML-RPC et plus précisément la méthode uploadFile .

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

  1. Récupérez le fichier sur le serveur par 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 définir post_mime_type ). Vous pouvez également éventuellement définir post_parent et la clé meta _thumbnail_id si vous le souhaitez.
  4. Exposez votre API à des utilisateurs externes ou nécessitez la connexion, si nécessaire. Si vous utilisez au moins un formulaire public, utilisez wp_create_nonce() et wp_verify_nonce() pour le sécuriser un peu plus.
réponse donnée Simon 27.05.2013 - 10:47

Lire d'autres questions sur les étiquettes