File manager - Edit - /home/premiey/www/wp-includes/images/media/Meta.tar
Back
Description.php 0000666 00000021263 15165655103 0007557 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } use AIOSEO\Plugin\Common\Integrations\BuddyPress as BuddyPressIntegration; /** * Handles the (Open Graph) description. * * @since 4.0.0 */ class Description { /** * Helpers class instance. * * @since 4.2.7 * * @var Helpers */ public $helpers = null; /** * Class constructor. * * @since 4.1.2 */ public function __construct() { $this->helpers = new Helpers( 'description' ); } /** * Returns the homepage description. * * @since 4.0.0 * * @return string The homepage description. */ public function getHomePageDescription() { if ( 'page' === get_option( 'show_on_front' ) ) { $description = $this->getPostDescription( (int) get_option( 'page_on_front' ) ); return $description ? $description : aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'description' ) ); } $description = aioseo()->options->searchAppearance->global->metaDescription; if ( aioseo()->helpers->isWpmlActive() ) { // Allow WPML to translate the title if the homepage is not static. $description = apply_filters( 'wpml_translate_single_string', $description, 'admin_texts_aioseo_options_localized', '[aioseo_options_localized]searchAppearance_global_metaDescription' ); } $description = $this->helpers->prepare( $description ); return $description ? $description : aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'description' ) ); } /** * Returns the description for the current page. * * @since 4.0.0 * * @param \WP_Post $post The post object (optional). * @param boolean $default Whether we want the default value, not the post one. * @return string The page description. */ public function getDescription( $post = null, $default = false ) { if ( BuddyPressIntegration::isComponentPage() ) { return aioseo()->standalone->buddyPress->component->getMeta( 'description' ); } if ( is_home() ) { return $this->getHomePageDescription(); } if ( $post || is_singular() || aioseo()->helpers->isStaticPage() ) { $description = $this->getPostDescription( $post, $default ); if ( $description ) { return $description; } if ( is_attachment() ) { $post = empty( $post ) ? aioseo()->helpers->getPost() : $post; $caption = wp_get_attachment_caption( $post->ID ); return $caption ? $this->helpers->prepare( $caption ) : $this->helpers->prepare( $post->post_content ); } } if ( is_category() || is_tag() || is_tax() ) { $term = $post ? $post : aioseo()->helpers->getTerm(); return $this->getTermDescription( $term, $default ); } if ( is_author() ) { $description = $this->helpers->prepare( aioseo()->options->searchAppearance->archives->author->metaDescription ); if ( $description ) { return $description; } $author = get_queried_object(); return $author ? $this->helpers->prepare( get_the_author_meta( 'description', $author->ID ) ) : ''; } if ( is_date() ) { return $this->helpers->prepare( aioseo()->options->searchAppearance->archives->date->metaDescription ); } if ( is_search() ) { return $this->helpers->prepare( aioseo()->options->searchAppearance->archives->search->metaDescription ); } if ( is_post_type_archive() ) { $postType = get_queried_object(); if ( is_a( $postType, 'WP_Post_Type' ) ) { return $this->helpers->prepare( $this->getArchiveDescription( $postType->name ) ); } } return ''; } /** * Returns the description for a given post. * * @since 4.0.0 * * @param \WP_Post|int $post The post object or ID. * @param boolean $default Whether we want the default value, not the post one. * @return string The post description. */ public function getPostDescription( $post, $default = false ) { $post = $post && is_object( $post ) ? $post : aioseo()->helpers->getPost( $post ); if ( ! is_a( $post, 'WP_Post' ) ) { return ''; } static $posts = []; if ( isset( $posts[ $post->ID ] ) ) { return $posts[ $post->ID ]; } $description = ''; $metaData = aioseo()->meta->metaData->getMetaData( $post ); if ( ! empty( $metaData->description ) && ! $default ) { $description = $this->helpers->prepare( $metaData->description, $post->ID, false ); } if ( $description || ( in_array( 'autogenerateDescriptions', aioseo()->internalOptions->deprecatedOptions, true ) && ! aioseo()->options->deprecated->searchAppearance->advanced->autogenerateDescriptions ) ) { $posts[ $post->ID ] = $description; return $description; } $description = $this->helpers->sanitize( $this->getPostTypeDescription( $post->post_type ), $post->ID, $default ); $generateDescriptions = apply_filters( 'aioseo_generate_descriptions_from_content', true, [ $post ] ); if ( ! $description && ! post_password_required( $post ) ) { $description = $post->post_excerpt; if ( $generateDescriptions && in_array( 'useContentForAutogeneratedDescriptions', aioseo()->internalOptions->deprecatedOptions, true ) && aioseo()->options->deprecated->searchAppearance->advanced->useContentForAutogeneratedDescriptions ) { $description = aioseo()->helpers->getDescriptionFromContent( $post ); } $description = $this->helpers->sanitize( $description, $post->ID, $default ); if ( ! $description && $generateDescriptions && $post->post_content ) { $description = $this->helpers->sanitize( aioseo()->helpers->getDescriptionFromContent( $post ), $post->ID, $default ); } } if ( ! is_paged() ) { if ( in_array( 'descriptionFormat', aioseo()->internalOptions->deprecatedOptions, true ) ) { $descriptionFormat = aioseo()->options->deprecated->searchAppearance->global->descriptionFormat; if ( $descriptionFormat ) { $description = preg_replace( '/#description/', $description, (string) $descriptionFormat ); } } } $posts[ $post->ID ] = $description ? $this->helpers->prepare( $description, $post->ID, $default ) : $this->helpers->prepare( term_description( '' ), $post->ID, $default ); return $posts[ $post->ID ]; } /** * Retrieve the default description for the archive template. * * @since 4.7.6 * * @param string $postType The custom post type. * @return string The description. */ public function getArchiveDescription( $postType ) { static $archiveDescription = []; if ( isset( $archiveDescription[ $postType ] ) ) { return $archiveDescription[ $postType ]; } $archiveDescription[ $postType ] = ''; $dynamicOptions = aioseo()->dynamicOptions->noConflict(); if ( $dynamicOptions->searchAppearance->archives->has( $postType ) ) { $archiveDescription[ $postType ] = aioseo()->dynamicOptions->searchAppearance->archives->{$postType}->metaDescription; } return $archiveDescription[ $postType ]; } /** * Retrieve the default description for the post type. * * @since 4.0.6 * * @param string $postType The post type. * @return string The description. */ public function getPostTypeDescription( $postType ) { static $postTypeDescription = []; if ( isset( $postTypeDescription[ $postType ] ) ) { return $postTypeDescription[ $postType ]; } if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType ) ) { $description = aioseo()->dynamicOptions->searchAppearance->postTypes->{$postType}->metaDescription; } $postTypeDescription[ $postType ] = empty( $description ) ? '' : $description; return $postTypeDescription[ $postType ]; } /** * Returns the term description. * * @since 4.0.6 * * @param \WP_Term $term The term object. * @param boolean $default Whether we want the default value, not the post one. * @return string The term description. */ public function getTermDescription( $term, $default = false ) { if ( ! is_a( $term, 'WP_Term' ) ) { return ''; } static $terms = []; if ( isset( $terms[ $term->term_id ] ) ) { return $terms[ $term->term_id ]; } $description = ''; if ( in_array( 'autogenerateDescriptions', aioseo()->internalOptions->deprecatedOptions, true ) && ! aioseo()->options->deprecated->searchAppearance->advanced->autogenerateDescriptions ) { $terms[ $term->term_id ] = $description; return $description; } $dynamicOptions = aioseo()->dynamicOptions->noConflict(); if ( ! $description && $dynamicOptions->searchAppearance->taxonomies->has( $term->taxonomy ) ) { $description = $this->helpers->prepare( aioseo()->dynamicOptions->searchAppearance->taxonomies->{$term->taxonomy}->metaDescription, false, $default ); } $terms[ $term->term_id ] = $description ? $description : $this->helpers->prepare( term_description( $term->term_id ), false, $default ); return $terms[ $term->term_id ]; } } MetaData.php 0000666 00000007556 15165655103 0006765 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } use AIOSEO\Plugin\Common\Models; /** * Handles fetching metadata for the current object. * * @since 4.0.0 */ class MetaData { /** * The cached meta data for posts. * * @since 4.1.7 * * @var array */ private $posts = []; /** * Class constructor. * * @since 4.0.0 */ public function __construct() { add_action( 'wpml_pro_translation_completed', [ $this, 'updateWpmlLocalization' ], 1000, 3 ); } /** * Update the localized data in our posts table. * * @since 4.0.0 * * @param integer $postId The post ID. * @param array $fields An array of fields to update. * @return void */ public function updateWpmlLocalization( $postId, $fields = [], $job = null ) { $aioseoFields = [ '_aioseo_title', '_aioseo_description', '_aioseo_keywords', '_aioseo_og_title', '_aioseo_og_description', '_aioseo_twitter_title', '_aioseo_twitter_description' ]; $parentId = $job->original_doc_id; $parentPost = Models\Post::getPost( $parentId ); $currentPost = Models\Post::getPost( $postId ); $columns = $parentPost->getColumns(); foreach ( $columns as $column => $value ) { // Skip the ID columns. if ( 'id' === $column || 'post_id' === $column ) { continue; } $currentPost->$column = $parentPost->$column; } $currentPost->post_id = $postId; foreach ( $aioseoFields as $aioseoField ) { if ( ! empty( $fields[ 'field-' . $aioseoField . '-0' ] ) ) { $value = $fields[ 'field-' . $aioseoField . '-0' ]['data']; if ( '_aioseo_keywords' === $aioseoField ) { $value = explode( ',', $value ); foreach ( $value as $k => $keyword ) { $value[ $k ] = [ 'label' => $keyword, 'value' => $keyword ]; } $value = wp_json_encode( $value ); } $currentPost->{ str_replace( '_aioseo_', '', $aioseoField ) } = $value; } } $currentPost->save(); } /** * Returns the metadata for the current object. * * @since 4.0.0 * * @param \WP_Post $post The post object (optional). * @return Models\Post|bool The meta data or false. */ public function getMetaData( $post = null ) { if ( ! $post ) { $post = aioseo()->helpers->getPost(); } if ( $post ) { $post = is_object( $post ) ? $post : aioseo()->helpers->getPost( $post ); // If we still have no post, let's return false. if ( ! is_a( $post, 'WP_Post' ) ) { return false; } if ( isset( $this->posts[ $post->ID ] ) ) { return $this->posts[ $post->ID ]; } $this->posts[ $post->ID ] = Models\Post::getPost( $post->ID ); if ( ! $this->posts[ $post->ID ]->exists() ) { $migratedMeta = aioseo()->migration->meta->getMigratedPostMeta( $post->ID ); if ( ! empty( $migratedMeta ) ) { foreach ( $migratedMeta as $k => $v ) { $this->posts[ $post->ID ]->{$k} = $v; } $this->posts[ $post->ID ]->save(); } } return $this->posts[ $post->ID ]; } return false; } /** * Returns the cached OG image from the meta data. * * @since 4.1.6 * * @param Object $metaData The meta data object. * @return array An array of image data. */ public function getCachedOgImage( $metaData ) { return [ $metaData->og_image_url, isset( $metaData->og_image_width ) ? $metaData->og_image_width : null, isset( $metaData->og_image_height ) ? $metaData->og_image_height : null ]; } /** * Busts the meta data cache for a given post. * * @since 4.1.7 * * @param int $postId The post ID. * @param Models\Post $metaData The meta data. * @return void */ public function bustPostCache( $postId, $metaData = null ) { if ( null === $metaData || ! is_a( $metaData, 'AIOSEO\Plugin\Common\Models\Post' ) ) { unset( $this->posts[ $postId ] ); } $this->posts[ $postId ] = $metaData; } } Title.php 0000666 00000015461 15165655103 0006360 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } use AIOSEO\Plugin\Common\Integrations\BuddyPress as BuddyPressIntegration; /** * Handles the title. * * @since 4.0.0 */ class Title { /** * Helpers class instance. * * @since 4.2.7 * * @var Helpers */ public $helpers = null; /** * Class constructor. * * @since 4.1.2 */ public function __construct() { $this->helpers = new Helpers( 'title' ); } /** * Returns the filtered page title. * * Acts as a helper for getTitle() because we need to encode the title before sending it back to the filter. * * @since 4.0.0 * * @return string The page title. */ public function filterPageTitle( $wpTitle = '' ) { $title = $this->getTitle(); return ! empty( $title ) ? aioseo()->helpers->encodeOutputHtml( $title ) : $wpTitle; } /** * Returns the homepage title. * * @since 4.0.0 * * @return string The homepage title. */ public function getHomePageTitle() { if ( 'page' === get_option( 'show_on_front' ) ) { $title = $this->getPostTitle( (int) get_option( 'page_on_front' ) ); return $title ? $title : aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) ); } $title = aioseo()->options->searchAppearance->global->siteTitle; if ( aioseo()->helpers->isWpmlActive() ) { // Allow WPML to translate the title if the homepage is not static. $title = apply_filters( 'wpml_translate_single_string', $title, 'admin_texts_aioseo_options_localized', '[aioseo_options_localized]searchAppearance_global_siteTitle' ); } $title = $this->helpers->prepare( $title ); return $title ? $title : aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) ); } /** * Returns the title for the current page. * * @since 4.0.0 * * @param \WP_Post $post The post object (optional). * @param boolean $default Whether we want the default value, not the post one. * @return string The page title. */ public function getTitle( $post = null, $default = false ) { if ( BuddyPressIntegration::isComponentPage() ) { return aioseo()->standalone->buddyPress->component->getMeta( 'title' ); } if ( is_home() ) { return $this->getHomePageTitle(); } if ( $post || is_singular() || aioseo()->helpers->isStaticPage() ) { return $this->getPostTitle( $post, $default ); } if ( is_category() || is_tag() || is_tax() ) { $term = $post ? $post : aioseo()->helpers->getTerm(); return $this->getTermTitle( $term, $default ); } if ( is_author() ) { return $this->helpers->prepare( aioseo()->options->searchAppearance->archives->author->title ); } if ( is_date() ) { return $this->helpers->prepare( aioseo()->options->searchAppearance->archives->date->title ); } if ( is_search() ) { return $this->helpers->prepare( aioseo()->options->searchAppearance->archives->search->title ); } if ( is_post_type_archive() ) { $postType = get_queried_object(); if ( is_a( $postType, 'WP_Post_Type' ) ) { return $this->helpers->prepare( $this->getArchiveTitle( $postType->name ) ); } } return ''; } /** * Returns the post title. * * @since 4.0.0 * * @param \WP_Post|int $post The post object or ID. * @param boolean $default Whether we want the default value, not the post one. * @return string The post title. */ public function getPostTitle( $post, $default = false ) { $post = $post && is_object( $post ) ? $post : aioseo()->helpers->getPost( $post ); if ( ! is_a( $post, 'WP_Post' ) ) { return ''; } static $posts = []; if ( isset( $posts[ $post->ID ] ) ) { return $posts[ $post->ID ]; } $title = ''; $metaData = aioseo()->meta->metaData->getMetaData( $post ); if ( ! empty( $metaData->title ) && ! $default ) { $title = $this->helpers->prepare( $metaData->title, $post->ID ); } if ( ! $title ) { $title = $this->helpers->prepare( $this->getPostTypeTitle( $post->post_type ), $post->ID, $default ); } // If this post is the static home page and we have no title, let's reset to the site name. if ( empty( $title ) && 'page' === get_option( 'show_on_front' ) && (int) get_option( 'page_on_front' ) === $post->ID ) { $title = aioseo()->helpers->decodeHtmlEntities( get_bloginfo( 'name' ) ); } if ( empty( $title ) ) { // Just return the WP default. $title = get_the_title( $post->ID ) . ' - ' . get_bloginfo( 'name' ); $title = aioseo()->helpers->decodeHtmlEntities( $title ); } $posts[ $post->ID ] = $title; return $posts[ $post->ID ]; } /** * Retrieve the default title for the archive template. * * @since 4.7.6 * * @param string $postType The custom post type. * @return string The title. */ public function getArchiveTitle( $postType ) { static $archiveTitle = []; if ( isset( $archiveTitle[ $postType ] ) ) { return $archiveTitle[ $postType ]; } $dynamicOptions = aioseo()->dynamicOptions->noConflict(); if ( $dynamicOptions->searchAppearance->archives->has( $postType ) ) { $title = aioseo()->dynamicOptions->searchAppearance->archives->{ $postType }->title; } $archiveTitle[ $postType ] = empty( $title ) ? '' : $title; return $archiveTitle[ $postType ]; } /** * Retrieve the default title for the post type. * * @since 4.0.6 * * @param string $postType The post type. * @return string The title. */ public function getPostTypeTitle( $postType ) { static $postTypeTitle = []; if ( isset( $postTypeTitle[ $postType ] ) ) { return $postTypeTitle[ $postType ]; } if ( aioseo()->dynamicOptions->searchAppearance->postTypes->has( $postType ) ) { $title = aioseo()->dynamicOptions->searchAppearance->postTypes->{$postType}->title; } $postTypeTitle[ $postType ] = empty( $title ) ? '' : $title; return $postTypeTitle[ $postType ]; } /** * Returns the term title. * * @since 4.0.6 * * @param \WP_Term $term The term object. * @param boolean $default Whether we want the default value, not the post one. * @return string The term title. */ public function getTermTitle( $term, $default = false ) { if ( ! is_a( $term, 'WP_Term' ) ) { return ''; } static $terms = []; if ( isset( $terms[ $term->term_id ] ) ) { return $terms[ $term->term_id ]; } $title = ''; $dynamicOptions = aioseo()->dynamicOptions->noConflict(); if ( ! $title && $dynamicOptions->searchAppearance->taxonomies->has( $term->taxonomy ) ) { $newTitle = aioseo()->dynamicOptions->searchAppearance->taxonomies->{$term->taxonomy}->title; $newTitle = preg_replace( '/#taxonomy_title/', aioseo()->helpers->escapeRegexReplacement( $term->name ), (string) $newTitle ); $title = $this->helpers->prepare( $newTitle, $term->term_id, $default ); } $terms[ $term->term_id ] = $title; return $terms[ $term->term_id ]; } } Robots.php 0000666 00000026417 15165655103 0006552 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } use AIOSEO\Plugin\Common\Integrations\BuddyPress as BuddyPressIntegration; /** * Handles the robots meta tag. * * @since 4.0.0 */ class Robots { /** * The robots meta tag attributes. * * We'll already set the keys on construction so that we always output the attributes in the same order. * * @since 4.0.0 * * @var array */ protected $attributes = [ 'noindex' => '', 'nofollow' => '', 'noarchive' => '', 'nosnippet' => '', 'noimageindex' => '', 'noodp' => '', 'notranslate' => '', 'max-snippet' => '', 'max-image-preview' => '', 'max-video-preview' => '' ]; /** * Class constructor. * * @since 4.0.16 */ public function __construct() { add_action( 'wp_loaded', [ $this, 'unregisterWooCommerceNoindex' ] ); add_action( 'template_redirect', [ $this, 'noindexFeed' ] ); add_action( 'wp_head', [ $this, 'disableWpRobotsCore' ], -1 ); } /** * Prevents WooCommerce from noindexing the Cart/Checkout pages. * * @since 4.1.3 * * @return void */ public function unregisterWooCommerceNoindex() { if ( has_action( 'wp_head', 'wc_page_noindex' ) ) { remove_action( 'wp_head', 'wc_page_noindex' ); } } /** * Prevents WP Core from outputting its own robots meta tag. * * @since 4.0.16 * * @return void */ public function disableWpRobotsCore() { remove_all_filters( 'wp_robots' ); } /** * Noindexes RSS feed pages. * * @since 4.0.17 * * @return void */ public function noindexFeed() { if ( ! is_feed() || ( ! aioseo()->options->searchAppearance->advanced->globalRobotsMeta->default && ! aioseo()->options->searchAppearance->advanced->globalRobotsMeta->noindexFeed ) ) { return; } header( 'X-Robots-Tag: noindex, follow', true ); } /** * Returns the robots meta tag value. * * @since 4.0.0 * * @return mixed The robots meta tag value or false. */ public function meta() { // We need this check to happen first as spammers can attempt to make the page appear like a post or term by using URL params e.g. "cat=". if ( is_search() ) { $this->globalValues( [ 'archives', 'search' ] ); return $this->metaHelper(); } if ( BuddyPressIntegration::isComponentPage() ) { return aioseo()->standalone->buddyPress->component->getMeta( 'robots' ); } if ( is_category() || is_tag() || is_tax() ) { $this->term(); return $this->metaHelper(); } if ( is_home() && 'page' !== get_option( 'show_on_front' ) ) { $this->globalValues(); return $this->metaHelper(); } $post = aioseo()->helpers->getPost(); if ( $post ) { $this->post(); return $this->metaHelper(); } if ( is_author() ) { $this->globalValues( [ 'archives', 'author' ] ); return $this->metaHelper(); } if ( is_date() ) { $this->globalValues( [ 'archives', 'date' ] ); return $this->metaHelper(); } if ( is_404() ) { return apply_filters( 'aioseo_404_robots', 'noindex' ); } if ( is_archive() ) { $this->archives(); return $this->metaHelper(); } } /** * Stringifies and filters the robots meta tag value. * * Acts as a helper for meta(). * * @since 4.0.0 * * @param bool $array Whether or not to return the value as an array. * @return array|string The robots meta tag value. */ public function metaHelper( $array = false ) { $pageNumber = aioseo()->helpers->getPageNumber(); if ( 1 < $pageNumber || aioseo()->helpers->getCommentPageNumber() ) { if ( aioseo()->options->searchAppearance->advanced->globalRobotsMeta->default || aioseo()->options->searchAppearance->advanced->globalRobotsMeta->noindexPaginated ) { $this->attributes['noindex'] = 'noindex'; } if ( aioseo()->options->searchAppearance->advanced->globalRobotsMeta->default || aioseo()->options->searchAppearance->advanced->globalRobotsMeta->nofollowPaginated ) { $this->attributes['nofollow'] = 'nofollow'; } } // Never allow users to noindex the first page of the homepage. if ( is_front_page() && 1 === $pageNumber ) { $this->attributes['noindex'] = ''; } // Because we prevent WordPress Core from outputting a robots tag in disableWpRobotsCore(), we need to noindex/nofollow non-public sites ourselves. if ( ! get_option( 'blog_public' ) ) { $this->attributes['noindex'] = 'noindex'; $this->attributes['nofollow'] = 'nofollow'; } $this->attributes = array_filter( (array) apply_filters( 'aioseo_robots_meta', $this->attributes ) ); return $array ? $this->attributes : implode( ', ', $this->attributes ); } /** * Sets the attributes for the current post. * * @since 4.0.0 * * @param \WP_Post|null $post The post object. * @return void */ public function post( $post = null ) { $dynamicOptions = aioseo()->dynamicOptions->noConflict(); $post = aioseo()->helpers->getPost( $post ); $metaData = aioseo()->meta->metaData->getMetaData( $post ); if ( ! empty( $metaData ) && ! $metaData->robots_default ) { $this->metaValues( $metaData ); return; } if ( $dynamicOptions->searchAppearance->postTypes->has( $post->post_type ) ) { $this->globalValues( [ 'postTypes', $post->post_type ], true ); } } /** * Returns the robots meta tag value for the current term. * * @since 4.0.6 * * @param \WP_Term|null $term The term object if any. * @return void */ public function term( $term = null ) { $dynamicOptions = aioseo()->dynamicOptions->noConflict(); $term = is_a( $term, 'WP_Term' ) ? $term : aioseo()->helpers->getTerm(); // Misbehaving themes/plugins can manipulate the loop and make archives return a post as the queried object. if ( ! is_a( $term, 'WP_Term' ) ) { return; } if ( $dynamicOptions->searchAppearance->taxonomies->has( $term->taxonomy ) ) { $this->globalValues( [ 'taxonomies', $term->taxonomy ], true ); return; } $this->globalValues(); } /** * Sets the attributes for the current archive. * * @since 4.0.0 * * @return void */ private function archives() { $dynamicOptions = aioseo()->dynamicOptions->noConflict(); $postType = aioseo()->helpers->getTerm(); if ( ! empty( $postType->name ) && $dynamicOptions->searchAppearance->archives->has( $postType->name ) ) { $this->globalValues( [ 'archives', $postType->name ], true ); } } /** * Sets the attributes based on the global values. * * @since 4.0.0 * * @param array $optionOrder The order in which the options need to be called to get the relevant robots meta settings. * @param boolean $isDynamicOption Whether this is for a dynamic option. * @return void */ public function globalValues( $optionOrder = [], $isDynamicOption = false ) { $robotsMeta = []; if ( count( $optionOrder ) ) { $options = $isDynamicOption ? aioseo()->dynamicOptions->noConflict( true )->searchAppearance : aioseo()->options->noConflict()->searchAppearance; foreach ( $optionOrder as $option ) { if ( ! $options->has( $option, false ) ) { return; } $options = $options->$option; } $clonedOptions = clone $options; if ( ! $clonedOptions->show ) { $this->attributes['noindex'] = 'noindex'; } if ( ! isset( $options->advanced->robotsMeta ) ) { $robotsMeta = aioseo()->options->searchAppearance->advanced->globalRobotsMeta->all(); } else { $robotsMeta = $options->advanced->robotsMeta->all(); if ( $robotsMeta['default'] ) { $robotsMeta = aioseo()->options->searchAppearance->advanced->globalRobotsMeta->all(); } } } else { $robotsMeta = aioseo()->options->searchAppearance->advanced->globalRobotsMeta->all(); } $this->attributes['max-image-preview'] = 'max-image-preview:large'; if ( $robotsMeta['default'] ) { return; } if ( $robotsMeta['noindex'] ) { $this->attributes['noindex'] = 'noindex'; } if ( $robotsMeta['nofollow'] ) { $this->attributes['nofollow'] = 'nofollow'; } if ( $robotsMeta['noarchive'] ) { $this->attributes['noarchive'] = 'noarchive'; } $noSnippet = $robotsMeta['nosnippet']; if ( $noSnippet ) { $this->attributes['nosnippet'] = 'nosnippet'; } if ( $robotsMeta['noodp'] ) { $this->attributes['noodp'] = 'noodp'; } if ( $robotsMeta['notranslate'] ) { $this->attributes['notranslate'] = 'notranslate'; } $maxSnippet = $robotsMeta['maxSnippet']; if ( ! $noSnippet && is_numeric( $maxSnippet ) ) { $this->attributes['max-snippet'] = "max-snippet:$maxSnippet"; } $maxImagePreview = $robotsMeta['maxImagePreview']; $noImageIndex = $robotsMeta['noimageindex']; if ( ! $noImageIndex && $maxImagePreview && in_array( $maxImagePreview, [ 'none', 'standard', 'large' ], true ) ) { $this->attributes['max-image-preview'] = "max-image-preview:$maxImagePreview"; } $maxVideoPreview = $robotsMeta['maxVideoPreview']; if ( isset( $maxVideoPreview ) && is_numeric( $maxVideoPreview ) ) { $this->attributes['max-video-preview'] = "max-video-preview:$maxVideoPreview"; } // Check this last so that we can prevent max-image-preview from being output if noimageindex is enabled. if ( $noImageIndex ) { $this->attributes['max-image-preview'] = ''; $this->attributes['noimageindex'] = 'noimageindex'; } } /** * Sets the attributes from the meta data. * * @since 4.0.0 * * @param \AIOSEO\Plugin\Common\Models\Post|\AIOSEO\Plugin\Pro\Models\Term $metaData The post/term meta data. * @return void */ protected function metaValues( $metaData ) { if ( $metaData->robots_noindex || $this->isPasswordProtected() ) { $this->attributes['noindex'] = 'noindex'; } if ( $metaData->robots_nofollow ) { $this->attributes['nofollow'] = 'nofollow'; } if ( $metaData->robots_noarchive ) { $this->attributes['noarchive'] = 'noarchive'; } if ( $metaData->robots_nosnippet ) { $this->attributes['nosnippet'] = 'nosnippet'; } if ( $metaData->robots_noodp ) { $this->attributes['noodp'] = 'noodp'; } if ( $metaData->robots_notranslate ) { $this->attributes['notranslate'] = 'notranslate'; } if ( ! $metaData->robots_nosnippet && isset( $metaData->robots_max_snippet ) && is_numeric( $metaData->robots_max_snippet ) ) { $this->attributes['max-snippet'] = "max-snippet:$metaData->robots_max_snippet"; } if ( ! $metaData->robots_noimageindex && $metaData->robots_max_imagepreview && in_array( $metaData->robots_max_imagepreview, [ 'none', 'standard', 'large' ], true ) ) { $this->attributes['max-image-preview'] = "max-image-preview:$metaData->robots_max_imagepreview"; } if ( isset( $metaData->robots_max_videopreview ) && is_numeric( $metaData->robots_max_videopreview ) ) { $this->attributes['max-video-preview'] = "max-video-preview:$metaData->robots_max_videopreview"; } // Check this last so that we can prevent max-image-preview from being output if noimageindex is enabled. if ( $metaData->robots_noimageindex ) { $this->attributes['max-image-preview'] = ''; $this->attributes['noimageindex'] = 'noimageindex'; } } /** * Checks whether the current post is password protected. * * @since 4.0.0 * * @return bool Whether the post is password protected. */ private function isPasswordProtected() { $post = aioseo()->helpers->getPost(); return is_object( $post ) && $post->post_password; } } SiteVerification.php 0000666 00000001650 15165655103 0010541 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Handles the site verification meta tags. * * @since 4.0.0 */ class SiteVerification { /** * An array of webmaster tools and their meta names. * * @since 4.0.0 * * @var array */ private $webmasterTools = [ 'google' => 'google-site-verification', 'bing' => 'msvalidate.01', 'pinterest' => 'p:domain_verify', 'yandex' => 'yandex-verification', 'baidu' => 'baidu-site-verification' ]; /** * Returns the robots meta tag value. * * @since 4.0.0 * * @return mixed The robots meta tag value or false. */ public function meta() { $metaArray = []; foreach ( $this->webmasterTools as $key => $metaName ) { $value = aioseo()->options->webmasterTools->$key; if ( ! empty( $value ) ) { $metaArray[ $metaName ] = $value; } } return $metaArray; } } Included.php 0000666 00000006250 15165655103 0007022 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * To check whether SEO is enabled for the queried object. * * @since 4.0.0 */ class Included { /** * Checks whether the queried object is included. * * @since 4.0.0 * * @return bool */ public function isIncluded() { if ( is_admin() || is_feed() ) { return false; } if ( apply_filters( 'aioseo_disable', false ) || $this->isExcludedGlobal() ) { return false; } if ( ! $this->isQueriedObjectPublic() ) { return false; } return true; } /** * Checks whether the queried object is public. * * @since 4.2.2 * * @return bool Whether the queried object is public. */ protected function isQueriedObjectPublic() { $queriedObject = get_queried_object(); // Don't use the getTerm helper here. if ( is_a( $queriedObject, 'WP_Post' ) ) { return aioseo()->helpers->isPostTypePublic( $queriedObject->post_type ); } // Check if the current page is a post type archive page. if ( is_a( $queriedObject, 'WP_Post_Type' ) ) { return aioseo()->helpers->isPostTypePublic( $queriedObject->name ); } if ( is_a( $queriedObject, 'WP_Term' ) ) { if ( aioseo()->helpers->isWooCommerceProductAttribute( $queriedObject->taxonomy ) ) { // Check if the attribute has archives enabled. $taxonomy = get_taxonomy( $queriedObject->taxonomy ); return $taxonomy->public; } return aioseo()->helpers->isTaxonomyPublic( $queriedObject->taxonomy ); } // Return true in all other cases (e.g. search page, date archive, etc.). return true; } /** * Checks whether the queried object has been excluded globally. * * @since 4.0.0 * * @return bool */ protected function isExcludedGlobal() { if ( is_category() || is_tag() || is_tax() ) { return $this->isTaxExcludedGlobal(); } if ( ! in_array( 'excludePosts', aioseo()->internalOptions->deprecatedOptions, true ) ) { return false; } $excludedPosts = aioseo()->options->deprecated->searchAppearance->advanced->excludePosts; if ( empty( $excludedPosts ) ) { return false; } $ids = []; foreach ( $excludedPosts as $object ) { $object = json_decode( $object ); if ( is_int( $object->value ) ) { $ids[] = (int) $object->value; } } $post = aioseo()->helpers->getPost(); if ( empty( $post ) ) { return false; } if ( in_array( (int) $post->ID, $ids, true ) ) { return true; } return false; } /** * Checks whether the queried object has been excluded globally. * * @since 4.0.0 * * @return bool */ protected function isTaxExcludedGlobal() { if ( ! in_array( 'excludeTerms', aioseo()->internalOptions->deprecatedOptions, true ) ) { return false; } $excludedTerms = aioseo()->options->deprecated->searchAppearance->advanced->excludeTerms; if ( empty( $excludedTerms ) ) { return false; } $ids = []; foreach ( $excludedTerms as $object ) { $object = json_decode( $object ); if ( is_int( $object->value ) ) { $ids[] = (int) $object->value; } } $term = aioseo()->helpers->getTerm(); if ( in_array( (int) $term->term_id, $ids, true ) ) { return true; } return false; } } Links.php 0000666 00000011442 15165655103 0006352 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Instantiates the meta links "next" and "prev". * * @since 4.0.0 */ class Links { /** * Get the prev/next links for the current page. * * @since 4.0.0 * * @return array An array of link data. */ public function getLinks() { $links = [ 'prev' => '', 'next' => '', ]; if ( is_home() || is_archive() || is_paged() ) { $links = $this->getHomeLinks(); } if ( is_page() || is_single() ) { global $post; $links = $this->getPostLinks( $post ); } $links['prev'] = apply_filters( 'aioseo_prev_link', $links['prev'] ); $links['next'] = apply_filters( 'aioseo_next_link', $links['next'] ); return $links; } /** * Get the prev/next links for the current page (home/archive, etc.). * * @since 4.0.0 * * @return array An array of link data. */ private function getHomeLinks() { $prev = ''; $next = ''; $page = aioseo()->helpers->getPageNumber(); global $wp_query; // phpcs:ignore Squiz.NamingConventions.ValidVariableName $maxPage = $wp_query->max_num_pages; // phpcs:ignore Squiz.NamingConventions.ValidVariableName if ( $page > 1 ) { $prev = get_previous_posts_page_link(); } if ( $page < $maxPage ) { $next = get_next_posts_page_link(); $paged = is_paged(); if ( ! is_single() ) { if ( ! $paged ) { $page = 1; } $nextpage = intval( $page ) + 1; if ( ! $maxPage || $maxPage >= $nextpage ) { $next = get_pagenum_link( $nextpage ); } } } // Remove trailing slashes if not set in the permalink structure. $prev = aioseo()->helpers->maybeRemoveTrailingSlash( $prev ); $next = aioseo()->helpers->maybeRemoveTrailingSlash( $next ); // Remove any query args that may be set on the URL, except if the site is using plain permalinks. $permalinkStructure = get_option( 'permalink_structure' ); if ( ! empty( $permalinkStructure ) ) { $prev = explode( '?', $prev )[0]; $next = explode( '?', $next )[0]; } return [ 'prev' => $prev, 'next' => $next, ]; } /** * Get the prev/next links for the current post. * * @since 4.0.0 * * @param \WP_Post $post The post. * @return array An array of link data. */ private function getPostLinks( $post ) { $prev = ''; $next = ''; $numpages = 1; $page = aioseo()->helpers->getPageNumber(); $content = is_a( $post, 'WP_Post' ) ? $post->post_content : ''; if ( false !== strpos( $content, '<!--nextpage-->', 0 ) ) { $content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content ); $content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content ); $content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content ); // Ignore nextpage at the beginning of the content. if ( 0 === strpos( $content, '<!--nextpage-->', 0 ) ) { $content = substr( $content, 15 ); } $pages = explode( '<!--nextpage-->', $content ); $numpages = count( $pages ); } else { $page = null; } if ( ! empty( $page ) ) { if ( $page > 1 ) { $prev = $this->getLinkPage( $page - 1 ); } if ( $page + 1 <= $numpages ) { $next = $this->getLinkPage( $page + 1 ); } } return [ 'prev' => $prev, 'next' => $next, ]; } /** * This is a clone of _wp_link_page, except that we don't output HTML. * * @since 4.0.0 * * @param integer $number The page number. * @return string The URL. */ private function getLinkPage( $number ) { global $wp_rewrite; // phpcs:ignore Squiz.NamingConventions.ValidVariableName $post = get_post(); $queryArgs = []; if ( 1 === (int) $number ) { $url = get_permalink(); } else { if ( ! get_option( 'permalink_structure' ) || in_array( $post->post_status, [ 'draft', 'pending' ], true ) ) { $url = add_query_arg( 'page', $number, get_permalink() ); } elseif ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) === $post->ID ) { $url = trailingslashit( get_permalink() ) . user_trailingslashit( "$wp_rewrite->pagination_base/" . $number, 'single_paged' ); // phpcs:ignore Squiz.NamingConventions.ValidVariableName } else { $url = trailingslashit( get_permalink() ) . user_trailingslashit( $number, 'single_paged' ); } } if ( is_preview() ) { // phpcs:disable HM.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Recommended if ( ( 'draft' !== $post->post_status ) && isset( $_GET['preview_id'], $_GET['preview_nonce'] ) ) { $queryArgs['preview_id'] = sanitize_text_field( wp_unslash( $_GET['preview_id'] ) ); $queryArgs['preview_nonce'] = sanitize_text_field( wp_unslash( $_GET['preview_nonce'] ) ); } // phpcs:enable $url = get_preview_post_link( $post, $queryArgs, $url ); } return esc_url( $url ); } } Amp.php 0000666 00000002202 15165655103 0006001 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Adds support for Google AMP. * * @since 4.0.0 */ class Amp { /** * Class constructor. * * @since 4.0.0 */ public function __construct() { add_action( 'init', [ $this, 'runAmp' ] ); } /** * Run the AMP hooks. * * @since 4.0.0 * * @return void */ public function runAmp() { if ( is_admin() || wp_doing_ajax() || wp_doing_cron() ) { return; } // Add social meta to AMP plugin. $enableAmp = apply_filters( 'aioseo_enable_amp_social_meta', true ); if ( $enableAmp ) { $useSchema = apply_filters( 'aioseo_amp_schema', true ); if ( $useSchema ) { add_action( 'amp_post_template_head', [ $this, 'removeHooksAmpSchema' ], 9 ); } add_action( 'amp_post_template_head', [ aioseo()->head, 'output' ], 11 ); } } /** * Remove Hooks with AMP's Schema. * * @since 4.0.0 * * @return void */ public function removeHooksAmpSchema() { // Remove AMP Schema hook used for outputting data. remove_action( 'amp_post_template_head', 'amp_print_schemaorg_metadata' ); } } Keywords.php 0000666 00000017722 15165655103 0007110 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } use AIOSEO\Plugin\Common\Integrations\BuddyPress as BuddyPressIntegration; /** * Handles the keywords. * * @since 4.0.0 */ class Keywords { /** * Get the keywords for the meta output. * * @since 4.0.0 * * @return string The keywords as a string. */ public function getKeywords() { if ( ! aioseo()->options->searchAppearance->advanced->useKeywords ) { return ''; } if ( BuddyPressIntegration::isComponentPage() ) { return aioseo()->standalone->buddyPress->component->getMeta( 'keywords' ); } $isStaticArchive = aioseo()->helpers->isWooCommerceShopPage() || aioseo()->helpers->isStaticPostsPage(); $dynamicContent = is_archive() || is_post_type_archive() || is_home() || aioseo()->helpers->isWooCommerceShopPage() || is_category() || is_tag() || is_tax(); $generate = aioseo()->options->searchAppearance->advanced->dynamicallyGenerateKeywords; if ( $dynamicContent && $generate ) { return $this->prepareKeywords( $this->getGeneratedKeywords() ); } if ( is_front_page() && ! aioseo()->helpers->isStaticHomePage() ) { $keywords = $this->extractMetaKeywords( aioseo()->options->searchAppearance->global->keywords ); return $this->prepareKeywords( $keywords ); } if ( $dynamicContent && ! $isStaticArchive ) { if ( is_date() ) { $keywords = $this->extractMetaKeywords( aioseo()->options->searchAppearance->archives->date->advanced->keywords ); return $this->prepareKeywords( $keywords ); } if ( is_author() ) { $keywords = $this->extractMetaKeywords( aioseo()->options->searchAppearance->archives->author->advanced->keywords ); return $this->prepareKeywords( $keywords ); } if ( is_search() ) { $keywords = $this->extractMetaKeywords( aioseo()->options->searchAppearance->archives->search->advanced->keywords ); return $this->prepareKeywords( $keywords ); } $postType = get_queried_object(); return is_a( $postType, 'WP_Post_Type' ) ? $this->prepareKeywords( $this->getArchiveKeywords( $postType->name ) ) : ''; } return $this->prepareKeywords( $this->getAllKeywords() ); } /** * Retrieves the default keywords for the archive template. * * @since 4.7.6 * * @param string $postType The post type. * @return array The keywords. */ public function getArchiveKeywords( $postType ) { static $archiveKeywords = []; if ( isset( $archiveKeywords[ $postType ] ) ) { return $archiveKeywords[ $postType ]; } $dynamicOptions = aioseo()->dynamicOptions->noConflict(); if ( $dynamicOptions->searchAppearance->archives->has( $postType ) ) { $keywords = $this->extractMetaKeywords( aioseo()->dynamicOptions->searchAppearance->archives->{ $postType }->advanced->keywords ); } $archiveKeywords[ $postType ] = empty( $keywords ) ? [] : $keywords; return $archiveKeywords[ $postType ]; } /** * Get generated keywords for an archive page. * * @since 4.0.0 * * @return array An array of generated keywords. */ private function getGeneratedKeywords() { global $posts, $wp_query; // phpcs:ignore Squiz.NamingConventions.ValidVariableName $keywords = []; $isStaticArchive = aioseo()->helpers->isWooCommerceShopPage() || aioseo()->helpers->isStaticPostsPage(); if ( $isStaticArchive ) { $keywords = $this->getAllKeywords(); } elseif ( is_front_page() && ! aioseo()->helpers->isStaticHomePage() ) { $keywords = $this->extractMetaKeywords( aioseo()->options->searchAppearance->global->keywords ); } elseif ( is_category() || is_tag() || is_tax() ) { $metaData = aioseo()->meta->metaData->getMetaData(); if ( ! empty( $metaData->keywords ) ) { $keywords = $this->extractMetaKeywords( $metaData->keywords ); } } $wpPosts = $posts; if ( empty( $posts ) ) { $wpPosts = array_filter( [ aioseo()->helpers->getPost() ] ); } // Turn off current query so we can get specific post data. // phpcs:disable Squiz.NamingConventions.ValidVariableName $originalTag = $wp_query->is_tag; $originalTax = $wp_query->is_tax; $originalCategory = $wp_query->is_category; $wp_query->is_tag = false; $wp_query->is_tax = false; $wp_query->is_category = false; foreach ( $wpPosts as $post ) { $metaData = aioseo()->meta->metaData->getMetaData( $post ); $tmpKeywords = $this->extractMetaKeywords( $metaData->keywords ); if ( count( $tmpKeywords ) ) { foreach ( $tmpKeywords as $keyword ) { $keywords[] = $keyword; } } } $wp_query->is_tag = $originalTag; $wp_query->is_tax = $originalTax; $wp_query->is_category = $originalCategory; // phpcs:enable Squiz.NamingConventions.ValidVariableName return $keywords; } /** * Returns the keywords. * * @since 4.0.0 * * @return array A list of unique keywords. */ public function getAllKeywords() { $keywords = []; $post = aioseo()->helpers->getPost(); $metaData = aioseo()->meta->metaData->getMetaData(); if ( ! empty( $metaData->keywords ) ) { $keywords = $this->extractMetaKeywords( $metaData->keywords ); } if ( $post ) { if ( aioseo()->options->searchAppearance->advanced->useTagsForMetaKeywords ) { $keywords = array_merge( $keywords, aioseo()->helpers->getAllTags( $post->ID ) ); } if ( aioseo()->options->searchAppearance->advanced->useCategoriesForMetaKeywords && ! is_page() ) { $keywords = array_merge( $keywords, aioseo()->helpers->getAllCategories( $post->ID ) ); } } return $keywords; } /** * Prepares the keywords for display. * * @since 4.0.0 * * @param array $keywords Raw keywords. * @return string A list of prepared keywords, comma-separated. */ public function prepareKeywords( $keywords ) { $keywords = $this->getUniqueKeywords( $keywords ); $keywords = trim( $keywords ); $keywords = aioseo()->helpers->internationalize( $keywords ); $keywords = stripslashes( $keywords ); $keywords = str_replace( '"', '', $keywords ); $keywords = wp_filter_nohtml_kses( $keywords ); return apply_filters( 'aioseo_keywords', $keywords ); } /** * Returns an array of keywords, based on a stringified list separated by commas. * * @since 4.0.0 * * @param string $keywords The keywords string. * @return array The keywords. */ public function keywordStringToList( $keywords ) { $keywords = str_replace( '"', '', $keywords ); return ! empty( $keywords ) ? explode( ',', $keywords ) : []; } /** * Returns a stringified list of unique keywords, separated by commas. * * @since 4.0.0 * * @param array $keywords The keywords. * @param boolean $toString Whether or not to turn it into a comma separated string. * @return string|array The keywords. */ public function getUniqueKeywords( $keywords, $toString = true ) { $keywords = $this->keywordsToLowerCase( $keywords ); return $toString ? implode( ',', $keywords ) : $keywords; } /** * Returns the keywords in lowercase. * * @since 4.0.0 * * @param array $keywords The keywords. * @return array The formatted keywords. */ private function keywordsToLowerCase( $keywords ) { $smallKeywords = []; if ( ! is_array( $keywords ) ) { $keywords = $this->keywordStringToList( $keywords ); } if ( ! empty( $keywords ) ) { foreach ( $keywords as $keyword ) { $smallKeywords[] = trim( aioseo()->helpers->toLowercase( $keyword ) ); } } return array_unique( $smallKeywords ); } /** * Extract keywords and then return as a string. * * @since 4.0.0 * * @param array|string $keywords An array of keywords or a json string. * @return array An array of keywords that were extracted. */ public function extractMetaKeywords( $keywords ) { $extracted = []; $keywords = is_string( $keywords ) ? json_decode( $keywords ) : $keywords; if ( ! empty( $keywords ) ) { foreach ( $keywords as $keyword ) { $extracted[] = trim( $keyword->value ); } } return $extracted; } } Meta.php 0000666 00000002700 15165655103 0006155 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } use AIOSEO\Plugin\Common\Models; /** * Instantiates the Meta classes. * * @since 4.0.0 */ class Meta { /** * MetaData class instance. * * @since 4.2.7 * * @var MetaData */ public $metaData = null; /** * Title class instance. * * @since 4.2.7 * * @var Title */ public $title = null; /** * Description class instance. * * @since 4.2.7 * * @var Description */ public $description = null; /** * Keywords class instance. * * @since 4.2.7 * * @var Keywords */ public $keywords = null; /** * Robots class instance. * * @since 4.2.7 * * @var Robots */ public $robots = null; /** * Class constructor. * * @since 4.0.0 */ public function __construct() { $this->metaData = new MetaData(); $this->title = new Title(); $this->description = new Description(); $this->keywords = new Keywords(); $this->robots = new Robots(); new Amp(); new Links(); add_action( 'delete_post', [ $this, 'deletePostMeta' ], 1000 ); } /** * When we delete the meta, we want to delete our post model. * * @since 4.0.1 * * @param integer $postId The ID of the post. * @return void */ public function deletePostMeta( $postId ) { $aioseoPost = Models\Post::getPost( $postId ); if ( $aioseoPost->exists() ) { $aioseoPost->delete(); } } } Helpers.php 0000666 00000006324 15165655103 0006677 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Contains helper methods for the title/description classes. * * @since 4.1.2 */ class Helpers { use Traits\Helpers\BuddyPress; /** * The name of the class where this instance is constructed. * * @since 4.1.2 * * @param string $name The name of the class. Either "title" or "description". */ private $name; /** * Supported filters we can run after preparing the value. * * @since 4.1.2 * * @var array */ private $supportedFilters = [ 'title' => 'aioseo_title', 'description' => 'aioseo_description' ]; /** * Class constructor. * * @since 4.1.2 * * @param string $name The name of the class where this instance is constructed. */ public function __construct( $name ) { $this->name = $name; } /** * Sanitizes the title/description. * * @since 4.1.2 * * @param string $value The value. * @param int|bool $objectId The post/term ID. * @param bool $replaceTags Whether the smart tags should be replaced. * @return string The sanitized value. */ public function sanitize( $value, $objectId = false, $replaceTags = false ) { $value = $replaceTags ? $value : aioseo()->tags->replaceTags( $value, $objectId ); $value = aioseo()->helpers->doShortcodes( $value ); $value = aioseo()->helpers->decodeHtmlEntities( $value ); $value = $this->encodeExceptions( $value ); $value = wp_strip_all_tags( strip_shortcodes( $value ) ); // Because we encoded the exceptions, we need to decode them again first to prevent double encoding later down the line. $value = aioseo()->helpers->decodeHtmlEntities( $value ); // Trim internal and external whitespace. $value = preg_replace( '/[\s]+/u', ' ', (string) trim( $value ) ); return aioseo()->helpers->internationalize( $value ); } /** * Prepares the title/description before returning it. * * @since 4.1.2 * * @param string $value The value. * @param int|bool $objectId The post/term ID. * @param bool $replaceTags Whether the smart tags should be replaced. * @return string The sanitized value. */ public function prepare( $value, $objectId = false, $replaceTags = false ) { if ( ! empty( $value ) && ! is_admin() && 1 < aioseo()->helpers->getPageNumber() ) { $value .= ' ' . trim( aioseo()->options->searchAppearance->advanced->pagedFormat ); } $value = $replaceTags ? $value : aioseo()->tags->replaceTags( $value, $objectId ); $value = apply_filters( $this->supportedFilters[ $this->name ], $value ); return $this->sanitize( $value, $objectId, $replaceTags ); } /** * Encodes a number of exceptions before we strip tags. * We need this function to allow certain character (combinations) in the title/description. * * @since 4.1.1 * * @param string $string The string. * @return string $string The string with exceptions encoded. */ public function encodeExceptions( $string ) { $exceptions = [ '<3' ]; foreach ( $exceptions as $exception ) { $string = preg_replace( "/$exception/", aioseo()->helpers->encodeOutputHtml( $exception ), (string) $string ); } return $string; } } Traits/Helpers/BuddyPress.php 0000666 00000001370 15165655103 0012225 0 ustar 00 <?php namespace AIOSEO\Plugin\Common\Meta\Traits\Helpers; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Contains BuddyPress specific helper methods. * * @since 4.7.6 */ trait BuddyPress { /** * Sanitizes the title/description. * * @since 4.7.6 * * @param string $value The value. * @param int $objectId The object ID. * @param bool $replaceTags Whether the smart tags should be replaced. * @return string The sanitized value. */ public function bpSanitize( $value, $objectId = 0, $replaceTags = false ) { $value = $replaceTags ? $value : aioseo()->standalone->buddyPress->tags->replaceTags( $value, $objectId ); return $this->sanitize( $value, $objectId, true ); } }
| ver. 1.4 |
Github
|
.
| PHP 5.4.45 | Generation time: 0 |
proxy
|
phpinfo
|
Settings