94 lines
2.1 KiB
PHP
94 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace WPML\ST;
|
|
|
|
class Shortcode {
|
|
|
|
const STRING_DOMAIN = 'wpml-shortcode';
|
|
|
|
private $context;
|
|
private $name;
|
|
/**
|
|
* @var \wpdb
|
|
*/
|
|
private $wpdb;
|
|
|
|
public function __construct( \wpdb $wpdb ) {
|
|
$this->wpdb = $wpdb;
|
|
}
|
|
|
|
function init_hooks() {
|
|
add_shortcode( 'wpml-string', [ $this, 'render' ] );
|
|
}
|
|
|
|
/**
|
|
* @param array $attributes
|
|
* @param string $value
|
|
*
|
|
* @return string
|
|
*/
|
|
function render( $attributes, $value ) {
|
|
$this->parse_attributes( $attributes, $value );
|
|
$this->maybe_register_string( $value );
|
|
|
|
return do_shortcode( icl_t( $this->context, $this->name, $value ) );
|
|
}
|
|
|
|
/**
|
|
* @param string $value
|
|
*/
|
|
private function maybe_register_string( $value ) {
|
|
$string = $this->get_registered_string();
|
|
if ( ! $string || $string->value !== $value ) {
|
|
icl_register_string( $this->context, $this->name, $value );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param array $attributes
|
|
* @param string $value
|
|
*/
|
|
private function parse_attributes( $attributes, $value ) {
|
|
$pairs = array(
|
|
'context' => self::STRING_DOMAIN,
|
|
'name' => 'wpml-shortcode-' . md5( $value ),
|
|
);
|
|
|
|
$attributes = shortcode_atts( $pairs, $attributes );
|
|
|
|
$this->context = $attributes['context'];
|
|
$this->name = $attributes['name'];
|
|
}
|
|
|
|
/**
|
|
* @return \stdClass
|
|
*/
|
|
private function get_registered_string() {
|
|
$strings = $this->get_strings_registered_in_context();
|
|
if ( $strings && array_key_exists( $this->name, $strings ) ) {
|
|
return $strings[ $this->name ];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* @return \stdClass[]
|
|
*/
|
|
private function get_strings_registered_in_context() {
|
|
$cache_key = $this->context;
|
|
$cache_group = 'wpml-string-shortcode';
|
|
|
|
$cache_found = false;
|
|
$string = wp_cache_get( $cache_key, $cache_group, false, $cache_found );
|
|
if ( ! $cache_found ) {
|
|
$query = 'SELECT name, id, value, status FROM ' . $this->wpdb->prefix . 'icl_strings WHERE context=%s';
|
|
$sql = $this->wpdb->prepare( $query, $this->context );
|
|
$string = $this->wpdb->get_results( $sql, OBJECT_K );
|
|
wp_cache_set( $cache_key, $string, $cache_group );
|
|
}
|
|
|
|
return $string;
|
|
}
|
|
}
|