@mina_rina

Как найти элемент массива в тексте и удалить по шаблону?

Нужно найти в постах на сайте определенные ссылки и удалить не затрагивая анкор

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(/*Сотни ссылок через запятую*/);
            foreach($links_mass as $link){
            $pattern = '/<a href="'/.$link./'" (.+?)>|<\/a>/'; /* тут вся проблема*/
            $new_content = preg_replace ($pattern, '', $content);
            $new_post = array();
            $new_post['ID'] = $id;
            $new_post['post_content'] = $new_content;
            wp_update_post( $new_post );
            }
           
        }
}

Как в $pattern правильно вписать $link? И вообще, по-моему код какой то не правильный и запускать пока не рискую. Изначально код был такой и удалял просто все ссылки из постов:
function links_remove () {
    $args = array ('numberposts' => 9999);
        $allposts = get_posts( $args );
        foreach( $allposts as $post ) {
            $id = $post->ID;
            $content = $post->post_content;
            $pattern = '/<a(.+?)>|<\/a>/';
            $new_content = preg_replace ($pattern, '', $content);
            $new_post = array();
            $new_post['ID'] = $id;
            $new_post['post_content'] = $new_content;
            wp_update_post( $new_post );
        }
}

Может он и вовсе не подходит для новой задачи?
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@antonowano
Профессиональный самоучка
Мне не понятен смысл. В исходном варианте удаляются все ссылки из контента, в вашем варианте только перечисленные в $links_mass.
Да и кстати вы обновляете пост столько раз сколько у вас ссылок, достаточно 1 раз:
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(/*Сотни ссылок через запятую*/);

        foreach($links_mass as $link) {
            $pattern = '/<a href="'/.$link./'" (.+?)>|<\/a>/'; /* тут вся проблема*/
            $new_content = preg_replace ($pattern, '', $content);
        }   
        
        $new_post = array();
        $new_post['ID'] = $id;
        $new_post['post_content'] = $new_content;
        wp_update_post( $new_post );
    }
}


И саму ссылку нужно привести к строке в регулярном выражении, потому что некоторые символы из ссылки могут быть восприняты как спецсимволы. Не забывайте экранировать ссылки функцией preg_quote()

Регулярное выражение заданное вами - недостаточно гибкое. Атрибут href может быть не только самым первым атрибутом в теге <a> и после него может отсутствовать пробел.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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