2014-03-08 5 views
2

Я пытаюсь удалить дубликаты изображений из медиатеки Wordpress.Мне нужно удалить повторяющиеся изображения из моей медиатеки Wordpress

Посты сами не дублируются, но каждое изображение вложения появляется дважды для каждого сообщения.

Я осмотрелся, но никто не имеет четкого ответа. Некоторые люди говорят, использовать что-то вроде этого:

<?php 
    $p = get_posts(array('numberposts'=> -1)); 
    foreach($p as $t) { 
     $s = get_children(array('post_type' => 'attachment', 'numberposts' => -1)); 
     foreach ($s as $u) { 
     var_dump($u); 
     } 
    } 
    ?> 

Но есть еще, кажется, немного не хватает, как это приносит мне список вложений, но я до сих пор не знаю, как их сравнивать.

Мне кажется, что мне нужно использовать некоторые sql-запросы и удалить файлы мультимедиа прямо из базы данных. Я не совсем уверен, как это сделать.

Теоретически мне нужно попытаться что-то вроде найти сообщения, foreach post получить вложения, если вложение filename == имя_файла, а затем удалить имя файла.

Помогите оценить.

+0

Эти файлы не будут находиться в базе данных. Они сохраняются в папке/uploads /. Сколько у вас файлов? – henrywright

+0

@henrywright 1500 :) – UzumakiDev

+0

@henrywright ну теперь это больше похоже на 3000 – UzumakiDev

ответ

1

Создайте файл в папке темы и в том, что вставить первый или второй способ решения:

первый способ (сравнение с их названиями - рекомендуется):

<?php 

require('../../../wp-blog-header.php'); 
global $wpdb; 

$querys = $wpdb->get_results(
    " 
    SELECT a.ID, a.post_title, a.post_type 
    FROM $wpdb->posts AS a 
     INNER JOIN (
      SELECT post_title, MIN(id) AS min_id 
      FROM $wpdb->posts 
      WHERE post_type = 'attachment' 
      GROUP BY post_title 
      HAVING COUNT(*) > 1 
     ) AS b ON b.post_title = a.post_title 
    AND b.min_id <> a.id 
    AND a.post_type = 'attachment' 
    "); 

echo "<style>td {padding:0 0 10px;}</style>"; 
echo "<h2>DUPLICATES</h2>\n"; 
echo "<table>\n"; 
echo "<tr><th></th><th>Title</th><th>URL</th></tr>\n"; 

foreach ($querys as $query) 
{ 
    $attachment_url = wp_get_attachment_url($query->ID); 
    $delete_url = get_delete_post_link($query->ID); 
    $delete_url = get_delete_post_link($query->ID); 
    echo "<tr> 
     <td><a style=\"color: #FFF;background-color: #E74C3C;text-decoration: none;padding: 5px;\" target=\"_blank\" href=\"".$delete_url."\">DELETE</a></td> 
     <td>".get_the_title($query->ID)."</td> 
     <td><a href=\"".$attachment_url."\">".$attachment_url."</a></td> 
     </tr>\n"; 
} 

echo "</table>"; 

?> 

второй путь (Сравните с их URL-адресами) Как он работает, он проверяет каждый файл друг на друге. Поэтому, если у вас есть файл, например file.jpg и file1.jpg, он будет воспринимать их как дубликаты. Кроме того, если у вас есть файл file1.jpg и file11.jpg, он будет считать их дубликатами, даже если они могут быть совершенно разными файлами. :

<?php 

require('../../../wp-blog-header.php'); 

$args = array(
    'post_type' => 'attachment', 
    'numberposts' => -1, 
    'orderby' => 'name', 
    'order' => 'ASC', 
    'post_status' => null, 
    'post_parent' => null, // any parent 
); 

$newArray = array(); 

$attachments = get_posts($args); 
$attachments2 = $attachments; 


if ($attachments){ 

    foreach($attachments as $post){ 
     $attachment_url = wp_get_attachment_url($post->ID); 
     $delete_url = get_delete_post_link($post->ID); 
     $newArray[] = array("att_url" => $attachment_url, "del_url" => $delete_url); 
    } 

    echo "<table>"; 
     $newArray2 = $newArray; 
     echo "<tr><td><h2>DUPLICATES</h2></td></tr>"; 
     foreach($newArray as $url1){ 
      $url_del = $url1['del_url']; 
      $url1 = $url1['att_url']; 
      $url11 = substr($url1,0,strrpos($url1,".")); 
      foreach($newArray2 as $url2){ 
       $url2 = $url2['att_url']; 
       $url2 = substr($url2,0,strrpos($url2,".") - 1); 

       if($url2 == $url11) 
       { 
        echo "<tr><td><a href=\"".$url_del."\">DELETE</a></td><td><a href=\"".$url1."\">".$url1."</a></td></tr>"; 
       } 
      } 
     } 
    echo "</table>"; 
    echo "<table>"; 
     echo "<tr><td><h2>ALL ATTACHMENTS</h2></td></tr>"; 

     foreach($attachments as $tst1){ 
      echo "<tr><td>".$tst1->guid."</td></tr>"; 
     } 
    echo "</table>"; 
} 
?> 

Затем попытайтесь открыть этот файл в вашем браузере, и он покажет вам список всех дубликатов.

Смежные вопросы