You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
8.6 KiB
PHP
348 lines
8.6 KiB
PHP
<?php
|
|
/**
|
|
* This code adds the Facebook metadata.
|
|
*
|
|
* @since 0.9.0
|
|
* @package RankMath
|
|
* @subpackage RankMath\OpenGraph
|
|
* @author Rank Math <support@rankmath.com>
|
|
*/
|
|
|
|
namespace RankMath\OpenGraph;
|
|
|
|
use RankMath\Helper;
|
|
use RankMath\Paper\Paper;
|
|
use RankMath\Helpers\Str;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Facebook class.
|
|
*/
|
|
class Facebook extends OpenGraph {
|
|
|
|
/**
|
|
* Network slug.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $network = 'facebook';
|
|
|
|
/**
|
|
* Metakey prefix.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $prefix = 'facebook';
|
|
|
|
/**
|
|
* The Constructor.
|
|
*/
|
|
public function __construct() {
|
|
$this->hooks();
|
|
add_filter( 'jetpack_enable_open_graph', '__return_false' );
|
|
parent::__construct();
|
|
}
|
|
|
|
/**
|
|
* Hooks.
|
|
*/
|
|
private function hooks() {
|
|
if ( isset( $GLOBALS['fb_ver'] ) || class_exists( 'Facebook_Loader', false ) ) {
|
|
$this->filter( 'fb_meta_tags', 'facebook_filter', 10, 1 );
|
|
return;
|
|
}
|
|
|
|
$this->filter( 'language_attributes', 'add_namespace', 15 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'locale', 1 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'type', 5 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'title', 10 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'description', 11 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'url', 12 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'site_name', 13 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'website', 14 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'site_owner', 20 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'image', 30 );
|
|
|
|
}
|
|
|
|
/**
|
|
* Filter the Facebook plugins metadata.
|
|
*
|
|
* @param array $meta_tags The array to fix.
|
|
* @return array
|
|
*/
|
|
public function facebook_filter( $meta_tags ) {
|
|
$meta_tags['http://ogp.me/ns#type'] = $this->type( false );
|
|
$meta_tags['http://ogp.me/ns#title'] = $this->title( false );
|
|
|
|
// Filter the locale too because the Facebook plugin locale code is not as good as ours.
|
|
$meta_tags['http://ogp.me/ns#locale'] = $this->locale( false );
|
|
|
|
$desc = $this->description( false );
|
|
if ( ! empty( $desc ) ) {
|
|
$meta_tags['http://ogp.me/ns#description'] = $desc;
|
|
}
|
|
|
|
return $meta_tags;
|
|
}
|
|
|
|
/**
|
|
* Adds prefix attributes to the <html> tag.
|
|
*
|
|
* @param string $input The input namespace string.
|
|
* @return string
|
|
*/
|
|
public function add_namespace( $input ) {
|
|
return $input . ' prefix="og: https://ogp.me/ns#"';
|
|
}
|
|
|
|
/**
|
|
* Output the locale, doing some conversions to make sure the proper Facebook locale is outputted.
|
|
*
|
|
* @see http://www.facebook.com/translations/FacebookLocales.xml for the list of supported locales
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/
|
|
*
|
|
* @param bool $echo Whether to echo or return the locale.
|
|
* @return string
|
|
*/
|
|
public function locale( $echo = true ) {
|
|
$locale = get_locale();
|
|
$locale = Facebook_Locale::sanitize( $locale );
|
|
$locale = Facebook_Locale::validate( $locale );
|
|
|
|
if ( $echo ) {
|
|
$this->tag( 'og:locale', $locale );
|
|
}
|
|
|
|
return $locale;
|
|
}
|
|
|
|
/**
|
|
* Output the OpenGraph type.
|
|
*
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/object/
|
|
*
|
|
* @param bool $echo Whether to echo or return the type.
|
|
* @return string
|
|
*/
|
|
public function type( $echo = true ) {
|
|
$type = $this->get_type();
|
|
|
|
if ( is_singular() ) {
|
|
if ( 'article' === $type && ! is_front_page() ) {
|
|
$this->action( 'rank_math/opengraph/facebook', 'article_author', 15 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'tags', 16 );
|
|
$this->action( 'rank_math/opengraph/facebook', 'category', 17 );
|
|
}
|
|
$this->action( 'rank_math/opengraph/facebook', 'publish_date', 19 );
|
|
}
|
|
|
|
/**
|
|
* Allow changing the OpenGraph type of the page.
|
|
*
|
|
* @param string $type The OpenGraph type string.
|
|
*/
|
|
$type = $this->do_filter( 'opengraph/type', $type );
|
|
|
|
if ( Str::is_non_empty( $type ) && $echo ) {
|
|
$this->tag( 'og:type', $type );
|
|
}
|
|
|
|
return $type;
|
|
}
|
|
|
|
/**
|
|
* Get type.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function get_type() {
|
|
if ( is_front_page() || is_home() ) {
|
|
return 'website';
|
|
}
|
|
|
|
if ( is_author() ) {
|
|
return 'profile';
|
|
}
|
|
|
|
return $this->is_product() ? 'product' : 'article';
|
|
}
|
|
|
|
/**
|
|
* Outputs the SEO title as OpenGraph title.
|
|
*
|
|
* @copyright Copyright (C) 2008-2019, Yoast BV
|
|
* The following code is a derivative work of the code from the Yoast(https://github.com/Yoast/wordpress-seo/), which is licensed under GPL v3.
|
|
*
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/
|
|
*
|
|
* @param bool $echo Whether or not to echo the output.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function title( $echo = true ) {
|
|
$title = trim( $this->get_title() );
|
|
if ( $echo ) {
|
|
$this->tag( 'og:title', $title );
|
|
}
|
|
|
|
return $title;
|
|
}
|
|
|
|
/**
|
|
* Output the OpenGraph description, specific OG description first, if not, grab the meta description.
|
|
*
|
|
* @param bool $echo Whether to echo or return the description.
|
|
* @return string
|
|
*/
|
|
public function description( $echo = true ) {
|
|
$desc = trim( $this->get_description() );
|
|
if ( $echo ) {
|
|
$this->tag( 'og:description', $desc );
|
|
}
|
|
|
|
return $desc;
|
|
}
|
|
|
|
/**
|
|
* Output the canonical URL for the OpenGraph URL.
|
|
*
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/
|
|
*/
|
|
public function url() {
|
|
/**
|
|
* Filter the OpenGraph URL.
|
|
*/
|
|
$url = $this->do_filter( 'opengraph/url', esc_url( Paper::get()->get_canonical() ) );
|
|
$this->tag( 'og:url', $url );
|
|
}
|
|
|
|
/**
|
|
* Output the site name straight from the blog info.
|
|
*/
|
|
public function site_name() {
|
|
$this->tag( 'og:site_name', Helper::get_settings( 'titles.website_name', get_bloginfo( 'name' ) ) );
|
|
}
|
|
|
|
/**
|
|
* Outputs the websites FB page.
|
|
*
|
|
* @link https://developers.facebook.com/blog/post/2013/06/19/platform-updates--new-open-graph-tags-for-media-publishers-and-more/
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/
|
|
*/
|
|
public function website() {
|
|
$site = Helper::get_settings( 'titles.social_url_facebook' );
|
|
if ( 'article' === $this->type( false ) && '' !== $site ) {
|
|
$this->tag( 'article:publisher', $site );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Outputs the site owner.
|
|
*
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/
|
|
*/
|
|
public function site_owner() {
|
|
$app_id = Helper::get_settings( 'titles.facebook_app_id' );
|
|
if ( 0 !== absint( $app_id ) ) {
|
|
$this->tag( 'fb:app_id', $app_id );
|
|
return;
|
|
}
|
|
|
|
$admins = Helper::get_settings( 'titles.facebook_admin_id' );
|
|
if ( '' !== trim( $admins ) ) {
|
|
$this->tag( 'fb:admins', $admins );
|
|
return;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create new Image class and get the images to set the `og:image`.
|
|
*
|
|
* @param string|bool $image Optional. Image URL.
|
|
*/
|
|
public function image( $image = false ) {
|
|
$images = new Image( $image, $this );
|
|
$images->show();
|
|
}
|
|
|
|
/**
|
|
* Outputs the authors FB page.
|
|
*
|
|
* @link https://developers.facebook.com/blog/post/2013/06/19/platform-updates--new-open-graph-tags-for-media-publishers-and-more/
|
|
* @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/
|
|
*/
|
|
public function article_author() {
|
|
$this->tag( 'article:author', $this->get_author() );
|
|
}
|
|
|
|
/**
|
|
* Output the article tags as `article:tag` tags.
|
|
*/
|
|
public function tags() {
|
|
$tags = get_the_tags();
|
|
if ( is_wp_error( $tags ) || empty( $tags ) ) {
|
|
return;
|
|
}
|
|
|
|
foreach ( $tags as $tag ) {
|
|
$this->tag( 'article:tag', $tag->name );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Output the article category as an `article:section` tag.
|
|
*/
|
|
public function category() {
|
|
$terms = get_the_category();
|
|
if ( is_wp_error( $terms ) || empty( $terms ) ) {
|
|
return;
|
|
}
|
|
|
|
// We can only show one section here, so we take the first one.
|
|
$this->tag( 'article:section', $terms[0]->name );
|
|
}
|
|
|
|
/**
|
|
* Output the article publish and last modification date.
|
|
*/
|
|
public function publish_date() {
|
|
$post = get_post();
|
|
$pub = mysql2date( DATE_W3C, $post->post_date, false );
|
|
$mod = mysql2date( DATE_W3C, $post->post_modified, false );
|
|
|
|
if ( strtotime( $mod ) > strtotime( $pub ) ) {
|
|
$this->tag( 'og:updated_time', $mod );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get author.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function get_author() {
|
|
$author = Helper::get_user_meta( 'facebook_author', $GLOBALS['post']->post_author );
|
|
if ( $author ) {
|
|
return $author;
|
|
}
|
|
|
|
$author = get_user_meta( $GLOBALS['post']->post_author, 'facebook', true );
|
|
if ( $author ) {
|
|
return $author;
|
|
}
|
|
|
|
return Helper::get_settings( 'titles.facebook_author_urls' );
|
|
}
|
|
|
|
/**
|
|
* Is WooCommerce product
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function is_product() {
|
|
return function_exists( 'is_woocommerce' ) && function_exists( 'is_product' ) && is_product();
|
|
}
|
|
}
|