isWooCommerceCheckoutPage( $id = 0 ) {
if ( ! $this->isWooCommerceActive() ) {
return false;
}
if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRestRequest() && function_exists( 'is_checkout' ) ) {
return is_checkout();
}
// phpcs:disable HM.Security.ValidatedSanitizedInput, HM.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Recommended
$id = ! $id && ! empty( $_GET['post'] )
? (int) sanitize_text_field( wp_unslash( $_GET['post'] ) )
: (int) $id;
// phpcs:enable
return $id && wc_get_page_id( 'checkout' ) === $id;
}
/**
* Checks whether the queried object is the WooCommerce account page.
*
* @since 4.1.3
*
* @param int $id The post ID to check against (optional).
* @return bool Whether the current page is the WooCommerce account page.
*/
public function isWooCommerceAccountPage( $id = 0 ) {
if ( ! $this->isWooCommerceActive() ) {
return false;
}
if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRestRequest() && function_exists( 'is_account_page' ) ) {
return is_account_page();
}
// phpcs:disable HM.Security.ValidatedSanitizedInput, HM.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Recommended
$id = ! $id && ! empty( $_GET['post'] )
? (int) sanitize_text_field( wp_unslash( $_GET['post'] ) )
: (int) $id;
// phpcs:enable
return $id && wc_get_page_id( 'myaccount' ) === $id;
}
/**
* Checks whether the queried object is a WooCommerce product page.
*
* @since 4.5.5
*
* @return bool Whether the current page is a WooCommerce product page.
*/
public function isWooCommerceProductPage() {
if (
! $this->isWooCommerceActive() ||
! function_exists( 'is_product' )
) {
return false;
}
return is_product();
}
/**
* Checks whether the queried object is a WooCommerce taxonomy page.
*
* @since 4.5.5
*
* @return bool Whether the current page is a WooCommerce taxonomy page.
*/
public function isWooCommerceTaxonomyPage() {
if (
! $this->isWooCommerceActive() ||
! function_exists( 'is_product_taxonomy' )
) {
return false;
}
return is_product_taxonomy();
}
/**
* Internationalize.
*
* @since 4.0.0
*
* @param $in
* @return mixed|void
*/
public function internationalize( $in ) {
if ( function_exists( 'langswitch_filter_langs_with_message' ) ) {
$in = langswitch_filter_langs_with_message( $in );
}
if ( function_exists( 'polyglot_filter' ) ) {
$in = polyglot_filter( $in );
}
if ( function_exists( 'qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
$in = qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
} elseif ( function_exists( 'ppqtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
$in = ppqtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
} elseif ( function_exists( 'qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage' ) ) {
$in = qtranxf_useCurrentLanguageIfNotFoundUseDefaultLanguage( $in );
}
return apply_filters( 'localization', $in );
}
/**
* Checks if WPML is active.
*
* @since 4.0.0
*
* @return bool True if it is, false if not.
*/
public function isWpmlActive() {
return class_exists( 'SitePress' );
}
/**
* Checks if TranslatePress is active.
*
* @since 4.7.3
*
* @return bool True if it is, false if not.
*/
public function isTranslatePressActive() {
return class_exists( 'TRP_Translate_Press' );
}
/**
* Localizes a given URL.
*
* This is required for compatibility with WPML.
*
* @since 4.0.0
*
* @param string $path The relative path of the URL.
* @return string $url The filtered URL.
*/
public function localizedUrl( $path ) {
$url = apply_filters( 'wpml_home_url', home_url( '/' ) );
// Remove URL parameters.
preg_match_all( '/\?[\s\S]+/', (string) $url, $matches );
// Get the base URL.
$url = preg_replace( '/\?[\s\S]+/', '', (string) $url );
$url = trailingslashit( $url );
$url .= preg_replace( '/\//', '', (string) $path, 1 );
// Readd URL parameters.
if ( $matches && $matches[0] ) {
$url .= $matches[0][0];
}
return $url;
}
/**
* Checks whether BuddyPress is active.
*
* @since 4.0.0
*
* @return boolean
*/
public function isBuddyPressActive() {
return class_exists( 'BuddyPress' );
}
/**
* Checks whether the queried object is a buddy press user page.
*
* @since 4.0.0
*
* @return boolean
*/
public function isBuddyPressUser() {
return $this->isBuddyPressActive() && function_exists( 'bp_is_user' ) && bp_is_user();
}
/**
* Returns if the page is a BuddyPress page (Activity, Members, Groups).
*
* @since 4.0.0
*
* @param int $postId The post ID.
* @return bool If the page is a BuddyPress page or not.
*/
public function isBuddyPressPage( $postId = 0 ) {
$bpPageIds = $this->getBuddyPressPageIds();
return in_array( $postId, $bpPageIds, true );
}
/**
* Returns the BuddyPress pages.
*
* @since 4.7.3
*
* @return array A list of BuddyPress page IDs.
*/
public function getBuddyPressPageIds() {
if ( ! $this->isBuddyPressActive() ) {
return [];
}
static $bpPageIds = null;
if ( null === $bpPageIds ) {
$bpPageIds = (array) get_option( 'bp-pages' );
$bpPageIds = array_map( 'intval', $bpPageIds );
}
return $bpPageIds;
}
/**
* Returns ACF fields as an array of meta keys and values.
*
* @since 4.0.6
*
* @param \WP_Post|int $post The post.
* @param array $types A whitelist of ACF field types.
* @return array An array of meta keys and values.
*/
public function getAcfContent( $post = null, $types = [] ) {
$post = ( $post && is_object( $post ) ) ? $post : $this->getPost( $post );
if ( ! class_exists( 'ACF' ) || ! function_exists( 'get_field_objects' ) ) {
return [];
}
if ( defined( 'ACF_VERSION' ) && version_compare( ACF_VERSION, '5.7.0', '<' ) ) {
return [];
}
// Set defaults.
$allowedTypes = [
'text',
'textarea',
'email',
'url',
'wysiwyg',
'image',
'gallery',
'link',
// 'taxonomy',
];
$types = wp_parse_args( $types, $allowedTypes );
$fieldObjects = get_field_objects( $post->ID );
if ( empty( $fieldObjects ) ) {
return [];
}
// Filter out any fields that are not in our allowed types.
$fields = array_filter( $fieldObjects, function( $object ) use ( $types ) {
return ! empty( $object['value'] ) && in_array( $object['type'], $types, true );
});
// Create an array with the field names and values with added HTML markup.
$acfFields = [];
foreach ( $fields as $field ) {
switch ( $field['type'] ) {
case 'url':
$value = make_clickable( $field['value'] ?? '' );
break;
case 'image':
// Image format options are array, URL (string), id (int).
$imageUrl = is_array( $field['value'] ) ? $field['value']['url'] : $field['value'];
$imageUrl = is_numeric( $imageUrl ) ? wp_get_attachment_image_url( $imageUrl ) : $imageUrl;
$value = "";
break;
case 'gallery':
$imageUrl = $field['value'];
// The value of a gallery field should always be an array.
if ( is_array( $imageUrl ) ) {
$imageUrl = current( $imageUrl );
}
// Image array format.
if ( is_array( $imageUrl ) && ! empty( $imageUrl['url'] ) ) {
$imageUrl = $imageUrl['url'];
}
// Image ID format.
$imageUrl = is_numeric( $imageUrl ) ? wp_get_attachment_image_url( $imageUrl ) : $imageUrl;
$value = ! empty( $imageUrl ) ? "" : '';
break;
case 'link':
$value = make_clickable( $field['value']['url'] ?? $field['value'] ?? '' );
break;
default:
$value = $field['value'];
break;
}
if ( $value ) {
$acfFields[ $field['name'] ] = $value;
}
}
return $acfFields;
}
/**
* Checks whether the Smash Balloon Custom Facebook Feed plugin is active.
*
* @since 4.2.0
*
* @return bool Whether the SB CFF plugin is active.
*/
public function isSbCustomFacebookFeedActive() {
static $isActive = null;
if ( null !== $isActive ) {
return $isActive;
}
$isActive = defined( 'CFFVER' ) || is_plugin_active( 'custom-facebook-feed/custom-facebook-feed.php' );
return $isActive;
}
/**
* Returns the access token for Facebook from Smash Balloon if there is one.
*
* @since 4.2.0
*
* @return string|false The access token or false if there is none.
*/
public function getSbAccessToken() {
static $accessToken = null;
if ( null !== $accessToken ) {
return $accessToken;
}
if ( ! $this->isSbCustomFacebookFeedActive() ) {
$accessToken = false;
return $accessToken;
}
$oembedTokenData = get_option( 'cff_oembed_token', [] );
if ( ! $oembedTokenData || empty( $oembedTokenData['access_token'] ) ) {
$accessToken = false;
return $accessToken;
}
$sbFacebookDataEncryptionInstance = new \CustomFacebookFeed\SB_Facebook_Data_Encryption();
$accessToken = $sbFacebookDataEncryptionInstance->maybe_decrypt( $oembedTokenData['access_token'] );
return $accessToken;
}
/**
* Returns the homepage URL for a language code.
*
* @since 4.2.1
*
* @param string|int $identifier The language code or the post id to return the url.
* @return string The home URL.
*/
public function wpmlHomeUrl( $identifier ) {
foreach ( $this->wpmlHomePages() as $langCode => $wpmlHomePage ) {
if (
( is_string( $identifier ) && $langCode === $identifier ) ||
( is_numeric( $identifier ) && $wpmlHomePage['id'] === $identifier )
) {
return $wpmlHomePage['url'];
}
}
return '';
}
/**
* Returns the homepage IDs.
*
* @since 4.2.1
*
* @return array An array of home page ids.
*/
public function wpmlHomePages() {
global $sitepress;
static $homePages = [];
if ( ! $this->isWpmlActive() || empty( $sitepress ) || ! method_exists( $sitepress, 'language_url' ) ) {
return $homePages;
}
if ( empty( $homePages ) ) {
$languages = apply_filters( 'wpml_active_languages', [] );
$homePageId = (int) get_option( 'page_on_front' );
foreach ( $languages as $language ) {
$homePages[ $language['code'] ] = [
'id' => apply_filters( 'wpml_object_id', $homePageId, 'page', false, $language['code'] ),
'url' => $sitepress->language_url( $language['code'] )
];
}
}
return $homePages;
}
/**
* Returns if the post id os a WPML home page.
*
* @since 4.2.1
*
* @param int $postId The post ID.
* @return bool Is the post id a home page.
*/
public function wpmlIsHomePage( $postId ) {
foreach ( $this->wpmlHomePages() as $wpmlHomePage ) {
if ( $wpmlHomePage['id'] === $postId ) {
return true;
}
}
return false;
}
/**
* Returns the WPML url format.
*
* @since 4.2.8
*
* @return string The format.
*/
public function getWpmlUrlFormat() {
global $sitepress;
if (
! $this->isWpmlActive() ||
empty( $sitepress ) ||
! method_exists( $sitepress, 'get_setting' )
) {
return '';
}
switch ( $sitepress->get_setting( 'language_negotiation_type' ) ) {
case WPML_LANGUAGE_NEGOTIATION_TYPE_DIRECTORY:
case 1:
return 'directory';
case WPML_LANGUAGE_NEGOTIATION_TYPE_DOMAIN:
case 2:
return 'domain';
case WPML_LANGUAGE_NEGOTIATION_TYPE_PARAMETER:
case 3:
return 'parameter';
default:
return '';
}
}
/**
* Returns the TranslatePress slugs code and slug.
*
* @since 4.7.3
*
* @return array The slugs.
*/
public function getTranslatePressUrlSlugs() {
if ( ! $this->isTranslatePressActive() ) {
return [];
}
$settings = maybe_unserialize( get_option( 'trp_settings', [] ) );
return isset( $settings['url-slugs'] ) ? $settings['url-slugs'] : [];
}
/**
* Checks whether the WooCommerce Follow Up Emails plugin is active.
*
* @since 4.2.2
*
* @return bool Whether the plugin is active.
*/
public function isWooCommerceFollowupEmailsActive() {
$isActive = defined( 'FUE_VERSION' ) || is_plugin_active( 'woocommerce-follow-up-emails/woocommerce-follow-up-emails.php' );
return $isActive;
}
/**
* Checks if the current page is an AMP page.
* This function is only effective if called after the `wp` action.
*
* @since 4.2.3
*
* @param string $pluginName The name of the AMP plugin to check for (optional).
* @return bool Whether the current page is an AMP page.
*/
public function isAmpPage( $pluginName = '' ) {
// Official AMP plugin.
if ( 'amp' === $pluginName ) {
// If we're checking for the AMP page plugin specifically, return early if it's not active.
// Otherwise, we'll return true if AMP for WP is enabled because the helper method doesn't distinguish between the two.
if ( ! defined( 'AMP__VERSION' ) ) {
return false;
}
$options = get_option( 'amp-options' );
if ( ! empty( $options['theme_support'] ) && 'standard' === strtolower( $options['theme_support'] ) ) {
return true;
}
}
return $this->isAmpPageHelper();
}
/**
* Helper function for {@see isAmpPage()}.
* Checks if the current page is an AMP page.
*
* @since 4.2.4
*
* @return bool Whether the current page is an AMP page.
*/
private function isAmpPageHelper() {
// First check for the existence of any AMP plugin functions. Bail early if none are found, and prevent false positives.
if (
! function_exists( 'amp_is_request' ) &&
! function_exists( 'is_amp_endpoint' ) &&
! function_exists( 'ampforwp_is_amp_endpoint' ) &&
! function_exists( 'is_amp_wp' )
) {
// If none of the AMP plugin functions are found, return false and allow compatibility with custom implementations.
return apply_filters( 'aioseo_is_amp_page', false );
}
// AMP plugin requires the `wp` action to be called to function properly, otherwise, it will throw warnings.
if ( did_action( 'wp' ) ) {
// Check for the "AMP" plugin.
if ( function_exists( 'amp_is_request' ) ) {
return (bool) amp_is_request();
}
// Check for the "AMP" plugin (`is_amp_endpoint()` is deprecated).
if ( function_exists( 'is_amp_endpoint' ) ) {
return (bool) is_amp_endpoint();
}
// Check for the "AMP for WP – Accelerated Mobile Pages" plugin.
if ( function_exists( 'ampforwp_is_amp_endpoint' ) ) {
return (bool) ampforwp_is_amp_endpoint();
}
// Check for the "AMP WP" plugin.
if ( function_exists( 'is_amp_wp' ) ) {
return (bool) is_amp_wp();
}
}
return false;
}
/**
* If we're in a LearnPress lesson page, return the lesson ID.
*
* @since 4.3.1
*
* @return int|false
*/
public function getLearnPressLesson() {
// phpcs:disable Squiz.NamingConventions.ValidVariableName
global $lp_course_item;
if ( $lp_course_item && method_exists( $lp_course_item, 'get_id' ) ) {
return $lp_course_item->get_id();
}
// phpcs:enable Squiz.NamingConventions.ValidVariableName
return false;
}
/**
* Set a flag to indicate Divi whether it is processing internal content or not.
*
* @since 4.4.3
*
* @param null|bool $flag The flag value.
* @return null|bool The previous flag value to reset it later.
*/
public function setDiviInternalRendering( $flag ) {
if ( ! defined( 'ET_BUILDER_VERSION' ) ) {
return null;
}
// phpcs:disable Squiz.NamingConventions.ValidVariableName
global $et_pb_rendering_column_content;
$originalValue = $et_pb_rendering_column_content;
$et_pb_rendering_column_content = $flag;
// phpcs:enable Squiz.NamingConventions.ValidVariableName
return $originalValue;
}
/**
* Checks whether the current request is being done by a crawler from Yandex.
*
* @since 4.4.0
*
* @return bool Whether the current request is being done by a crawler from Yandex.
*/
public function isYandexUserAgent() {
if ( ! isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
return false;
}
return preg_match( '#.*Yandex.*#', (string) sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) );
}
}