Harish Kumar
Estoy trabajando en un servicio web (API) donde obtengo el resultado de la función WP_query() y lo analizo en formato JSON. que se utilizará más en la aplicación de Android. El problema es que el post_content que obtengo con la consulta está compuesto por visual composer y todo el contenido está en forma de etiquetas como
[VC_ROW][/VC_ROW][VC_COLUMN]some text[/VC_COLUMN] etc.
Quiero eliminar/eliminar todos estos shortcodes del contenido y recuperar solo texto sin formato. ¿Hay alguna función de compositor visual a través de la cual pueda lograr esto?
<?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);
}
}
?>
I want to remove/strip all these shortcode from the content and retrieve only plain text from it.
Solución que funcionó para mí:
$content = strip_tags( do_shortcode( $post->post_content ) );
do_shortcode
activa todos los códigos abreviados del compositor visual y, por lo tanto, devuelve html+texto;
strip_tags
elimina todas las etiquetas html y devuelve texto sin formato.
-
después de algunas investigaciones, esta fue la forma más inteligente de abordar el problema.
– wbq
14 dic 2020 a las 21:00
Raúl K
Aquí, puede probar y agregar fácilmente algunos códigos cortos en la matriz que necesita y también puede eliminar todos los códigos cortos a través del código a continuación.
$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;
quieres quedarte con algunos códigos cortos que no puedes usar strip_shortcodes()
para eso.
-
para mí ahora este código funciona str_replace(‘[vc_column_inner width=”1/3″]’,”,preg_replace(“~(?:[/?)[^/]]+/?]~s”, ”, $po->post_content)) en realidad hay diferentes parámetros en vc_column, por lo que si aparecen, los eliminaré con str_replace. Su respuesta es un poco de ayuda. La votaré pero no es la solucion exacta
–Harish Kumar
4 de agosto de 2016 a las 11:12
-
Mire, he actualizado el código y el parámetro no importa en el código abreviado, esta expresión regular solo verifica el código abreviado que ha usado en la matriz. puedes ejecutar este código todavía
VC_COLUMN_INNTER
pasó en matriz entonces y luego aceptó en contenido con parámetros.– Raúl K.
4 de agosto de 2016 a las 12:23
-
Desarrollé un complemento gratuito de WordPress para resolver este problema, el complemento llamado ( Shortcode Cleaner Lite ) wordpress.org/plugins/shortcode-limpiador-lite Proporciona una manera fácil de limpiar códigos abreviados rotos y no utilizados del contenido de WordPress automáticamente, para que pueda cambiar entre temas y complementos sin preocuparse y mantener su contenido limpio y actualizado todo el tiempo, se trata de cualquier tema (Divi, Avada…etc. ) códigos abreviados que quedan al cambiar temas o complementos o creadores de páginas (Visual Composer, Elementor, Beaver, etc.).
– mohamdio
12 de febrero de 2018 a las 11:58
-
lo siento, pero ni la primera ni la segunda línea preg_replace eliminaron los códigos abreviados de mi cadena de contenido.
– wbq
9 de enero de 2020 a las 0:28
Muhammad Jizer Khan
La mejor solución, resuelto.
Simplemente agregue el siguiente código al archivo wp-includes/rest-api.phpen el fondo:
/**
* 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;
}
-
Está funcionando, pero el problema es cuando actualizamos WordPress y luego ocurrió el problema, ¿no podemos agregar esto o crear un complemento personalizado para esto?
– Zahier Ahmad
14 de marzo de 2019 a las 10:49
-
Alterar los archivos principales es lo peor que podrías hacer.
– wbq
14 de diciembre de 2020 a las 20:52
Svetoslav
Lo llevé a algún lado y lo actualicé un poco, para que funcione un poco mejor :). en functions.php agregue esta función:
/** 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.'';
}
}
y despues de eso lo llamas normalmente kc_excerpt(20);
y devolverá normal post_content/excerpt
Cómo eliminar el compositor visual de la publicación de wp: es decir [vc_row][vc_column width=\"2/3\"][distance][vc_single_image image=\"40530\" img_size=\"large\"][distance][distance][distance][vc_column_text]
También WP post remvoe códigos cortos y etiquetas 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 );
}
Jocelino Pereira
Buscando el código fuente de wordpress api, hice una función para eliminar algunos códigos abreviados del contenido. Así que este es el resultado:
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;
}
ejemplo:
$content = "<p>Hi, this is a [example]<b>example</b>[/example]. [end]</p>";
$shortcodesToRemove = ["example", "end"];
echo removeShortcode($content, $shortcodesToRemove);
hitesh gandhi
foreach($posts as $po){
$services_array[] = array('id'=>$po->ID,'title'=>$po->post_title, 'description'=>do_shortcode($po->post_content));
}
- Deberías probar esto.
puedes probar
strip_shortcodes()
y esta función proporcionada por wordpress.– Raúl K.
4 de agosto de 2016 a las 10:02
@Rocky strip_shortcodes() No funcionó, ya lo intenté antes
–Harish Kumar
4 de agosto de 2016 a las 10:07
Has probado ? expresiones regulares
preg_replace("~(?:\[/?)[^/\]]+/?\]~s", '', $the_content);
– Raúl K.
4 de agosto de 2016 a las 10:13
@Rocky, sí, hombre, funciona. Pero, ¿por qué no funciona con strip_shortcodes()? También tiene lo mismo en esa función
–Harish Kumar
4 de agosto de 2016 a las 10:17
¿Puedes compartir tu código para que pueda verificar por qué no funciona desde tu lado?
– Raúl K.
4 de agosto de 2016 a las 10:19