web-dev-qa-db-fra.com

Comment définir l'image sélectionnée pour une publication personnalisée de la programmation

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 comme dans le format de dossier d'année de répertoire de répertoire de stockage d'année, comme le fait Wordpress, et comment définir cette image comme image sélectionnée par rapport à la publication personnalisée?

Également pour télécharger 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?

13
Faisal Shehzad

Cela ne peut-il pas simplement ê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;
            }
        }
    }
}
24
GhostToast

Essayez cette explication de upload en utilisant un chemin et post ID .

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;
}
1
hitautodestruct

Veuillez vous reporter au code suivant pour définir 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 );

}
}
1
Liz Eipe C

Je me trompe peut-être, 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, par exemple en contrôlant quels utilisateurs sont autorisés à télécharger des fichiers, en ajoutant des enregistrements de base de données pour la mise en ligne et en configurant des relations avec les images, 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 d'administration de WordPress, par exemple pour télécharger des fichiers depuis un site externe, vous pouvez consulter la 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. Obtenez le fichier sur le serveur par le biais du 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 configurer post_mime_type). Vous pouvez également éventuellement définir post_parent et la clé méta _thumbnail_id si vous le souhaitez.
  4. Exposez votre API à des utilisateurs externes ou exigez une connexion, si nécessaire. Si vous utilisez au moins un formulaire public, utilisez wp_create_nonce() et wp_verify_nonce() pour le rendre un peu plus sécurisé.
0
Simon