Как удалить все шорткоды/теги визуального композитора из post_content wordpress, полученного с помощью пользовательского запроса

Я работаю над веб-службой (API), где я получаю результат функции WP_query() и анализирую ее в формате JSON. который в дальнейшем будет использоваться в приложении для Android. Проблема в том, что post_content, который я получаю с запросом, составлен визуальным композитором, и весь контент имеет форму таких тегов, как

[VC_ROW][/VC_ROW][VC_COLUMN]some text[/VC_COLUMN] etc.

Я хочу удалить/удалить все эти шорткоды из содержимого и извлечь из него только обычный текст. Есть ли какая-нибудь функция визуального композитора, с помощью которой я могу добиться этого?

<?php
require('../../../wp-load.php');
require_once(ABSPATH . 'wp-includes/functions.php');
require_once(ABSPATH . 'wp-includes/shortcodes.php');
header('Content-Type: application/json');

$post_name = $_REQUEST['page'];

if($post_name!=''){
    if($post_name=='services') {

    $args = array(
        'post_parent' => $page['services']['id'],
        'post_type'   => 'page', 
        'post_status' => 'published' 
    ); 
    $posts = get_children($args);
    foreach($posts as $po){
        $services_array[] = array('id'=>$po->ID,'title'=>$po->post_title,'image'=>get_post_meta($po->ID, 'webservice_page_image',true),'description'=>preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $po->post_content));
    }

    $post = array(
        'status'=>'ok', 
        'services'=>$services_array
    );
    echo json_encode($post);
}
}
?>

person Harish Kumar    schedule 04.08.2016    source источник
comment
вы можете попробовать strip_shortcodes() и эту функцию, предоставляемую wordpress.   -  person Rahul K    schedule 04.08.2016
comment
@Rocky strip_shortcodes() Не работает, уже пробовал раньше   -  person Harish Kumar    schedule 04.08.2016
comment
Ты пытался ? регулярное выражение preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $the_content);   -  person Rahul K    schedule 04.08.2016
comment
@ Рокки, да, чувак, это работает. Но почему он не работает с strip_shortcodes(). Он также имеет то же самое в этой функции.   -  person Harish Kumar    schedule 04.08.2016
comment
Можете ли вы поделиться своим кодом, чтобы я мог проверить, почему он не работает с вашей стороны?   -  person Rahul K    schedule 04.08.2016
comment
Он не удаляет каждый шорткод. такие шорткоды [vc_column_inner width=\1\/3\] еще остались   -  person Harish Kumar    schedule 04.08.2016
comment
добавлен шорткод, пожалуйста, проверьте сейчас   -  person Harish Kumar    schedule 04.08.2016
comment
Добавлен исходный код @Rocky, проверьте   -  person Harish Kumar    schedule 04.08.2016


Ответы (7)


Здесь вы можете попробовать легко добавить несколько коротких кодов в массив, который вам нужен, а также вы можете удалить все короткие коды с помощью кода ниже.

$the_content = '[VC_ROW][VC_COLUMN]some text1[/VC_COLUMN] etc.[/VC_ROW][VC_COLUMN_INNTER width="1/3"][/VC_COLUMN_INNTER]';

$shortcode_tags = array('VC_COLUMN_INNTER');
$values = array_values( $shortcode_tags );
$exclude_codes  = implode( '|', $values );

// strip all shortcodes but keep content
// $the_content = preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $the_content);

// strip all shortcodes except $exclude_codes and keep all content
$the_content = preg_replace( "~(?:\[/?)(?!(?:$exclude_codes))[^/\]]+/?\]~s", '', $the_content );
echo $the_content;

вы хотите оставить некоторые короткие коды, которые вы не можете использовать для этого strip_shortcodes().

person Rahul K    schedule 04.08.2016
comment
для меня теперь этот код работает str_replace('[vc_column_inner width=1/3]','',preg_replace(~(?:[/?)[^/]]+/?]~s,'', $po- ›post_content)) в vc_column на самом деле разные параметры, поэтому если они появятся, я удалю их с помощью str_replace. ваш ответ немного поможет. я проголосую за это, но это не точное решение - person Harish Kumar; 04.08.2016
comment
Посмотрите, я обновил код, также параметр не имеет значения в шорткоде, это регулярное выражение проверяет только тот шорткод, который вы использовали в массиве. вы можете запустить этот код, который все еще VC_COLUMN_INNTER передается в массиве, а затем принимается в содержании с параметрами. - person Rahul K; 04.08.2016
comment
Я разработал бесплатный плагин для WordPress, чтобы решить эту проблему, плагин под названием (Shortcode Cleaner Lite) wordpress. org/plugins/shortcode-cleaner-lite Он обеспечивает простой способ автоматической очистки неиспользуемых, неработающих шорткодов из контента WordPress, поэтому вы можете переключаться между темами и плагинами, не беспокоясь, и поддерживать ваш контент в чистоте и свежести все время. , он имеет дело с шорткодами любых тем (Divi, Avada и т. д.), которые остаются при смене тем, плагинов или компоновщиков страниц (Visual Composer, Elementor, Beaver и т. д.). - person mohamdio; 12.02.2018
comment
извините, но ни первая, ни вторая строка preg_replace не удалили шорткоды из моей строки содержимого. - person wbq; 09.01.2020

