web-dev-qa-db-fra.com

WP 3.4 manque de données photo

Je viens de mettre à jour WP3.4 et de découvrir que les images précédemment disponibles ne sont plus "trouvées" par le système. J'entends par là que tous les fichiers d'image restent en ligne et accessibles, mais WP a perdu les données miniatures et affiche ensuite l'icône de média standard dans la liste de la bibliothèque multimédia. Les pages de face qui devraient avoir des images affichent maintenant l'icône générique "image manquante" car il n'y a pas d'URL (j'ai vérifié la source).

J’imagine que le lien entre la base de données et les listes d’images s’est rompu et que j’essaie de procéder à une ingénierie inverse pour trouver des différences. J'espère que d’autres auront un problème similaire et l’ont résolu?

2
MechEngineer

Après avoir résolu le problème, j'aimerais mettre à jour cette question. Le problème provient de versions précédentes de WP n'incluant pas la clé méta _wp_attached_file lors du téléchargement de contenu multimédia, ce que 3.4 semble désormais exiger.

Vous trouverez ci-dessous le code PHP permettant de parcourir la base de données, de vérifier la présence de la clé et du fichier image, puis de mettre à jour la base de données.

// descend through the database
$updated = 0;
$skipped = 0;
$error = 0;
$upload_dir = wp_upload_dir();

$sql = sprintf("select * from %s where post_type = 'attachment'", $wpdb->posts);
$all_attachments = $wpdb->get_results($sql);

foreach ($all_attachments as $attachment) {
    // get the meta value
    $meta = get_post_meta($attachment->ID, "_wp_attachment_metadata", true);
    $file = $meta['file'];

    // verify that the file exists
    $file_path = $upload_dir['basedir'] . '/' . $file;
    if (!file_exists($file_path)) {
        $error++;
    }
    else {
        // add the meta value, which returns false if it already exists
        $adding_meta = add_post_meta($attachment->ID, '_wp_attached_file', $file, true);
        if ($adding_meta)
            $updated++;
        else
            $skipped++;
    }
}
echo '<div id="message" class="updated"><p>' . sprintf("%d attachments were updated, %d were skipped and %d had errors.", $updated, $skipped, $error) . '</p></div>';
1
MechEngineer