Files
2025-02-24 22:33:42 +01:00

189 lines
3.5 KiB
PHP

<?php
/**
* @package Polylang-Pro
*/
defined( 'ABSPATH' ) || exit;
/**
* A class to work with template slugs (and their language suffix).
*
* @since 3.2
*/
class PLL_FSE_Template_Slug {
/**
* Separator used for the language suffix.
*
* @var string
*/
const SEPARATOR = '___';
/**
* Pattern that matches a language slug.
*
* @var string
*/
private $lang_pattern = '[a-z_-]+';
/**
* The raw template slug.
*
* @var string
*/
private $slug = '';
/**
* The template slug after regex matching.
*
* @var string[] {
* @type string $slug The template slug without language suffix.
* @type string $lang The language slug.
* }
*/
private $slug_arr = array();
/**
* Constructor.
*
* @since 3.2
*
* @param string $slug A template slug.
* @param string[] $lang_slugs List of language slugs to use.
* @return void
*/
public function __construct( $slug, array $lang_slugs = array() ) {
if ( ! is_string( $slug ) ) {
return;
}
$this->slug = $slug;
$lang_slugs = array_filter(
$lang_slugs,
function ( $slug ) {
return is_string( $slug ) && preg_match( "@^{$this->lang_pattern}$@", $slug );
}
);
if ( ! empty( $lang_slugs ) ) {
$this->lang_pattern = implode( '|', $lang_slugs );
}
}
/**
* Returns the template slug.
*
* @since 3.2
*
* @return string
*/
public function get() {
return $this->slug;
}
/**
* Get the template slug without its language suffix.
*
* @since 3.2
*
* @return string
*/
public function get_template_slug() {
$this->match();
return $this->slug_arr['slug'];
}
/**
* Get the language slug from the template slug.
*
* @since 3.2
*
* @return string
*/
public function get_language() {
$this->match();
return $this->slug_arr['lang'];
}
/**
* Tells if the template slug has a language suffix already.
*
* @since 3.2
*
* @return bool
*/
public function has_language() {
$this->match();
return ! empty( $this->slug_arr['lang'] );
}
/**
* Adds a language suffix to the template slug.
*
* @since 3.2
*
* @param string $language_slug A language slug.
* @return string The template slug with its new language suffix.
*/
public function update_language( $language_slug ) {
if ( ! is_string( $language_slug ) || '' === $language_slug ) {
return $this->slug;
}
$this->match();
$this->slug_arr['lang'] = $language_slug;
$this->slug = $this->slug_arr['slug'] . self::SEPARATOR . $this->slug_arr['lang'];
return $this->slug;
}
/**
* Removes the language suffix from a shared slug.
*
* @since 3.2
*
* @return string The template slug without the language suffix.
*/
public function remove_language() {
$this->match();
$this->slug_arr['lang'] = '';
$this->slug = $this->slug_arr['slug'];
return $this->slug;
}
/**
* Performs a regex match to separate the template slug and the language suffix.
* This will fill in the property `$this->slug_arr`.
*
* @since 3.2
*
* @return void
*/
private function match() {
if ( ! empty( $this->slug_arr ) ) {
// Already ran.
return;
}
$pattern = sprintf( '@^(?<slug>[a-zA-Z0-9_-]+)(?:%s(?<lang>%s))?$@U', self::SEPARATOR, $this->lang_pattern );
$result = preg_match( $pattern, $this->slug, $matches );
$this->slug_arr = array(
'slug' => '',
'lang' => '',
);
if ( empty( $result ) ) {
return;
}
$this->slug_arr['slug'] = $matches['slug'];
$this->slug_arr['lang'] = isset( $matches['lang'] ) ? $matches['lang'] : '';
}
}