I want to remove/strip all these shortcode from the content and retrieve only plain text from it.

Решение, которое сработало для меня:

$content = strip_tags( do_shortcode( $post->post_content ) );

do_shortcode запускает все шорткоды визуального композитора и, таким образом, возвращает html+текст;

strip_tags удаляет все HTML-теги и возвращает обычный текст.

person Sharpey    schedule 04.12.2020
comment
после некоторых исследований это был самый разумный способ решения проблемы. - person wbq; 15.12.2020

Лучшее решение, решено.
Просто добавьте следующий код в файл wp-includes/rest-api.php внизу:

/**
 * Modify REST API content for pages to force
 * shortcodes to render since Visual Composer does not
 * do this
 */
add_action( 'rest_api_init', function ()
{
   register_rest_field(
          'page',
          'content',
          array(
                 'get_callback'    => 'compasshb_do_shortcodes',
                 'update_callback' => null,
                 'schema'          => null,
          )
       );
});

function compasshb_do_shortcodes( $object, $field_name, $request )
{
   WPBMap::addAllMappedShortcodes(); // This does all the work

   global $post;
   $post = get_post ($object['id']);
   $output['rendered'] = apply_filters( 'the_content', $post->post_content );

   return $output;
}
person Muhammad Khizer Khan    schedule 09.03.2019
comment
Это работает, но проблема в том, что когда мы обновляем WordPress, возникает проблема, можем ли мы добавить это или создать собственный плагин для этого? - person Zaheer Ahmad; 14.03.2019
comment
Изменение основных файлов — худшее, что вы можете сделать. - person wbq; 14.12.2020

Я его где-то взял и немного обновил, чтобы работало чуть лучше :). в functions.php добавьте эту функцию:

/** Function that cuts post excerpt to the number of a word based on previously set global * variable $word_count, which is defined below */

if(!function_exists('kc_excerpt')) {

  function kc_excerpt($excerpt_length = 20) {

    global $word_count, $post;

    $word_count = $excerpt_length;

    $post_excerpt = get_the_excerpt($post) != "" ? get_the_excerpt($post) : strip_tags(do_shortcode(get_the_content($post)));

    $clean_excerpt = strpos($post_excerpt, '...') ? strstr($post_excerpt, '...', true) : $post_excerpt;

    /** add by PR */

    $clean_excerpt = strip_shortcodes(remove_vc_from_excerpt($clean_excerpt));
    /** end PR mod */

    $excerpt_word_array = explode (' ',$clean_excerpt);

    $excerpt_word_array = array_slice ($excerpt_word_array, 0, $word_count);

    $excerpt = implode (' ', $excerpt_word_array).'...'; echo ''.$excerpt.'';

  }
}

и после этого вы обычно вызываете его kc_excerpt(20);, и он возвращает обычный post_content/excerpt

person Svetoslav    schedule 22.03.2019

Как удалить Visual Composer из поста wp: т.е. [vc_row][vc_column width=\"2/3\"][distance][vc_single_image image=\"40530\" img_size=\"large\"][distance][distance][distance][vc_column_text] Также WP post remvoe короткие коды и теги html.

while($posts->have_posts()) {
      $postContent = get_the_content();
      //Remove html tags. and short code 
      $postContent = strip_tags( do_shortcode( $postContent ) );
      //Remove visual composer tags [vc_column] etc
      $postContent = preg_replace( "/\[(\/*)?vc_(.*?)\]/", '', $postContent );
}
person Muhammad Shahzad    schedule 13.01.2021

Глядя на исходный код WordPress API, я сделал функцию для удаления шорткода из контента. Итак, вот результат:

function removeShortcode($content, $shortcodeList){
  preg_match_all('@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches);
  $tagnames = array_intersect($shortcodeList, $matches[1]);
  if(empty($tagnames)){
    return $content;
  }
  $pattern = get_shortcode_regex($tagnames);
  preg_match_all("/$pattern/", $content, $matchesTags);
  foreach ($matchesTags[0] as $key => $value) {
    $content = str_replace($value, $matchesTags[5][$key], $content);
  }
  return $content;
}

пример:

$content = "<p>Hi, this is a [example]<b>example</b>[/example]. [end]</p>";
$shortcodesToRemove = ["example", "end"];
echo removeShortcode($content, $shortcodesToRemove);
person Jocelino Pereira    schedule 19.06.2021

foreach($posts as $po){
    $services_array[] = array('id'=>$po->ID,'title'=>$po->post_title, 'description'=>do_shortcode($po->post_content));
}
  • Вы должны попробовать это.
person Hitesh Gandhi    schedule 25.06.2021