- סטטוס
- פתוח
- תגיות נושא
- WCML
סקירה כללית של התקלה
התיאור הקצר של המוצר ב־WooCommerce מבוסס על שדה התקציר של הפוסט, וזהו בדרך כלל שדה טקסט פשוט שאינו מטפל בשורטקודים. בשל כך, לא צפוי שאם תדביק שורטקודים של תוסף בניית עמודים לתוך תקציר הפוסט הם יעבדו, ובעת תרגום תקצירי פוסטים WPML אינו מנסה לטפל בשורטקודים כאלה.
אבל WC מטפל ב”תקצירים” אלה קצת אחרת, ושורטקודים כן עובדים, אך WPML עדיין מתנהג כאילו הם לא. לכן, אם השורטקוד כולל מאפיינים שדורשים תרגום או קישורים פנימיים שיש לטפל בהם אוטומטית, הדבר אינו מתאפשר בקלות.
פתרון עוקף
הכנו קוד שניתן להוסיף כתוסף כדי לספק פונקציונליות זו. העתק והדבק את הקוד הבא לקובץ שתוכל לקרוא לו wpmlpb-excerpts.php ושמור אותו בתיקיית wp-content/plugins/ שלך, ולאחר מכן הפעל את התוסף.
<?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,
]
);
}
}
}
}
}