web-dev-qa-db-fra.com

Quelle est la manière appropriée de rechercher et de supprimer les images en double des publications et de la bibliothèque multimédia?

Je viens d’exporter un blog WP assez large de MediaTemple vers PHPFog.

J'ai utilisé les plugins standard d'exportation et d'importation de WordPress.

Pour une raison inconnue, tous mes médias ont été dupliqués. J'ai maintenant deux fois plus d'images par poste.

Si un fichier original s'appelait "Lot-44-Warrens.jpg", il comportait désormais un duplicata appelé "Lot-44-Warrens1.jpg". Les deux fichiers sont joints au même message.

J'ai maintenant beaucoup d'images en double sur environ 250 articles.

Ma question est donc la suivante: comment puis-je supprimer les doublons de la médiathèque et des publications?

J'ai essayé de chercher dans la médiathèque avec "* 1.jpg", mais cela n'a pas fonctionné.

Vous recherchez une solution soignée qui ne signifie pas supprimer chaque dupe manuellement.

Peut-être que je peux exécuter une requête MySQL pour supprimer les dupes de la bibliothèque et des publications?

Le site en question est: http://igrealty.phpfogapp.com/ .

6
jnthnclrk

en combinant les deux réponses sur cette page, j'ai trouvé que cela fonctionnait.

$args = new WP_Query(array(
  'post_type' => 'post',
  'posts_per_page' => -1
));

$loop = new WP_Query($args);

while($loop->have_posts()) {
  the_post();
  $args2 = array(
    'order' => 'ASC',
    'post_type' => 'attachment',
    'post_parent' => $post->ID,
    'post_mime_type' => 'image');
    $attachments = get_posts($args2);
    if($attachments) {
      foreach ($attachments as $img_post) {
        if( ((strpos($img_post->guid, '1.jpg')!== false) || (strpos($img_post->guid, '1.gif')!== false) || (strpos($img_post->guid, '1.png')!== false))){
          $stuff = $img_post->guid;
          wp_delete_attachment($img_post->ID);
        } 
      }
    }
} wp_reset_postdata();
2
UzumakiDev

Utilisez un script unique pour le nettoyer. Juste un contour, pas de code:

  1. Obtenez tous les messages. Voir get_posts( array ( 'numberposts' => -1 ) )
  2. Pour chaque poste, obtenez toutes les pièces jointes. Voir get_children( array ( 'post_type' => 'attachment', 'numberposts' => -1 ) )
  3. Pour chaque pièce jointe, obtenez l'URL de la pièce jointe. Voir wp_get_attachment_url()
  4. Si vous trouvez l'URL de la pièce jointe dans le contenu de l'article parent ($post->post_content):
    • S'il existe une autre URL de pièce jointe portant le même nom de fichier, ainsi que 1 et
    • les deux font partie du contenu du message alors
    • enlever la deuxième image d'abord puis
    • utilisez wp_delete_attachment() pour supprimer le fichier physique. Cela supprimera également toutes les méta-données et toutes les associations des autres publications. C'est le meilleur moyen de supprimer les fichiers attachés (à mon humble avis).

Cela peut prendre un peu de temps. Testez-le sur une copie locale de votre site. Peut-être devriez-vous exécuter le processus par étapes de 50 publications ('numberposts' => 50).

4
fuxia

Ce script va récupérer toutes les pièces jointes de la base de données, comparer le fichier entre eux via md5. S'il trouve un doublon et qu'il a un 1 à la fin du nom du fichier, il supprimera l'image:

require('wp-load.php');

global $wpdb;

$img_posts = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE post_type like 'attachment'");

$img_md5s = array();

foreach($img_posts as $img_post){
  $single_img_md5 = md5_file($img_post->guid);

  if(in_array($single_img_md5, $img_md5s) && ((strpos($img_post->guid, '1.jpg')!== false) || (strpos($img_post->guid, '1.gif')!== false) || (strpos($img_post->guid, '1.png')!== false))){
    wp_delete_attachment($img_post->ID);

  }else{
    $img_md5s[] = $single_img_md5;
  }
} 

Il suffit de le placer dans un fichier de votre répertoire racine.

3
Lee

J’apprends pas une leçon valable hier, si une application ne vous fournit pas les fonctions adéquates pour rechercher et supprimer des actifs d’une base de données, et que vous essayez de trouver des doublons dans plusieurs champs, souvent uniques, et que vous ne savez pas comment. créer des requêtes MySQL complexes; alors le mieux est de revenir à l'essentiel.

Finalement, j'ai exporté les tables avec des dupes dans Excel, les ai filtrées en créant mon propre "hachage" de champs significatifs (cette opération dans MySQL était complexe et a planté le serveur plusieurs fois) et j'ai élagué le jeu de données de sorte que je crée un liste des identifiants que j'étais absolument sûr de vouloir supprimer. J'ai ensuite construit une requête MySQL beaucoup plus simple pour supprimer chaque ligne par ID.

Cette méthode a fonctionné à merveille, car j'ai été capable de prendre les choses lentement et de considérer chaque filtre Excel appliqué. De cette façon, j'étais beaucoup plus confiant de supprimer les enregistrements corrects. J'ai également un enregistrement précis dans Excel de ce que j'ai supprimé.

0
jnthnclrk