192 lines
6.4 KiB
PHP
192 lines
6.4 KiB
PHP
<?php
|
|
|
|
namespace WPML\TM\Jobs;
|
|
|
|
use WPML\FP\Fns;
|
|
use WPML\FP\Obj;
|
|
use WPML\FP\Str;
|
|
use function WPML\FP\pipe;
|
|
|
|
class TermMeta {
|
|
/**
|
|
* It returns translated term description stored inside wp_icl_translate
|
|
*
|
|
* @param int $iclTranslateJobId
|
|
* @param int $termTaxonomyId
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function getTermDescription( $iclTranslateJobId, $termTaxonomyId ) {
|
|
global $wpdb;
|
|
|
|
$sql = "SELECT field_data_translated
|
|
FROM {$wpdb->prefix}icl_translate
|
|
WHERE job_id = %d AND field_type = 'tdesc_%d'";
|
|
|
|
$description = $wpdb->get_var( $wpdb->prepare( $sql, $iclTranslateJobId, $termTaxonomyId ) );
|
|
|
|
return $description ? base64_decode( $description ) : '';
|
|
}
|
|
|
|
/**
|
|
* It returns term meta stored inside wp_icl_translate table.
|
|
*
|
|
* Data has such format:
|
|
* [
|
|
* (object)[
|
|
* field_type => 'some_scalar_field',
|
|
* field_data_translated => 'Translated value'
|
|
* ],
|
|
* (object)[
|
|
* field_type => 'some_array_valued_field_like_checkboxes'
|
|
* field_data_translated => [
|
|
* 'Translated option 1', 'Translated option 2', 'Translated option 3'
|
|
* ]
|
|
* ],
|
|
* (object)[
|
|
* field_type => 'another_array_valued_field_like_checkboxes'
|
|
* field_data_translated => [
|
|
* 'option1' => ['Translated option 1'],
|
|
* 'option2' => ['Translated option 2'],
|
|
* ]
|
|
* ]
|
|
* ]
|
|
*
|
|
* @param int $iclTranslateJobId
|
|
* @param int $term_taxonomy_id
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getTermMeta( $iclTranslateJobId, $term_taxonomy_id ) {
|
|
return array_merge(
|
|
self::geRegularTermMeta( $iclTranslateJobId, $term_taxonomy_id ),
|
|
self::getTermMetaWithArrayValue( $iclTranslateJobId, $term_taxonomy_id )
|
|
);
|
|
}
|
|
|
|
/**
|
|
* It returns term meta which have scalar values
|
|
*
|
|
* @param int $iclTranslateJobId
|
|
* @param int $termTaxonomyId
|
|
*
|
|
* @return mixed[]
|
|
*/
|
|
private static function geRegularTermMeta( $iclTranslateJobId, $termTaxonomyId ) {
|
|
global $wpdb;
|
|
|
|
$sql = "SELECT field_data_translated, field_type
|
|
FROM {$wpdb->prefix}icl_translate
|
|
WHERE job_id = %d AND field_type LIKE 'tfield-%-%d'";
|
|
|
|
$rowset = $wpdb->get_results( $wpdb->prepare( $sql, $iclTranslateJobId, $termTaxonomyId ) );
|
|
|
|
return Fns::map( Obj::over( Obj::lensProp( 'field_data_translated' ), 'base64_decode' ), $rowset );
|
|
}
|
|
|
|
/**
|
|
* It returns term meta with array values grouped by term name.
|
|
*
|
|
* Custom field created by Toolset Types example:
|
|
*
|
|
* A term has checkboxes field with options: A, B, and C. They are stored in wp_icl_translate table as 3 entries under such field_type:
|
|
* - tfield-wpcf-jakub-checkboxes-13_wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1_0
|
|
* - tfield-wpcf-jakub-checkboxes-13_wpcf-fields-checkboxes-option-6cdwwdwdwdwdwwdwddwd2bb12fc2d1c4-1_0
|
|
* - tfield-wpcf-jakub-checkboxes-13_wpcf-fields-checkboxes-option-611111wdwdwdwwdwddwd2bb12fc2d1c4-1_0
|
|
*
|
|
* Options translations are A fr, B fr, and C fr.
|
|
*
|
|
* Our goal is to group them into one entry:
|
|
* (object) [
|
|
* field_type => 'tfield-wpcf-jakub-checkboxes-13'
|
|
* field_data_translated => [
|
|
* wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1 => [
|
|
* 0 => 'A fr',
|
|
* ],
|
|
* wpcf-fields-checkboxes-option-6cdwwdwdwdwdwwdwddwd2bb12fc2d1c4-1 => [
|
|
* 0 => 'B fr',
|
|
* ],
|
|
* wpcf-fields-checkboxes-option-611111wdwdwdwwdwddwd2bb12fc2d1c4-1 => [
|
|
* 0 => 'C fr',
|
|
* ],
|
|
* ]
|
|
* ]
|
|
*
|
|
* Custom field created by ACF example:
|
|
*
|
|
* ACF stores data in a slightly different way. Again, A term has checkboxes field with options A, B, C with the same translations A fr, B fr, C fr.
|
|
* They are stored in wp_icl_translate in this way:
|
|
* - tfield-jakub_checkboxes-13_0
|
|
* - tfield-jakub_checkboxes-13_1
|
|
* - tfield-jakub_checkboxes-13_2
|
|
*
|
|
* Our goal is to group them into one entry:
|
|
* (object)[
|
|
* field_type => 'tfield-jakub-checkboxes-13',
|
|
* field_data_translated => [
|
|
* 0 => 'A fr',
|
|
* 1 => 'B fr',
|
|
* 2 => 'C fr'
|
|
* ]
|
|
* ]
|
|
*
|
|
* @param int $iclTranslateJobId
|
|
* @param int $termTaxonomyId
|
|
*
|
|
* @return mixed[]
|
|
*/
|
|
private static function getTermMetaWithArrayValue( $iclTranslateJobId, $termTaxonomyId ) {
|
|
global $wpdb;
|
|
|
|
$sql = "SELECT field_data_translated, field_type
|
|
FROM {$wpdb->prefix}icl_translate
|
|
WHERE job_id = %d AND field_type LIKE 'tfield-%-%d_%'";
|
|
|
|
$rowset = $wpdb->get_results( $wpdb->prepare( $sql, $iclTranslateJobId, $termTaxonomyId ) );
|
|
|
|
/**
|
|
* From field type like: tfield-wpcf-jakub-checkboxes-13_wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1_0
|
|
* extracts core field name: wpcf-jakub-checkboxes-13
|
|
*/
|
|
$extractFieldName = pipe( Obj::prop( 'field_type' ), Str::match( '/tfield-(.*)-\d/U' ), Obj::prop( 1 ) );
|
|
|
|
/**
|
|
* From field type like: tfield-wpcf-jakub-checkboxes-13_wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1_0
|
|
* extracts option name part: wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1_0
|
|
*/
|
|
$extractOptions = function ( $row, $fieldName ) {
|
|
return Str::pregReplace( "/tfield-{$fieldName}-\d+_/U", '', $row->field_type );
|
|
};
|
|
|
|
$groupOptions = function ( $carry, $row ) use ( $extractFieldName, $extractOptions ) {
|
|
$fieldName = $extractFieldName( $row );
|
|
! isset( $carry[ $fieldName ] ) && $carry[ $fieldName ] = [];
|
|
|
|
$options = $extractOptions( $row, $fieldName );
|
|
|
|
/**
|
|
* If field_type is: tfield-wpcf-jakub-checkboxes-13_wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1_0
|
|
* then meta keys are: [wpcf-jakub-checkboxes-13, wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1, 0]
|
|
*/
|
|
$metaKeys = array_merge( [ $fieldName ], explode( '_', $options ) );
|
|
|
|
/**
|
|
* Builds array like:
|
|
* [wpcf-jakub-checkboxes-13 => [wpcf-fields-checkboxes-option-6c88acb978ec7f24eb6a2bb12fc2d1c4-1 => [0 => Translation_value ] ] ]
|
|
*
|
|
* If there are already data under wpcf-jakub-checkboxes-13 key, they are preserve too. The new values are appended.
|
|
*/
|
|
return Utils::insertUnderKeys( $metaKeys, $carry, base64_decode( $row->field_data_translated ) );
|
|
};
|
|
|
|
$recreateJobElement = function ( $data, $fieldType ) use ( $termTaxonomyId ) {
|
|
return (object) [
|
|
'field_type' => 'tfield-' . $fieldType . '-' . $termTaxonomyId,
|
|
'field_data_translated' => $data,
|
|
];
|
|
};
|
|
|
|
return Obj::values( Fns::map( $recreateJobElement, Fns::reduce( $groupOptions, [], $rowset ) ) );
|
|
}
|
|
}
|