getWooCommercePages();
if ( in_array( $postId, $specialWooCommercePages, true ) ) {
return array_search( $postId, $specialWooCommercePages, true );
}
return '';
}
/**
* Returns the WooCommerce pages.
*
* @since 4.7.3
*
* @return array An associative list of special WooCommerce pages.
*/
public function getWooCommercePages() {
if ( ! $this->isWooCommerceActive() ) {
$wooCommercePages = [];
return $wooCommercePages;
}
$wooCommercePages = [
'cart' => (int) get_option( 'woocommerce_cart_page_id' ),
'checkout' => (int) get_option( 'woocommerce_checkout_page_id' ),
'myAccount' => (int) get_option( 'woocommerce_myaccount_page_id' ),
'terms' => (int) get_option( 'woocommerce_terms_page_id' ),
];
return $wooCommercePages;
}
/**
* Checks whether the current page is a special WooCommerce page we shouldn't show our schema settings for.
*
* @since 4.1.6
*
* @param int $postId The post ID.
* @return bool Whether the current page is a disallowed WooCommerce page.
*/
public function isWooCommercePageWithoutSchema( $postId = 0 ) {
$page = $this->isWooCommercePage( $postId );
if ( ! $page ) {
return false;
}
$disallowedPages = [ 'cart', 'checkout', 'myAccount' ];
return in_array( $page, $disallowedPages, true );
}
/**
* Checks whether the queried object is the WooCommerce shop page.
*
* @since 4.0.0
*
* @param int $id The post ID to check against (optional).
* @return bool Whether the current page is the WooCommerce shop page.
*/
public function isWooCommerceShopPage( $id = 0 ) {
if ( ! $this->isWooCommerceActive() ) {
return false;
}
// If the id is empty, we want to check against the queried object.
if (
empty( $id ) &&
function_exists( 'is_shop' ) &&
! is_admin() &&
! aioseo()->helpers->isAjaxCronRestRequest()
) {
return is_shop();
}
// Prevent non-numeric id.
$id = is_numeric( $id ) ? (int) $id : 0;
// 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'] ) )
: $id;
// phpcs:enable
return $id && wc_get_page_id( 'shop' ) === $id;
}
/**
* Checks whether the queried object is the WooCommerce cart page.
*
* @since 4.1.3
*
* @param int $id The post ID to check against (optional).
* @return bool Whether the current page is the WooCommerce cart page.
*/
public function isWooCommerceCartPage( $id = 0 ) {
if ( ! $this->isWooCommerceActive() ) {
return false;
}
if ( ! is_admin() && ! aioseo()->helpers->isAjaxCronRestRequest() && function_exists( 'is_cart' ) ) {
return is_cart();
}
// 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( 'cart' ) === $id;
}
/**
* Checks whether the queried object is the WooCommerce checkout page.
*
* @since 4.1.3
*
* @param int $id The post ID to check against (optional).
* @return bool Whether the current page is the WooCommerce checkout page.
*/
public function 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 ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
}
/**
* 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( '/' ) ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
// 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',
];
$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 = "
"; // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage
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 ) ? "
" : ''; // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage
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;
}
/**
* Retrieves the ACF Flexible Content field value for a given post.
*
* @since 4.7.9
*
* @param string $name The name of the field.
* @param int|object $post The post ID or object.
* @return string The field value.
*/
public function getAcfFlexibleContentField( $name, $post ) {
$output = '';
if ( ! function_exists( 'acf_get_raw_field' ) || ! function_exists( 'acf_get_field' ) ) {
return $output;
}
$parentTrace = [];
$field = acf_get_raw_field( $name ) ?? [];
while ( ! empty( $field['parent'] ) && ! empty( $field['parent_layout'] ) ) {
$parentField = acf_get_field( $field['parent'] );
$parentTrace[] = $parentField['name'] ?? '';
$field = $parentField;
}
$parentTrace = array_filter( $parentTrace );
if ( empty( $parentTrace ) ) {
return $output;
}
$parentTrace = array_reverse( $parentTrace );
$parentName = array_shift( $parentTrace );
$highestParentField = get_field( $parentName, $post );
for ( $i = 0; $i <= count( $parentTrace ); $i++ ) {
$values = array_filter( array_column( $highestParentField, $name ), 'is_scalar' );
if ( $values ) {
return implode( ' ', $values );
}
$highestParentField = $highestParentField[0] ?? '';
if (
! is_array( $highestParentField ) ||
! isset( $parentTrace[ $i ] )
) {
break;
}
$highestParentField = $highestParentField[ $parentTrace[ $i ] ];
}
return $output;
}
/**
* 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', [] ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
$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'] ), // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
'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, WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound
global $et_pb_rendering_column_content;
$originalValue = $et_pb_rendering_column_content;
$et_pb_rendering_column_content = $flag;
// phpcs:enable Squiz.NamingConventions.ValidVariableName, WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound
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'] ) ) );
}
/**
* Checks whether the taxonomy is a WooCommerce product attribute.
*
* @since 4.7.8
*
* @param mixed $taxonomy The taxonomy.
* @return bool Whether the taxonomy is a WooCommerce product attribute.
*/
public function isWooCommerceProductAttribute( $taxonomy ) {
$name = is_object( $taxonomy )
? $taxonomy->name
: (
is_array( $taxonomy )
? $taxonomy['name']
: $taxonomy
);
return ! empty( $name ) && 'pa_' === substr( $name, 0, 3 );
}
/**
* Returns whether a plugin is active or not using abstraction.
*
* @since 4.8.1
*
* @param string $slug The plugin slug.
* @return bool Whether the plugin is active.
*/
public function isPluginActive( $slug ) {
$mapped = [
'buddypress' => 'buddypress/bp-loader.php',
'bbpress' => 'bbpress/bbpress.php',
'weglot' => 'weglot/weglot.php'
];
static $output = [];
if ( isset( $output[ $slug ] ) ) {
return $output[ $slug ];
}
$mapped[ $slug ] = $mapped[ $slug ] ?? $slug;
$output[ $slug ] = function_exists( 'is_plugin_active' ) && is_plugin_active( $mapped[ $slug ] );
return $output[ $slug ];
}
/**
* Call the callback given by the first parameter.
*
* @since 4.9.2
*
* @param callable $callback The function to be called.
* @param mixed ...$args Zero or more parameters to be passed to the function
* @return mixed|null The function result or null if the function is not callable.
*/
public function callFunc( $callback, ...$args ) {
if ( is_callable( $callback ) ) {
return call_user_func( $callback, ...$args );
}
return null;
}
}