This commit is contained in:
2026-04-29 19:04:20 +08:00
parent df60e8dd42
commit 07d11a15af
58 changed files with 3937 additions and 520 deletions
+124
View File
@@ -0,0 +1,124 @@
<?php
/**
* SEO / Meta-tags class.
*
* Outputs Open Graph and Twitter Card meta tags.
* Does NOT run if a dedicated SEO plugin (Yoast, RankMath, AIOSEO) is active.
*
* @package CyyWordpress
*/
if ( ! class_exists( 'CyyWordpress_SEO' ) ) :
/**
* Manages Open Graph + Twitter Card meta output.
*/
class CyyWordpress_SEO {
/**
* Register hooks.
*/
public static function init(): void {
// Bail early if a popular SEO plugin is active.
if (
defined( 'WPSEO_VERSION' ) // Yoast SEO
|| defined( 'RANKMATH_VERSION' ) // RankMath
|| class_exists( 'All_in_One_SEO_Pack' )
) {
return;
}
add_action( 'wp_head', array( static::class, 'output_meta_tags' ), 5 );
}
/**
* Output all meta tags.
*/
public static function output_meta_tags(): void {
$description = self::get_description();
$image = self::get_image();
$type = is_singular() ? 'article' : 'website';
$url = esc_url( self::get_canonical_url() );
$title = esc_attr( wp_get_document_title() );
echo "\n<!-- CyyWordpress SEO Meta -->\n";
// Open Graph.
printf( '<meta property="og:title" content="%s">' . PHP_EOL, esc_attr( $title ) );
printf( '<meta property="og:description" content="%s">' . PHP_EOL, esc_attr( $description ) );
printf( '<meta property="og:url" content="%s">' . PHP_EOL, $url );
printf( '<meta property="og:type" content="%s">' . PHP_EOL, esc_attr( $type ) );
printf( '<meta property="og:site_name" content="%s">' . PHP_EOL, esc_attr( get_bloginfo( 'name' ) ) );
if ( $image ) {
printf( '<meta property="og:image" content="%s">' . PHP_EOL, esc_url( $image ) );
printf( '<meta property="og:image:alt" content="%s">' . PHP_EOL, esc_attr( $title ) );
}
// Twitter Card.
$card_type = $image ? 'summary_large_image' : 'summary';
printf( '<meta name="twitter:card" content="%s">' . PHP_EOL, esc_attr( $card_type ) );
printf( '<meta name="twitter:title" content="%s">' . PHP_EOL, esc_attr( $title ) );
printf( '<meta name="twitter:description" content="%s">' . PHP_EOL, esc_attr( $description ) );
if ( $image ) {
printf( '<meta name="twitter:image" content="%s">' . PHP_EOL, esc_url( $image ) );
}
echo "<!-- /CyyWordpress SEO Meta -->\n\n";
}
/**
* Returns a cleaned excerpt / description.
*/
private static function get_description(): string {
if ( is_singular() ) {
global $post;
$excerpt = has_excerpt() ? get_the_excerpt() : wp_trim_words( wp_strip_all_tags( $post->post_content ), 30 );
return sanitize_text_field( $excerpt );
}
$tagline = get_bloginfo( 'description' );
return sanitize_text_field( $tagline );
}
/**
* Returns the OG image URL.
*/
private static function get_image(): string {
if ( is_singular() && has_post_thumbnail() ) {
$src = wp_get_attachment_image_src( (int) get_post_thumbnail_id(), 'large' );
if ( $src ) {
return $src[0];
}
}
// Site-wide fallback: custom logo.
$logo_id = get_theme_mod( 'custom_logo' );
if ( $logo_id ) {
$src = wp_get_attachment_image_src( (int) $logo_id, 'full' );
if ( $src ) {
return $src[0];
}
}
return '';
}
/**
* Returns the canonical URL for the current page.
*/
private static function get_canonical_url(): string {
if ( is_singular() ) {
return (string) get_permalink();
}
if ( is_home() ) {
return home_url( '/' );
}
return home_url( add_query_arg( array() ) );
}
}
endif;