Задать вопрос
@mina_rina

Как удалить кучу известных ссылок в wordpress?

Есть около тысячи ссылок, которые необходимо удалить из wordpress не затрагивая текст ссылки. Есть такой код, который подсказали на другом ресурсе, но он работает неверно. Вставляется в functions.php для единичного прогона.

function links_remove () {
$args = array ('numberposts' => 9999);
    $allposts = get_posts( $args );
    foreach( $allposts as $post ) {
        $id = $post->ID;
        $content = $post->post_content;
        $links_mass=array(
        /*
   Здесь сотни абсолютно разных ссылок через запятую
        */
        'site.com'
        );

        foreach($links_mass as $link) {
        $_ = str_replace($links_mass, '', $content);
        $new_content =  preg_replace('~<a\s*href="">([^<]+)<\/a>~', "$1", $_);
        $new_post = array();
        $new_post['ID'] = $id;
        $new_post['post_content'] = $new_content;
        wp_update_post( $new_post );       
       }   
   } 
}
add_action ('init', 'links_remove');

Он находит и "удаляет" ссылки только на той страничке которую я загружаю в данный момент. Т.е. если это главная, то там он ничего не удалит или если пост, который не имеет ссылок из массива, то тоже ничего не изменится. А если это пост в котором есть ссылки из массива, то ссылка становится вида : <a href="http://">Сайт</a>
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
kumaxim
@kumaxim
Web-программист
Лично я считаю, что здесь в корне неверный подход.

Первое - лучше забыть в function.php. Сделайте простенький плагин. В плагине регистрируйте задачу на wp_schedule_event.

Далее, через WP_Query получайте все посты, которые соответствуют Вашим критериям(тип, категория, мета-данные и т.д.). Одно условие - не более 25 штук за раз(число взято с потолка). Из этих 25 штук вырезайте ссылки по Вашим критериями. Лично я бы резал используя DomDocument, но через регулярки тоже можно.

На данный момент мы получаем, что за один проход мы обрабатываем 25 записей в Вашем блоге. Далее, если обработка происходит верно, мы ставим эту задачу на CRON(поищите инструкции как в WP запретить внутрениий крон и использовать CRON из ОС) и лоимся спать. На утро проверяем результат.

Теперь два важный момента:
1)Используйте реальный CRON, не встроенный в WP. Встроенный работает тогда, когда на сайт заходит юзер. Нет визита юзера - нет отработавшей задачи.
2)Почему я говорю про порции в 25 записей? Вы можете упереться в Max execution time. По умолчанию в PHP это 30 секунд. Можете поставить 50, можете 150. Моя логика такая: 1000 / 25 = 40 проходов = 40 минут(запуск крона 1 раз в минуту).

Готового кода под эту задачу у меня нет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы