web-dev-qa-db-fra.com

pourquoi, lorsque j'essaie d'insérer une pièce jointe avec un message, wp_get_attachment_url me donne-t-il un chemin de fichier très incorrect?

J'utilise un nouveau blog sur WPMS (3.0.1, la mise à jour n'est pas une option) pour agréger les messages (et leur image sélectionnée) à partir de quelques blogs sur la même installation, et je dois le faire par programme plutôt que par le biais d'une fait plugin en raison de restrictions de pare-feu. J'ai essayé plusieurs façons de le faire et j'ai l'impression que cette méthode est la plus prometteuse. Voici ce que j'ai concocté:

switch_to_blog(oldblognumber);
$zargs  = array( 'numberposts' => 1, 'category_name' => 'featured');
$zlastpost = get_posts( $zargs );
foreach($zlastpost as $post) : setup_postdata($post);
    $extrapost = array();
    $extrapost['post_title'] = get_the_title();
    $extrapost['post_content'] = get_the_content();
    $extrapost['comment_status'] = 'closed';
    $extrapost['post_status'] = 'publish';
    $extrapost['post_date'] = get_the_date( $d = 'Y-m-d H:i:s');
    $extrapost['post_category'] = array(80);
    $upload_dir = wp_upload_dir();
    $oldid = get_the_ID();
    $image_url = wp_get_attachment_url(get_post_thumbnail_id($oldid));
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    switch_to_blog(newblognumber);          
        $file = $upload_dir['path'] . '/' . $filename; //removed the conditional cuz it was giving me trouble
        file_put_contents($file, $image_data);
        $post_id = wp_insert_post($extrapost);
        $wp_filetype = wp_check_filetype($filename, null );
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => sanitize_file_name($filename),
            'post_content' => '',
            'post_status' => 'inherit',
        );                  
        $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
        wp_update_attachment_metadata( $attach_id, $attach_data );
        set_post_thumbnail( $post_id, $attach_id );                       
    restore_current_blog();
    wp_reset_postdata();
endforeach;
restore_current_blog();

La post-insertion fonctionne très bien, et l'image est correcte, mais quelque part, les choses sont confuses et il crée une URL de pièce jointe absurde: http://myblogs.com/newblog/ wp-content/blogs.dir/newblognumber/files // internet/http/wp-content/blogs.dir/oldblognumber/files/year/month/filename.jpg .

De même, dans la boucle où je demande thepost_thumbnail, je reçois une image brisée dont le src est http://myblogs.com/newblog/files//internet/http/wp-content/blogs .dir/oldblognumber/files/year/month/filename-200x100.jpg

Pour ce que cela vaut, puisque j'utilise une version pré-set_post_thumbnail de WP, je viens de définir manuellement la fonction dans le fichier functions.php de mon nouveau blog:

function set_post_thumbnail( $post, $thumbnail_id ) {
$post = get_post( $post );
$thumbnail_id = absint( $thumbnail_id );
if ( $post && $thumbnail_id && get_post( $thumbnail_id ) ) {
   $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'thumbnail' );
   if ( ! empty( $thumbnail_html ) ) {
       update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id );
       return true;
   }
}
return false;
}

J'ai essayé de falsifier des GUID et d'utiliser des expressions régulières pour forcer les URL à se soumettre, entre autres choses, mais en vain. S'il vous plaît laissez-moi savoir si vous avez des conseils pour moi!


J'ai également essayé une autre méthode pour définir la vignette d'un message inséré, mais elle appelle simplement le fichier d'origine dans le répertoire de téléchargement de oldblog, ce qui ne suffira pas, car j'aimerais générer de nouvelles tailles d'image pour la médiathèque du nouveau blog. , et je préférerais ne pas les parcourir et les ajouter à chacun des oldblogs originaux. Voici cette tentative:

