PluginProbe ʕ •ᴥ•ʔ
WPML Multilingual & Multicurrency for WooCommerce / trunk
WPML Multilingual & Multicurrency for WooCommerce vtrunk
5.3.8 5.3.9 5.4.3 5.4.4 5.4.5 5.5.1 5.5.1.1 5.5.2.2 5.5.2.3 5.5.3 5.5.3.1 5.5.4 5.5.5 5.5.6 trunk 0.9 1.0 1.1 1.2 1.3 1.4 1.5 2.0 2.2 2.3 2.3.1 2.3.2 3.0 3.0.1 3.1 3.2 3.2.1 3.2.2 3.3 3.3.1 3.3.2 3.3.3 3.3.4 3.4 3.4.1 3.4.2 3.4.3 3.5 3.5.1 3.5.2 3.5.3 3.5.4 3.5.5 3.6 3.6.1 3.6.10 3.6.11 3.6.2 3.6.3 3.6.4 3.6.5 3.6.5.1 3.6.6 3.6.7 3.6.8 3.6.9 3.7 3.7.1 3.7.10 3.7.11 3.7.12 3.7.13 3.7.14 3.7.15 3.7.16 3.7.2 3.7.3 3.7.4 3.7.5 3.7.6 3.7.7 3.7.8 3.7.9 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.9.0 3.9.1 3.9.1.1 3.9.2 3.9.3 3.9.4 3.9.5 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.10.4 4.11.2 4.11.3.2 4.11.5 4.11.6 4.12.1 4.12.4 4.12.5 4.12.6 4.2.0 4.2.0.1 4.2.1 4.2.1.1 4.2.10 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 4.2.7 4.2.7.1 4.2.8 4.2.8.1 4.2.9 4.3.0 4.3.1 4.3.2 4.3.2.1 4.3.3 4.3.4 4.3.5 4.3.6 4.3.7 4.4.0 4.4.1 4.4.2 4.4.2.1 4.5.0 4.6.0 4.6.1 4.6.2 4.6.2.1 4.6.3 4.6.5 4.6.6 4.6.7 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.7.5 4.7.6 4.7.7 4.7.8 4.7.9 4.8.0 4.9.0 4.9.1 5.0.1 5.0.2 5.1.1 5.1.2 5.1.3 5.2.0 5.2.1 5.3.2 5.3.3.1 5.3.4 5.3.5 5.3.6 5.3.7
woocommerce-multilingual / classes / Synchronization / Component / Linked.php
woocommerce-multilingual / classes / Synchronization / Component Last commit date
Attachments.php 1 year ago Attributes.php 4 months ago DownloadableFiles.php 4 months ago Linked.php 10 months ago Meta.php 1 year ago Post.php 3 months ago Stock.php 1 year ago Synchronizer.php 1 year ago SynchronizerForMeta.php 9 months ago Taxonomies.php 4 months ago VariationAttachments.php 1 year ago VariationMeta.php 8 months ago VariationTaxonomies.php 8 months ago Variations.php 1 month ago
Linked.php
98 lines
1 <?php
2
3 namespace WCML\Synchronization\Component;
4
5 class Linked extends SynchronizerForMeta {
6
7 const LINKED_META_KEYS = [
8 '_upsell_ids',
9 '_cross_sell_ids',
10 '_children',
11 ];
12
13 const TRANSIENTS_PREFIXES = [
14 'wc_product_children_%s', // Note that this is also removed in the Stock management (!?).
15 '_transient_wc_product_children_ids_%s',
16 ];
17
18 /**
19 * @param \WP_Post $product
20 * @param int[] $translationsIds
21 * @param array<int,string> $translationsLanguages
22 */
23 public function run( $product, $translationsIds, $translationsLanguages ) {
24 foreach ( self::LINKED_META_KEYS as $metaKey ) {
25 $this->syncLinkType( $product->ID, $translationsIds, $translationsLanguages, $metaKey );
26 }
27 foreach ( $translationsIds as $translationId ) {
28 $translationParentId = wp_get_post_parent_id( $translationId );
29 if ( $translationParentId ) {
30 foreach ( self::TRANSIENTS_PREFIXES as $transientPrefix ) {
31 delete_transient( sprintf( $transientPrefix, $translationParentId ) );
32 }
33 }
34 }
35 }
36
37 /**
38 * @param int $productId
39 * @param int[] $translationsIds
40 * @param array<int,string> $translationsLanguages
41 * @param string $metaKey
42 */
43 private function syncLinkType( $productId, $translationsIds, $translationsLanguages, $metaKey ) {
44 $productsIds = array_merge( [ $productId ], $translationsIds );
45 $storedLinks = $this->getMeta( $metaKey, $productsIds );
46 $productLinks = $storedLinks[ $productId ] ?? null;
47
48 if ( null === $productLinks ) {
49 $translationsIdsToClear = array_intersect( $translationsIds, array_keys( $storedLinks ) );
50 $this->clearTranslationsValue( $translationsIdsToClear, $metaKey );
51 return;
52 }
53
54 if ( empty( $productLinks ) ) {
55 $this->spreadEmptyValue( $translationsIds, $storedLinks, $metaKey );
56 return;
57 }
58
59 $translatedLinks = [];
60 foreach ( $translationsLanguages as $translationId => $language ) {
61 $translatedLinks[ $translationId ] = $this->translateLinks( $productLinks, $language );
62 }
63
64 $metaToInsert = [];
65 $metaToUpdate = [];
66 foreach ( $translatedLinks as $translationId => $translationLinks ) {
67 if ( ! array_key_exists( $translationId, $storedLinks ) ) {
68 $metaToInsert[ $translationId ] = $translationLinks;
69 continue;
70 }
71 if ( maybe_serialize( $translationLinks ) === maybe_serialize( $storedLinks[ $translationId ] ) ) {
72 continue;
73 }
74 $metaToUpdate[ $translationId ] = $translationLinks;
75 }
76
77 $this->insertMeta( $metaKey, $metaToInsert );
78 $this->updateMeta( $metaKey, $metaToUpdate );
79 }
80
81 /**
82 * @param int[] $productLinks
83 * @param string $language
84 *
85 * @return int[]
86 *
87 * @todo Request from Core a mechanism to translate multiple IDs belonging to the same post type.
88 */
89 private function translateLinks( $productLinks, $language ) {
90 $translatedLinkedProducts = [];
91 foreach ( $productLinks as $linkedProduct ) {
92 $translatedLinkedProducts[] = apply_filters( 'wpml_object_id', $linkedProduct, get_post_type( $linkedProduct ), false, $language );
93 }
94 return $translatedLinkedProducts;
95 }
96
97 }
98