- Estado
- Abierto
- Etiquetas de temática
- WCML
Resumen del problema
La descripción corta del producto de WooCommerce se basa en el campo del extracto de la entrada, y este suele ser un campo de texto simple que no procesa shortcodes. Por lo tanto, no se espera que los shortcodes de un maquetador visual funcionen si los pega en el extracto de la entrada, y al traducir los extractos de las entradas, WPML no intenta procesar dichos shortcodes.
Sin embargo, WC procesa estos «extractos» de un modo algo distinto, y los shortcodes sí funcionan, pero WPML sigue actuando como si no lo hicieran, y si el shortcode incluye atributos que necesitan traducción o enlaces internos que deban procesarse automáticamente, esto no es fácilmente posible.
Solución alternativa
Hemos preparado un código que se puede añadir como plugin para proporcionar esta funcionalidad. Copie y pegue el siguiente código en un archivo al que puede llamar wpmlpb-excerpts.php y guárdelo en su directorio wp-content/plugins/, y luego active el plugin.
<?php
/**
* Plugin Name: WPML Page Builders - Proces Excerpts
* Description: Parses shortcode strings in exceprts.
* Version: 1.0
*/
namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() {
add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
}
public function joinWithContent( $content, $id ) {
$post = get_post( $id );
if ( $post && $post->post_excerpt ) {
$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
}
return $content;
}
public function excludeFromJob( $package, $post ) {
if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
$package['contents']['excerpt']['translate'] = 0;
$package['contents']['excerpt']['data'] = '';
}
return $package;
}
public function splitFromContent( $post_id ) {
$post = get_post( $post_id );
if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
$end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) {
$content = substr( $post->post_content, 0, $start_pos );
$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) {
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
'post_excerpt' => $excerpt,
]
);
}
}
}
}
}