WordPress замените все экземпляры шорткода [vc_single_image] на img src

#php #wordpress #shortcode

#php #wordpress #шорткод

Вопрос:

я обновляю свой веб-сайт WordPress и удаляю https://wpbakery.com / editor и я хочу удалить разметку, сгенерированную плагином.

Этот плагин https://codecanyon.net/item/shortcode-cleaner-clean-wordpress-content-from-broken-shortcodes/21253243 Я использую will удалить все шорткоды без проблем, кроме одного. Это удаление изображений.

При ближайшем рассмотрении изображения размещаются на серверной части с использованием приведенного ниже шорткода

 [vc_single_image image="10879" img_size="large" add_caption="yes" alignment="center"]
 

И я хочу обновить все ссылки, чтобы вместо этого использовать HTML

 <img src="IMGURL">
 

Однако я не уверен в правильном способе сделать это, какие-нибудь советы, пожалуйста?

Комментарии:

1. Вы хотите фактически заменить все теги шорткода в самом содержимом редактирования публикации WordPress или только во внешнем интерфейсе? Если вы хотите также заменить их в серверной части, я думаю, вам нужно будет использовать PHP для обновления всех сообщений, заменить их источником изображения по идентификатору и сохранить сообщение. Если вы согласны с тем, что они отображают только интерфейс с исходным кодом изображения, вы можете самостоятельно зарегистрировать шорткод (если у вас больше не установлен WPBakery) и использовать параметр image=»XXX», чтобы получить источник изображения, и повторить тег img с исходным кодом.

Ответ №1:

В MySQL 8 есть замена регулярного выражения, но если у вас его нет, вы можете сделать это с помощью PHP.

 $query = new WP_Query( [-- whatever posts you want--] );
while ( $query->have_posts() ) {
    $query->the_post();

    $content = get_the_content();

    preg_match('/[vc_single_image image="(d )" img_size="(w )"[^]]*]/', $content, $matches);

    if( isset($matches[1]) ) {
       $url = wp_get_attachment_image_url( (int) $matches[1], $matches[2] );
       $img = sprintf( '<img src="%s" />', $url );

       $new_content = str_replace( $matches[0], $img, $content );

       wp_update_post( [ 'ID' => get_the_ID(), 'post_content' => $new_content] );
   }
}
 

Комментарии:

1. Потрясающе, спасибо, Джон, я только что отредактировал ваше решение, чтобы добавить отсутствующую скобку, это сработало, как только я выяснил, как определить класс WP_Query developer.wordpress.org/reference/classes/wp_query

Ответ №2:

Вот обновленный ответ для обновления всех изображений в содержимом публикации / страницы. Приведенный выше код находит первое изображение содержимого и обновляет его.

 // Args for the WP_Query
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
    'post__in' => array(5824),
    'orderby' => 'post__in' 
);

// Execute WP_Query with args
$query = new WP_Query( $args );

// Start the Loop
while ( $query->have_posts() ) {
    $query->the_post();
    // Get Page/Post content 
    $content = apply_filters('the_content', $content);

    // Get the vc_single_image count from the post 
    $found_keyword = substr_count( $content,"vc_single_image" );

    // Start loop to replace all elements from the content 
    for ($i=0; $i < $found_keyword; $i  ) { 
        // Get the position of vc_single_image shortcode with Image ID and Image Size
        preg_match( '/[vc_single_image image="(d )" img_size="(w )"[^]]*]/', $content, $matches );

        // Check shotcode are exist on loop
        if( isset( $matches[1]) ){
            
            // Get the Image ur by Image id and Size
            $url =  wp_get_attachment_image_url( (int) $matches[1], $matches[2] );
            $img = sprintf( '<img src="%s" />', $url );

            // Replce shortcode with <img> tag
            $content = str_replace( $matches[0], $img, $content );

        }
    }

    // Update post content with updated content with <img> tag
    wp_update_post( [ 'ID' => get_the_ID(), 'post_content' => $content] );
}
// END the Loop