You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.6 KiB
219 lines
5.6 KiB
<?php
|
|
/**
|
|
* @package Polylang
|
|
*/
|
|
|
|
/**
|
|
* Links model base class when using pretty permalinks.
|
|
*
|
|
* @since 1.6
|
|
*/
|
|
abstract class PLL_Links_Permalinks extends PLL_Links_Model {
|
|
/**
|
|
* Tells this child class of PLL_Links_Model is for pretty permalinks.
|
|
*
|
|
* @var bool
|
|
*/
|
|
public $using_permalinks = true;
|
|
|
|
/**
|
|
* The name of the index file which is the entry point to all requests.
|
|
* We need this before the global $wp_rewrite is created.
|
|
* Also hardcoded in WP_Rewrite.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $index = 'index.php';
|
|
|
|
/**
|
|
* The prefix for all permalink structures.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $root;
|
|
|
|
/**
|
|
* Whether to add trailing slashes.
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $use_trailing_slashes;
|
|
|
|
/**
|
|
* The name of the rewrite rules to always modify.
|
|
*
|
|
* @var string[]
|
|
*/
|
|
protected $always_rewrite = array( 'date', 'root', 'comments', 'search', 'author' );
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @since 1.8
|
|
*
|
|
* @param PLL_Model $model PLL_Model instance.
|
|
*/
|
|
public function __construct( &$model ) {
|
|
parent::__construct( $model );
|
|
|
|
// Inspired by WP_Rewrite.
|
|
$permalink_structure = get_option( 'permalink_structure' );
|
|
$this->root = preg_match( '#^/*' . $this->index . '#', $permalink_structure ) ? $this->index . '/' : '';
|
|
$this->use_trailing_slashes = ( '/' == substr( $permalink_structure, -1, 1 ) );
|
|
}
|
|
|
|
/**
|
|
* Initializes permalinks.
|
|
*
|
|
* @since 3.5
|
|
*
|
|
* @return void
|
|
*/
|
|
public function init() {
|
|
parent::init();
|
|
|
|
if ( did_action( 'wp_loaded' ) ) {
|
|
$this->do_prepare_rewrite_rules();
|
|
} else {
|
|
add_action( 'wp_loaded', array( $this, 'do_prepare_rewrite_rules' ), 9 ); // Just before WordPress callback `WP_Rewrite::flush_rules()`.
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Fires our own action telling Polylang plugins
|
|
* and third parties are able to prepare rewrite rules.
|
|
*
|
|
* @since 3.5
|
|
*
|
|
* @return void
|
|
*/
|
|
public function do_prepare_rewrite_rules() {
|
|
self::$can_filter_rewrite_rules = true;
|
|
|
|
/**
|
|
* Tells when Polylang is able to prepare rewrite rules filters.
|
|
* Action fired right after `wp_loaded` and just before WordPress `WP_Rewrite::flush_rules()` callback.
|
|
*
|
|
* @since 3.5
|
|
*
|
|
* @param PLL_Links_Permalinks $links Current links object.
|
|
*/
|
|
do_action( 'pll_prepare_rewrite_rules', $this );
|
|
}
|
|
|
|
/**
|
|
* Returns the link to the first page when using pretty permalinks.
|
|
*
|
|
* @since 1.2
|
|
*
|
|
* @param string $url The url to modify.
|
|
* @return string The modified url.
|
|
*/
|
|
public function remove_paged_from_link( $url ) {
|
|
/**
|
|
* Filters an url after the paged part has been removed.
|
|
*
|
|
* @since 2.0.6
|
|
*
|
|
* @param string $modified_url The link to the first page.
|
|
* @param string $original_url The link to the original paged page.
|
|
*/
|
|
return apply_filters( 'pll_remove_paged_from_link', preg_replace( '#/page/[0-9]+/?#', $this->use_trailing_slashes ? '/' : '', $url ), $url );
|
|
}
|
|
|
|
/**
|
|
* Returns the link to the paged page when using pretty permalinks.
|
|
*
|
|
* @since 1.5
|
|
*
|
|
* @param string $url The url to modify.
|
|
* @param int $page The page number.
|
|
* @return string The modified url.
|
|
*/
|
|
public function add_paged_to_link( $url, $page ) {
|
|
/**
|
|
* Filters an url after the paged part has been added.
|
|
*
|
|
* @since 2.0.6
|
|
*
|
|
* @param string $modified_url The link to the paged page.
|
|
* @param string $original_url The link to the original first page.
|
|
* @param int $page The page number.
|
|
*/
|
|
return apply_filters( 'pll_add_paged_to_link', user_trailingslashit( trailingslashit( $url ) . 'page/' . $page, 'paged' ), $url, $page );
|
|
}
|
|
|
|
/**
|
|
* Returns the home url in a given language.
|
|
*
|
|
* @since 1.3.1
|
|
* @since 3.4 Accepts now a language slug.
|
|
*
|
|
* @param PLL_Language|string $language Language object or slug.
|
|
* @return string
|
|
*/
|
|
public function home_url( $language ) {
|
|
if ( $language instanceof PLL_Language ) {
|
|
$language = $language->slug;
|
|
}
|
|
|
|
return trailingslashit( parent::home_url( $language ) );
|
|
}
|
|
|
|
/**
|
|
* Returns the static front page url.
|
|
*
|
|
* @since 1.8
|
|
* @since 3.4 Accepts now an array of language properties.
|
|
*
|
|
* @param PLL_Language|array $language Language object or array of language properties.
|
|
* @return string The static front page url.
|
|
*/
|
|
public function front_page_url( $language ) {
|
|
if ( $language instanceof PLL_Language ) {
|
|
$language = $language->to_array();
|
|
}
|
|
|
|
if ( $this->options['hide_default'] && $language['is_default'] ) {
|
|
return trailingslashit( $this->home );
|
|
}
|
|
$url = home_url( $this->root . get_page_uri( $language['page_on_front'] ) );
|
|
$url = $this->use_trailing_slashes ? trailingslashit( $url ) : untrailingslashit( $url );
|
|
return $this->options['force_lang'] ? $this->add_language_to_link( $url, $language['slug'] ) : $url;
|
|
}
|
|
|
|
/**
|
|
* Prepares rewrite rules filters.
|
|
*
|
|
* @since 1.6
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function get_rewrite_rules_filters() {
|
|
// Make sure that we have the right post types and taxonomies.
|
|
$types = array_values( array_merge( $this->model->get_translated_post_types(), $this->model->get_translated_taxonomies(), $this->model->get_filtered_taxonomies() ) );
|
|
$types = array_merge( $this->always_rewrite, $types );
|
|
|
|
/**
|
|
* Filters the list of rewrite rules filters to be used by Polylang.
|
|
*
|
|
* @since 0.8.1
|
|
*
|
|
* @param array $types The list of filters (without '_rewrite_rules' at the end).
|
|
*/
|
|
return apply_filters( 'pll_rewrite_rules', $types );
|
|
}
|
|
|
|
/**
|
|
* Removes hooks to filter rewrite rules, called when switching blog @see {PLL_Base::switch_blog()}.
|
|
*
|
|
* @since 3.5
|
|
*
|
|
* @return void
|
|
*/
|
|
public function remove_filters() {
|
|
parent::remove_filters();
|
|
|
|
remove_all_actions( 'pll_prepare_rewrite_rules' );
|
|
}
|
|
}
|
|
|