switch_to_blog(oldblognumber);
$zargs  = array( 'numberposts' => 1, 'category_name' => 'featured');
$zlastpost = get_posts( $zargs );
foreach($zlastpost as $post) : setup_postdata($post);
    $extrapost = array();
    $extrapost['post_title'] = get_the_title();
    $extrapost['post_content'] = get_the_content();
    $extrapost['comment_status'] = 'closed';
    $extrapost['post_status'] = 'publish';
    $extrapost['post_date'] = get_the_date( $d = 'Y-m-d H:i:s');
    $extrapost['post_category'] = array(80);
    $oldid = get_the_ID();
    $thumbo = get_the_post_thumbnail($oldid);
    $filename = wp_get_attachment_url( get_post_thumbnail_id($post->ID) );
    switch_to_blog(68);
        $post_id = wp_insert_post($extrapost);
        $wp_filetype = wp_check_filetype(basename($filename), null );
            $wp_upload_dir = wp_upload_dir();
            $attachment = array(
                'guid' => _wp_relative_upload_path( $filename ), 
                'post_mime_type' => $wp_filetype['type'],
                'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
                'post_content' => '',
                'post_status' => 'inherit'
            );
            $attach_id = wp_insert_attachment( $attachment, false, $post_id );
            require_once(ABSPATH . 'wp-admin/includes/image.php');
            $attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
            update_post_meta( $post->ID, '_thumbnail_id', $attachment_id );
            wp_update_attachment_metadata( $attach_id, $attach_data );
            set_post_thumbnail( $post_id, $attach_id);        
        restore_current_blog();
        wp_reset_postdata();
    endforeach;
restore_current_blog();     

J'ai essayé d'insérer un certain nombre d'éléments dans le paramètre $ filename du fichier wp_insert_attachment, mais cela ne semble pas être ma réponse.

2
crowjonah

Il s'est avéré que j'utilisais wp_insert_attachment pour utiliser le mauvais arbre (ou du moins un arbre légèrement différent). media_sideload_image a réussi à extraire les pièces jointes d'autres blogs sur la même installation multisite, à les copier dans le répertoire de téléchargement du blog en cours d'agrégation et à générer des vignettes, tandis que wp_insert_attachment faisait ce qu'il était censé faire, ce qui n'était justement pas ce que je voulais. Je me rends compte qu'il ne s'agit que d'une légère variation par rapport à d'autres utilisations assez bien expliquées de fonctionnalités similaires, mais je me suis dit que je publierais ma solution ici au cas où quelqu'un aurait plus de succès à appliquer cette combinaison particulière de solutions.

J'ai toujours l'impression que je ne le fais pas de la manière la plus efficace, mais cela fonctionne pour le moment:

function switch_and_insert($srcblog, $targetcat, $fromcat) {
  switch_to_blog($srcblog);
  $args  = array( 'numberposts' => 1, 'category_name' => $fromcat);
  $flastpost = get_posts( $args );
  foreach($flastpost as $post) : setup_postdata($post);
    $extrapost = array();
    $extrapost['post_title'] = get_the_title($post);
    $extrapost['post_content'] = get_the_post_thumbnail();
    $extrapost['comment_status'] = 'closed';
    $extrapost['post_status'] = 'publish';
    $extrapost['post_date'] = get_the_date( $d = 'Y-m-d H:i:s');
    $extrapost['post_category'] = array($targetcat);
    $oldid = get_the_ID();
    if ( has_post_thumbnail($oldid)) {
        $filename = wp_get_attachment_url( get_post_thumbnail_id($post->ID) );
    }
    else $filename = $forchomper; // URL of backup image
    switch_to_blog($aggregator_blog_id);
        $post_id = wp_insert_post($extrapost);
        $wp_filetype = wp_check_filetype(basename($filename), null );
        $wp_upload_dir = wp_upload_dir();
        $attachment = array(
            'guid' => _wp_relative_upload_path( $filename ), 
            'post_mime_type' => $wp_filetype['type'],
            'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
            'post_content' => '',
            'post_status' => 'inherit'
        );
        require_once(ABSPATH . "wp-admin" . '/includes/media.php');
        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        require_once(ABSPATH . "wp-admin" . '/includes/file.php');
        $sideloaded = media_sideload_image($filename, $post_id);
        $attachments = get_children($post_id);
        foreach ( $attachments as $attachment_id => $attachment );
        set_post_thumbnail($post_id, $attachment_id);
    restore_current_blog();
    wp_reset_postdata();
  endforeach;
  restore_current_blog();
}

Cela ne vaut peut-être pas la peine, mais je mentionnerai néanmoins que l’utilisation de cette méthode constituait une occasion très pratique d’appliquer une image de substitution comme image de vignette/photo sélectionnée dans le cas où la publication d’origine n'en aurait pas, ce qui est une solution différente. que celui plus largement suggéré qui repose sur une condition dans un thème utilisé pour afficher un espace réservé, qui ne l'affecte pas réellement comme une vignette de publication. Je me rends compte que la plupart du temps, c'est la meilleure solution, mais dans mon cas, ces publications doivent avoir leurs propres images, même s'il s'agit de doublons.

Voici quelques conseils utiles: https://wordpress.stackexchange.com/a/19847/14351http://old.nabble.com/Uploading-image-attachments-from-the-front-end-td26307647.html

5
crowjonah