206 lines
5.2 KiB
PHP
206 lines
5.2 KiB
PHP
<?php
|
|
/**
|
|
* @package Polylang-Pro
|
|
*/
|
|
|
|
/**
|
|
* Abstract class for language switcher block.
|
|
*
|
|
* @since 3.2
|
|
*/
|
|
abstract class PLL_Abstract_Language_Switcher_Block {
|
|
/**
|
|
* @var PLL_Links
|
|
*/
|
|
protected $links;
|
|
|
|
/**
|
|
* @var PLL_Model
|
|
*/
|
|
protected $model;
|
|
|
|
/**
|
|
* Current lang to render the language switcher block in an admin context.
|
|
*
|
|
* @since 2.8
|
|
*
|
|
* @var string|null
|
|
*/
|
|
protected $admin_current_lang;
|
|
|
|
/**
|
|
* Is it the edit context?
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $is_edit_context = false;
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @since 2.8
|
|
*
|
|
* @param PLL_Base $polylang Polylang object.
|
|
*/
|
|
public function __construct( &$polylang ) {
|
|
$this->model = &$polylang->model;
|
|
$this->links = &$polylang->links;
|
|
}
|
|
|
|
/**
|
|
* Adds the required hooks.
|
|
*
|
|
* @since 3.2
|
|
*
|
|
* @return self
|
|
*/
|
|
public function init() {
|
|
// Use rest_pre_dispatch_filter to get additionnal parameters for language switcher block.
|
|
add_filter( 'rest_pre_dispatch', array( $this, 'get_rest_query_params' ), 10, 3 );
|
|
|
|
// Register language switcher block.
|
|
add_action( 'init', array( $this, 'register' ) );
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Returns the block name with the Polylang's namespace.
|
|
*
|
|
* @since 3.2
|
|
*
|
|
* @return string The block name.
|
|
*/
|
|
abstract protected function get_block_name();
|
|
|
|
/**
|
|
* Renders the Polylang's block on server.
|
|
*
|
|
* @since 3.2
|
|
* @since 3.3 Accepts two new parameters, $content and $block.
|
|
*
|
|
* @param array $attributes The block attributes.
|
|
* @param string $content The saved content.
|
|
* @param WP_Block $block The parsed block.
|
|
* @return string The HTML string output to serve.
|
|
*/
|
|
abstract public function render( $attributes, $content, $block );
|
|
|
|
/**
|
|
* Returns the supported pieces of inherited context for the block, by default none are supported..
|
|
*
|
|
* @since 3.3
|
|
*
|
|
* @return array An array with context subject, default to empty.
|
|
*/
|
|
protected function get_context() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Registers the Polylang's block.
|
|
*
|
|
* @since 2.8
|
|
* @since 3.2 Renamed and now handle any type of block registration based on a dynamic name.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function register() {
|
|
if ( WP_Block_Type_Registry::get_instance()->is_registered( $this->get_block_name() ) ) {
|
|
// Don't register a block more than once or WordPress send an error. See https://github.com/WordPress/wordpress-develop/blob/5.9/src/wp-includes/class-wp-block-type-registry.php#L82-L90
|
|
return;
|
|
}
|
|
|
|
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
|
|
|
$script_filename = 'js/build/blocks' . $suffix . '.js';
|
|
$script_handle = 'pll_blocks';
|
|
wp_register_script(
|
|
$script_handle,
|
|
plugins_url( $script_filename, POLYLANG_ROOT_FILE ),
|
|
array(
|
|
'wp-block-editor',
|
|
'wp-blocks',
|
|
'wp-components',
|
|
'wp-element',
|
|
'wp-i18n',
|
|
'wp-server-side-render',
|
|
'lodash',
|
|
),
|
|
POLYLANG_VERSION,
|
|
true
|
|
);
|
|
|
|
wp_localize_script( $script_handle, 'pll_block_editor_blocks_settings', PLL_Switcher::get_switcher_options( 'block', 'string' ) );
|
|
|
|
$attributes = array(
|
|
'className' => array(
|
|
'type' => 'string',
|
|
'default' => '',
|
|
),
|
|
);
|
|
foreach ( PLL_Switcher::get_switcher_options( 'block', 'default' ) as $option => $default ) {
|
|
$attributes[ $option ] = array(
|
|
'type' => 'boolean',
|
|
'default' => $default,
|
|
);
|
|
}
|
|
|
|
register_block_type(
|
|
$this->get_block_name(),
|
|
array(
|
|
'editor_script' => $script_handle,
|
|
'attributes' => $attributes,
|
|
'render_callback' => array( $this, 'render' ),
|
|
'uses_context' => $this->get_context(),
|
|
)
|
|
);
|
|
|
|
// Translated strings used in JS code
|
|
wp_set_script_translations( $script_handle, 'polylang-pro' );
|
|
}
|
|
|
|
/**
|
|
* Returns the REST parameters for language switcher block.
|
|
* Used to store the request's language and context locally.
|
|
* Previously was in the `PLL_Block_Editor_Switcher_Block` class.
|
|
*
|
|
* @see WP_REST_Server::dispatch()
|
|
*
|
|
* @since 2.8
|
|
*
|
|
* @param mixed $result Response to replace the requested version with. Can be anything
|
|
* a normal endpoint can return, or null to not hijack the request.
|
|
* @param WP_REST_Server $server Server instance.
|
|
* @param WP_REST_Request $request Request used to generate the response.
|
|
* @return mixed
|
|
*/
|
|
public function get_rest_query_params( $result, $server, $request ) {
|
|
if ( pll_is_edit_rest_request( $request ) ) {
|
|
$this->is_edit_context = true;
|
|
$this->admin_current_lang = $request->get_param( 'lang' );
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Adds the attributes to render the block correctly.
|
|
* Also specifies not to echo the switcher in any case.
|
|
*
|
|
* @since 3.2
|
|
*
|
|
* @param array $attributes The attributes of the currently rendered block.
|
|
* @return array The modified attributes.
|
|
*/
|
|
protected function set_attributes_for_block( $attributes ) {
|
|
$attributes['echo'] = 0;
|
|
if ( $this->is_edit_context ) {
|
|
$attributes['admin_render'] = 1;
|
|
$attributes['admin_current_lang'] = $this->admin_current_lang;
|
|
$attributes['hide_if_empty'] = 0;
|
|
$attributes['hide_if_no_translation'] = 0; // Force not to hide the language for the block preview even if the option is checked.
|
|
}
|
|
return $attributes;
|
|
}
|
|
}
|