- Statut
- Ouvert
- Étiquettes de sujet
- WCML
Aperçu de l’anomalie
La description courte du produit WooCommerce est basée sur le champ d’extrait d’article, et il s’agit généralement d’un simple champ de texte qui ne prend pas en charge les shortcodes. Par conséquent, il n’est pas prévu que si vous collez des shortcodes de constructeur de pages dans l’extrait d’article, ils fonctionnent, et lors de la traduction des extraits d’articles, WPML ne tente pas de traiter ces shortcodes.
Mais WC gère ces « extraits » un peu différemment, et les shortcodes fonctionnent, mais WPML agit toujours comme si ce n’était pas le cas, et si le shortcode inclut des attributs qui doivent être traduits ou des liens internes qui devraient être gérés automatiquement, cela n’est pas facilement possible.
Solution de contournement
Nous avons préparé un code qui peut être ajouté en tant qu’extension pour fournir cette fonctionnalité. Copiez et collez le code ci-dessous dans un fichier que vous pouvez nommer wpmlpb-excerpts.php et enregistrez-le dans votre répertoire wp-content/plugins/, puis activez l’extension.
<?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,
]
);
}
}
}
}
}