Initial commit: Atomaste website
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
<?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' );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,283 @@
|
||||
<?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 ];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,274 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
<?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 );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,400 @@
|
||||
<?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';
|
||||
}
|
||||
|
||||
$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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,250 @@
|
||||
<?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 ];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?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 );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user