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; } }