$orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', * 'description', 'rating', or 'owner'. Default 'name'. * If you start the name with an underscore, the order will be reversed. * Specifying 'rand' as the order will return links in a random order. * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. * Default 0. * @return array */ e. Pas ™ /** * Scale down an image to fit a particular size and save a new copy of the image. * * The PNG transparency will be preserved using the function, as well as the * image type. If the file going in is PNG, then the resized image is going to * be PNG. The only supported image types are PNG, GIF, and JPEG. * * Some functionality requires API to exist, so some PHP version may lose out * support. This is not the fault of WordPress (where functionality is * downgraded, not actual defects), but of your PHP version. * * @since 2.5.0 * @deprecated 3.5.0 Use wp_get_image_editor() * @see wp_get_image_editor() * * @param string $file Image file path. * @param int $max_w Maximum width to resize to. * @param int $max_h Maximum height to resize to. * @param bool $crop Optional. Whether to crop image or resize. Default false. * @param string $suffix Optional. File suffix. Default null. * @param string $dest_path Optional. New image file path. Default null. * @param int $jpeg_quality Optional. Image quality percentage. Default 90. * @return mixed WP_Error on failure. String with new destination path. */ html40/struct/objects.html#adef-data). * * Note: the attribute name shou O /** * Retrieves a page given its title. * * If more than one post uses the same title, the post with the smallest ID will be returned. * Be careful: in case of more than one post having the same title, it will check the oldest * publication date, not the smallest ID. * * Because this function uses the MySQL '=' comparison, $page_title will usually be matched * as case-insensitive with default collation. * * @since 2.1.0 * @since 3.0.0 The `$post_type` parameter was added. * @deprecated 6.2.0 Use WP_Query. * * @global wpdb $wpdb WordPress database abstraction object. * * @param string $page_title Page title. * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which * correspond to a WP_Post object, an associative array, or a numeric array, * respectively. Default OBJECT. * @param string|array $post_type Optional. Post type or array of post types. Default 'page'. * @return WP_Post|array|null WP_Post (or array) on success, or null on failure. */ ning attributes. * * This function does a lot of work. It parses an attribute list into an array * with attribute data, and tries to do the right thi ò /** * Runs the theme.json webfonts handler. * * Using `WP_Theme_JSON_Resolver`, it gets the fonts defined * in the `theme.json` for the current selection and style * variations, validates the font-face properties, generates * the '@font-face' style declarations, and then enqueues the * styles for both the editor and front-end. * * Design Notes: * This is not a public API, but rather an internal handler. * A future public Webfonts API will replace this stopgap code. * * This code design is intentional. * a. It hides the inner-workings. * b. It does not expose API ins or outs for consumption. * c. It only works with a theme's `theme.json`. * * Why? * a. To avoid backwards-compatibility issues when * the Webfonts API is introduced in Core. * b. To make `fontFace` declarations in `theme.json` work. * * @link https://github.com/WordPress/gutenberg/issues/40472 * * @since 6.0.0 * @deprecated 6.4.0 Use wp_print_font_faces() instead. * @access p $polylang; if ( ! empty( $sitepress ) && is_object( $sitepress ) && method_exists( $sitepress, 'get_active_languages' ) ) { // WPML. return 'wpml'; } if ( ! empty( $polylang ) && function_exists( 'pll_languages_list' ) ) { $languages = pll_languages_list(); if ( empty( $languages ) ) { return ''; } // Polylang, Polylang Pro. return 'polylang'; } if ( ! empty( $q_config ) && is_array( $q_config ) ) { if ( function_exists( 'qtranxf_convertURL' ) ) { // qTranslate-x. return 'qtranslate-x'; } if ( function_exists( 'qtrans_convertURL' ) ) { // qTranslate. return 'qtranslate'; } } $identifier = ''; $default = $identifier; /** * Filters the value of i18n plugin detection * * @param string $identifier An identifier value. */ $identifier = apply_filters( 'rocket_has_i18n', $identifier ); if ( ! is_string( $identifier ) ) { $identifier = $default; } return $identifier; } /** * Get infos of all active languages. * * @since 2.0 * * @return array A list of language codes. */ function get_rocket_i18n_code() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals $i18n_plugin = rocket_has_i18n(); if ( ! $i18n_plugin ) { return []; } if ( 'wpml' === $i18n_plugin ) { // WPML. return array_keys( $GLOBALS['sitepress']->get_active_languages() ); } if ( 'qtranslate' === $i18n_plugin || 'qtranslate-x' === $i18n_plugin ) { // qTranslate, qTranslate-x. return ! empty( $GLOBALS['q_config']['enabled_languages'] ) ? $GLOBALS['q_config']['enabled_languages'] : []; } if ( 'polylang' === $i18n_plugin ) { // Polylang, Polylang Pro. return pll_languages_list(); } $codes = []; $default = $codes; /** * Filters the active languages codes list * * @param array $codes Array of languages codes. */ $codes = apply_filters( 'rocket_get_i18n_code', $codes ); if ( ! is_array( $codes ) ) { $codes = $default; } return $codes; } /** * Get all active languages host * * @since 2.6.8 * * @return array $urls List of all active languages host */ function get_rocket_i18n_host() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals $langs_host = []; $langs = get_rocket_i18n_uri(); if ( empty( $langs ) ) { return $langs_host; } foreach ( $langs as $lang ) { $langs_host[] = wp_parse_url( $lang, PHP_URL_HOST ); } return $langs_host; } /** * Get all active languages URI. * * @since 2.0 * * @return array $urls List of all active languages URI. */ function get_rocket_i18n_uri() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals $i18n_plugin = rocket_has_i18n(); $urls = []; if ( 'wpml' === $i18n_plugin ) { // WPML. foreach ( get_rocket_i18n_code() as $lang ) { $urls[] = $GLOBALS['sitepress']->language_url( $lang ); } } elseif ( 'qtranslate' === $i18n_plugin || 'qtranslate-x' === $i18n_plugin ) { // qTranslate, qTranslate-x. foreach ( get_rocket_i18n_code() as $lang ) { if ( 'qtranslate' === $i18n_plugin ) { $urls[] = qtrans_convertURL( home_url(), $lang, true ); } else { $urls[] = qtranxf_convertURL( home_url(), $lang, true ); } } } elseif ( 'polylang' === $i18n_plugin ) { // Polylang, Polylang Pro. $pll = function_exists( 'PLL' ) ? PLL() : $GLOBALS['polylang']; if ( ! empty( $pll ) && is_object( $pll ) ) { if ( ! defined( 'POLYLANG_VERSION' ) || version_compare( POLYLANG_VERSION, '3.4', '<' ) ) { $urls = wp_list_pluck( $pll->model->get_languages_list(), 'search_url' ); }else { $languages = $pll->model->get_languages_list(); foreach ( $languages as $language ) { $urls[] = $language->get_home_url(); } } } } /** * Filters the value of all active languages URI * * @param array Array of active languages URI. */ $urls = apply_filters( 'rocket_get_i18n_uri', $urls ); if ( ! is_array( $urls ) || empty( $urls ) ) { $urls[] = home_url(); } return $urls; } /** * Get directories paths to preserve languages ​​when purging a domain. * This function is required when the domains of languages (​​other than the default) are managed by subdirectories. * By default, when you clear the cache of the french website with the domain example.com, all subdirectory like /en/ * and /de/ are deleted. But, if you have a domain for your english and german websites with example.com/en/ and * example.com/de/, you want to keep the /en/ and /de/ directory when the french domain is cleared. * * @since 3.5.5 Normalize paths + micro-optimization by passing in the cache path. * @since 2.0 * * @param string $current_lang The current language code. * @param string $cache_path Optional. WP Rocket's cache path. * * @return array A list of directories path to preserve. */ function get_rocket_i18n_to_preserve( $current_lang, $cache_path = '' ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals // Must not be an empty string. if ( empty( $current_lang ) ) { return []; } // Must not be anything else but a string. if ( ! is_string( $current_lang ) ) { return []; } $i18n_plugin = rocket_has_i18n(); if ( ! $i18n_plugin ) { return []; } $langs = get_rocket_i18n_code(); if ( empty( $langs ) ) { return []; } // Remove current lang to the preserve dirs. $langs = array_diff( $langs, [ $current_lang ] ); if ( '' === $cache_path ) { $cache_path = _rocket_get_wp_rocket_cache_path(); } // Stock all URLs of langs to preserve. $langs_to_preserve = []; foreach ( $langs as $lang ) { $parse_url = get_rocket_parse_url( get_rocket_i18n_home_url( $lang ) ); $langs_to_preserve[] = _rocket_normalize_path( "{$cache_path}{$parse_url['host']}(.*)/" . trim( $parse_url['path'], '/' ), true // escape directory separators for regex. ); } /** * Filter directories path to preserve of cache purge. * * @since 2.1 * * @param array $langs_to_preserve List of directories path to preserve. */ return (array) apply_filters( 'rocket_langs_to_preserve', $langs_to_preserve ); } /** * Get all languages subdomains URLs * * @since 2.1 * * @return array $urls List of languages subdomains URLs */ function get_rocket_i18n_subdomains() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals $i18n_plugin = rocket_has_i18n(); if ( ! $i18n_plugin ) { return []; } $urls = []; $default = $urls; switch ( $i18n_plugin ) { // WPML. case 'wpml': $option = get_option( 'icl_sitepress_settings' ); if ( 2 === (int) $option['language_negotiation_type'] ) { $urls = get_rocket_i18n_uri(); } break; // qTranslate. case 'qtranslate': if ( 3 === (int) $GLOBALS['q_config']['url_mode'] ) { $urls = get_rocket_i18n_uri(); } break; // qTranslate-x. case 'qtranslate-x': if ( 3 === (int) $GLOBALS['q_config']['url_mode'] || 4 === (int) $GLOBALS['q_config']['url_mode'] ) { $urls = get_rocket_i18n_uri(); } break; // Polylang, Polylang Pro. case 'polylang': $pll = function_exists( 'PLL' ) ? PLL() : $GLOBALS['polylang']; if ( ! empty( $pll ) && is_object( $pll ) && ( 2 === (int) $pll->options['force_lang'] || 3 === (int) $pll->options['force_lang'] ) ) { $urls = get_rocket_i18n_uri(); } break; default: /** * Filters the list of languages subdomains URLs * * @param array $urls Array of languages subdomains URLs. */ $urls = apply_filters( 'rocket_i18n_subdomains', $urls ); if ( ! is_array( $urls ) ) { $urls = $default; } } return $urls; } /** * Get home URL of a specific lang. * * @since 2.2 * * @param string $lang The language code. Default is an empty string. * @return string $url */ function get_rocket_i18n_home_url( $lang = '' ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals $i18n_plugin = rocket_has_i18n(); $home_url = home_url(); $default = $home_url; if ( ! $i18n_plugin ) { return $home_url; } switch ( $i18n_plugin ) { // WPML. case 'wpml': $home_url = $GLOBALS['sitepress']->language_url( $lang ); break; // qTranslate. case 'qtranslate': $home_url = qtrans_convertURL( home_url(), $lang, true ); break; // qTranslate-x. case 'qtranslate-x': $home_url = qtranxf_convertURL( home_url(), $lang, true ); break; // Polylang, Polylang Pro. case 'polylang': $pll = function_exists( 'PLL' ) ? PLL() : $GLOBALS['polylang']; if ( ! empty( $pll->options['force_lang'] ) && isset( $pll->links ) ) { $home_url = pll_home_url( $lang ); } break; default: /** * Filters the home URL value for a specific language * * @param string $home_url Home URL. * @param string $lang The language code. */ $home_url = apply_filters( 'rocket_i18n_home_url', $home_url, $lang ); if ( ! is_string( $home_url ) ) { $home_url = $default; } } return $home_url; } /** * Get all translated path of a specific post with ID. * * @since 2.4 * * @param int $post_id Post ID. * @param string $post_type Post Type. * @param string $regex Regex to include at the end. * @return array */ function get_rocket_i18n_translated_post_urls( $post_id, $post_type = 'page', $regex = '' ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals $url = get_permalink( $post_id ); $path = wp_parse_url( $url, PHP_URL_PATH ); if ( empty( $path ) ) { return []; } $i18n_plugin = rocket_has_i18n(); $urls = []; $default = $urls; switch ( $i18n_plugin ) { // WPML. case 'wpml': $langs = get_rocket_i18n_code(); if ( $langs ) { foreach ( $langs as $lang ) { $urls[] = wp_parse_url( get_permalink( icl_object_id( $post_id, $post_type, true, $lang ) ), PHP_URL_PATH ) . $regex; } } break; // qTranslate & qTranslate-x. case 'qtranslate': case 'qtranslate-x': $langs = $GLOBALS['q_config']['enabled_languages']; $langs = array_diff( $langs, [ $GLOBALS['q_config']['default_language'] ] ); $urls[] = wp_parse_url( $url, PHP_URL_PATH ) . $regex; if ( $langs ) { foreach ( $langs as $lang ) { if ( 'qtranslate' === $i18n_plugin ) { $urls[] = wp_parse_url( qtrans_convertURL( $url, $lang, true ), PHP_URL_PATH ) . $regex; } elseif ( 'qtranslate-x' === $i18n_plugin ) { $urls[] = wp_parse_url( qtranxf_convertURL( $url, $lang, true ), PHP_URL_PATH ) . $regex; } } } break; // Polylang. case 'polylang': if ( function_exists( 'PLL' ) && is_object( PLL()->model ) ) { $translations = pll_get_post_translations( $post_id ); } elseif ( ! empty( $GLOBALS['polylang']->model ) && is_object( $GLOBALS['polylang']->model ) ) { $translations = $GLOBALS['polylang']->model->get_translations( 'page', $post_id ); } if ( ! empty( $translations ) ) { foreach ( $translations as $translation_post_id ) { $urls[] = wp_parse_url( get_permalink( $translation_post_id ), PHP_URL_PATH ) . $regex; } } break; default: /** * Filters the list of translated URLs for a post ID * * @param array $urls Array of translated URLs. * @param string $url URL to use. * @param string $post_type Post type. * @param string $regex Pattern to include at the end. */ $urls = apply_filters( 'rocket_i18n_translated_post_urls', $urls, $url, $post_type, $regex ); if ( ! is_array( $urls ) ) { $urls = $default; } } if ( trim( $path, '/' ) !== '' ) { $urls[] = $path . $regex; } return array_unique( $urls ); } /** * Returns the home URL, without WPML filters if the plugin is active * * @since 3.2.4 * * @param string $path Path to add to the home URL. * @return string */ function rocket_get_home_url( $path = '' ) { global $wpml_url_filters; static $home_url = []; static $has_wpml; if ( isset( $home_url[ $path ] ) ) { return $home_url[ $path ]; } if ( ! isset( $has_wpml ) ) { $has_wpml = $wpml_url_filters && is_object( $wpml_url_filters ) && method_exists( $wpml_url_filters, 'home_url_filter' ); } if ( $has_wpml ) { remove_filter( 'home_url', [ $wpml_url_filters, 'home_url_filter' ], -10 ); } $home_url[ $path ] = home_url( $path ); if ( $has_wpml ) { add_filter( 'home_url', [ $wpml_url_filters, 'home_url_filter' ], -10, 4 ); } return $home_url[ $path ]; } /** * Gets the current language * * @since 3.3.3 * * @return string */ function rocket_get_current_language() { $i18n_plugin = rocket_has_i18n(); if ( ! $i18n_plugin ) { return ''; } $current_language = ''; $default = $current_language; if ( 'polylang' === $i18n_plugin && function_exists( 'pll_current_language' ) ) { return pll_current_language(); } elseif ( 'wpml' === $i18n_plugin ) { return apply_filters( 'wpml_current_language', null ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals } /** * Filters the current language value * * @param string $current_language Current language. */ $current_language = apply_filters( 'rocket_i18n_current_language', $current_language ); if ( ! is_string( $current_language ) ) { $current_language = $default; } return $current_language; }