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.
 
 
 
 
 

107 lines
3.4 KiB

<?php
/**
* @package Polylang
*/
/**
* A class to manage manage the language cookie
*
* @since 2.9
*/
class PLL_Cookie {
/**
* Parses the cookie parameters.
*
* @since 2.9
*
* @param array $args {@see PLL_Cookie::set()}
* @return array
*/
protected static function parse_args( $args ) {
/**
* Filters the Polylang cookie duration.
*
* If a cookie duration of 0 is specified, a session cookie will be set.
* If a negative cookie duration is specified, the cookie is removed.
* /!\ This filter may be fired *before* the theme is loaded.
*
* @since 1.8
*
* @param int $duration Cookie duration in seconds.
*/
$expiration = (int) apply_filters( 'pll_cookie_expiration', YEAR_IN_SECONDS );
$defaults = array(
'expires' => 0 !== $expiration ? time() + $expiration : 0,
'path' => COOKIEPATH,
'domain' => COOKIE_DOMAIN, // Cookie domain must be set to false for localhost (default value for `COOKIE_DOMAIN`) thanks to Stephen Harris.
'secure' => is_ssl(),
'httponly' => false,
'samesite' => 'Lax',
);
$args = wp_parse_args( $args, $defaults );
/**
* Filters the Polylang cookie arguments.
* /!\ This filter may be fired *before* the theme is loaded.
*
* @since 3.6
*
* @param array $args {
* Optional. Array of arguments for setting the cookie.
*
* @type int $expires Cookie duration.
* If a cookie duration of 0 is specified, a session cookie will be set.
* If a negative cookie duration is specified, the cookie is removed.
* @type string $path Cookie path.
* @type string $domain Cookie domain. Must be set to false for localhost (default value for `COOKIE_DOMAIN`).
* @type bool $secure Should the cookie be sent only over https?
* @type bool $httponly Should the cookie be accessed only over http protocol?.
* @type string $samesite Either 'Strict', 'Lax' or 'None'.
* }
*/
return (array) apply_filters( 'pll_cookie_args', $args );
}
/**
* Sets the cookie.
*
* @since 2.9
*
* @param string $lang Language cookie value.
* @param array $args {
* Optional. Array of arguments for setting the cookie.
*
* @type string $path Cookie path, defaults to COOKIEPATH.
* @type string $domain Cookie domain, defaults to COOKIE_DOMAIN
* @type bool $secure Should the cookie be sent only over https?
* @type bool $httponly Should the cookie accessed only over http protocol? Defaults to false.
* @type string $samesite Either 'Strict', 'Lax' or 'None', defaults to 'Lax'.
* }
* @return void
*/
public static function set( $lang, $args = array() ) {
$args = self::parse_args( $args );
if ( ! headers_sent() && PLL_COOKIE !== false && self::get() !== $lang ) {
if ( version_compare( PHP_VERSION, '7.3', '<' ) ) {
$args['path'] .= '; SameSite=' . $args['samesite']; // Hack to set SameSite value in PHP < 7.3. Doesn't work with newer versions.
setcookie( PLL_COOKIE, $lang, $args['expires'], $args['path'], $args['domain'], $args['secure'], $args['httponly'] );
} else {
setcookie( PLL_COOKIE, $lang, $args );
}
}
}
/**
* Returns the language cookie value.
*
* @since 2.9
*
* @return string
*/
public static function get() {
return isset( $_COOKIE[ PLL_COOKIE ] ) ? sanitize_key( $_COOKIE[ PLL_COOKIE ] ) : '';
}
}