- สถานะ
- เปิด
- แท็กหัวข้อ
- WCML
ภาพรวมของปัญหา
คำอธิบายแบบสั้นของผลิตภัณฑ์ WooCommerce จะอิงตามฟิลด์ข้อความตัดตอนของโพสต์ ซึ่งโดยปกติแล้วจะเป็นฟิลด์ข้อความธรรมดาที่ไม่รองรับ shortcode ด้วยเหตุนี้ จึงไม่สามารถคาดหวังได้ว่าหากคุณวาง shortcode ของปลั๊กอินสร้างหน้าเว็บลงในข้อความตัดตอนของโพสต์แล้วจะสามารถใช้งานได้ และเมื่อแปลข้อความตัดตอนของโพสต์ WPML จะไม่พยายามจัดการกับ shortcode ดังกล่าว
แต่ WC จะจัดการกับ “ข้อความตัดตอน” เหล่านี้แตกต่างออกไปเล็กน้อย และ shortcode สามารถใช้งานได้ แต่ WPML ยังคงทำงานเสมือนว่าไม่สามารถใช้งานได้ และหาก shortcode มีแอตทริบิวต์ที่ต้องแปลหรือลิงก์ภายในที่ควรได้รับการจัดการโดยอัตโนมัติ ก็จะไม่สามารถทำได้โดยง่าย
วิธีแก้ปัญหาชั่วคราว
เราได้เตรียมโค้ดที่สามารถเพิ่มเป็นปลั๊กอินเพื่อรองรับการทำงานนี้ คัดลอกและวางโค้ดด้านล่างลงในไฟล์ที่คุณอาจตั้งชื่อว่า 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,
]
);
}
}
}
}
}