#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