You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.6 KiB

<?php
/**
* AMP Post type support.
*
* @package AMP
* @since 0.6
*/
/**
* Class AMP_Post_Type_Support.
*/
class AMP_Post_Type_Support {
/**
* Post type support slug.
*
* @var string
*/
const SLUG = 'amp';
/**
* Get post types that plugin supports out of the box (which cannot be disabled).
*
* @deprecated
* @return string[] Post types.
*/
public static function get_builtin_supported_post_types() {
_deprecated_function( __METHOD__, '1.0' );
return array_filter( [ 'post' ], 'post_type_exists' );
}
/**
* Get post types that are eligible for AMP support.
*
* @since 0.6
* @return string[] Post types eligible for AMP.
*/
public static function get_eligible_post_types() {
return array_diff(
array_values(
get_post_types(
[
'public' => true,
],
'names'
)
),
[
AMP_Story_Post_Type::POST_TYPE_SLUG,
]
);
}
/**
* Declare support for post types.
*
* This function should only be invoked through the 'after_setup_theme' action to
* allow plugins/theme to overwrite the post types support.
*
* @since 0.6
*/
public static function add_post_type_support() {
if ( current_theme_supports( AMP_Theme_Support::SLUG ) && AMP_Options_Manager::get_option( 'all_templates_supported' ) ) {
$post_types = self::get_eligible_post_types();
} else {
$post_types = AMP_Options_Manager::get_option( 'supported_post_types', [] );
}
foreach ( $post_types as $post_type ) {
add_post_type_support( $post_type, self::SLUG );
}
}
/**
* Return error codes for why a given post does not have AMP support.
*
* @since 0.6
*
* @param WP_Post|int $post Post.
* @return array Error codes for why a given post does not have AMP support.
*/
public static function get_support_errors( $post ) {
if ( ! ( $post instanceof WP_Post ) ) {
$post = get_post( $post );
}
$errors = [];
if ( ! post_type_supports( $post->post_type, self::SLUG ) ) {
$errors[] = 'post-type-support';
}
if ( post_password_required( $post ) ) {
$errors[] = 'password-protected';
}
/**
* Filters whether to skip the post from AMP.
*
* @since 0.3
*
* @param bool $skipped Skipped.
* @param int $post_id Post ID.
* @param WP_Post $post Post.
*/
if ( isset( $post->ID ) && true === apply_filters( 'amp_skip_post', false, $post->ID, $post ) ) {
$errors[] = 'skip-post';
}
$status = get_post_meta( $post->ID, AMP_Post_Meta_Box::STATUS_POST_META_KEY, true );
if ( $status ) {
if ( AMP_Post_Meta_Box::DISABLED_STATUS === $status ) {
$errors[] = 'post-status-disabled';
}
} else {
/*
* Disabled by default for custom page templates, page on front and page for posts, unless 'amp' theme
* support is present (in which case AMP_Theme_Support::get_template_availability() determines availability).
*/
$enabled = (
current_theme_supports( AMP_Theme_Support::SLUG )
||
(
! (bool) get_page_template_slug( $post )
&&
! (
'page' === $post->post_type
&&
'page' === get_option( 'show_on_front' )
&&
in_array(
(int) $post->ID,
[
(int) get_option( 'page_on_front' ),
(int) get_option( 'page_for_posts' ),
],
true
)
)
)
);
/**
* Filters whether default AMP status should be enabled or not.
*
* @since 0.6
*
* @param string $status Status.
* @param WP_Post $post Post.
*/
$enabled = apply_filters( 'amp_post_status_default_enabled', $enabled, $post );
if ( ! $enabled ) {
$errors[] = 'post-status-disabled';
}
}
return $errors;
}
}