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.

209 lines
4.9 KiB
PHP

<?php
/**
* Add the OpenGraph tags to the header.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\OpenGraph
* @author Rank Math <support@rankmath.com>
*
* @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.
*/
namespace RankMath\OpenGraph;
use RankMath\Post;
use RankMath\Term;
use RankMath\User;
use RankMath\Helper;
use RankMath\Paper\Paper;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Str;
defined( 'ABSPATH' ) || exit;
/**
* OpenGraph class.
*/
class OpenGraph {
use Hooker;
/**
* Holds network slug.
*
* @var string
*/
public $network = '';
/**
* Hold meta_key prefix.
*
* @var string
*/
public $prefix = '';
/**
* Schema type.
*
* @var bool|string
*/
protected $schema = false;
/**
* The Constructor.
*/
public function __construct() {
$this->action( 'rank_math/head', 'output_tags', 30 );
}
/**
* Main OpenGraph output.
*/
public function output_tags() {
wp_reset_query();
/**
* Hook to add all OpenGraph metadata
*
* The dynamic part of the hook name. $this->network, is the network slug.
*
* @param OpenGraph $this The current opengraph network object.
*/
$this->do_action( "opengraph/{$this->network}", $this );
}
/**
* Get title
*
* @return bool|string
*/
public function get_title() {
$title = $this->_title();
if ( $title && Helper::get_settings( 'titles.capitalize_titles' ) ) {
$title = Str::mb_ucwords( $title );
}
return $title ? $title : Paper::get()->get_title();
}
/**
* Get title.
*
* @return string
*/
private function _title() {
$key = $this->prefix . '_title';
if ( Post::is_simple_page() ) {
return Post::get_meta( $key, Post::get_page_id() );
}
if ( is_front_page() ) {
return Helper::replace_vars( Helper::get_settings( 'titles.homepage_facebook_title' ) );
}
if ( is_category() || is_tax() || is_tag() ) {
return Term::get_meta( $key );
}
return is_author() ? User::get_meta( $key ) : false;
}
/**
* Get description.
*
* @return bool|string
*/
public function get_description() {
$desc = false;
$key = $this->prefix . '_description';
if ( Post::is_simple_page() ) {
$desc = Post::get_meta( $key, Post::get_page_id() );
$desc = '' !== $desc ? $desc : $this->fallback_description( 'get_the_excerpt' );
} elseif ( is_front_page() ) {
$desc = Helper::replace_vars( Helper::get_settings( 'titles.homepage_facebook_description' ) );
} elseif ( is_category() || is_tag() || is_tax() ) {
$desc = Term::get_meta( $key );
$desc = '' !== $desc ? $desc : $this->fallback_description( 'term_description' );
} elseif ( is_author() ) {
$desc = User::get_meta( $key );
}
return $desc ? $desc : $this->fallback_description();
}
/**
* Get a fallback description.
*
* @param string $callback Function name to call.
*
* @return string
*/
protected function fallback_description( $callback = false ) {
$desc = Paper::get()->get_description();
if ( '' === $desc && $callback ) {
$desc = $callback();
}
return $desc;
}
/**
* Internal function to output social meta tags.
*
* @param string $property Property attribute value.
* @param string $content Content attribute value.
*
* @return bool
*/
public function tag( $property, $content ) {
$og_property = str_replace( ':', '_', $property );
/**
* Allow developers to change the content of specific social meta tags.
*
* The dynamic part of the hook name. $this->network, is the network slug
* and $og_property, is the property which we are outputting.
*
* @param string $content The content of the property.
*/
$content = $this->do_filter( "opengraph/{$this->network}/$og_property", $content );
if ( empty( $content ) || ! is_scalar( $content ) ) {
return false;
}
$tag = 'facebook' === $this->network ? 'property' : 'name';
$escaped_value = esc_attr( $content );
if ( false !== filter_var( $content, FILTER_VALIDATE_URL ) ) {
$escaped_value = esc_url_raw( $content );
}
printf( '<meta %1$s="%2$s" content="%3$s" />' . "\n", $tag, esc_attr( $property ), $escaped_value );
return true;
}
/**
* Get Overlay Image URL
*
* @param string $network The social network.
*
* @return string
*/
public function get_overlay_image( $network = 'facebook' ) {
if ( is_singular() ) {
return Helper::get_post_meta( "{$network}_enable_image_overlay" ) ? Helper::get_post_meta( "{$network}_image_overlay", '', 'play' ) : '';
}
if ( is_category() || is_tag() || is_tax() ) {
return Helper::get_term_meta( "{$network}_enable_image_overlay" ) ? Helper::get_term_meta( "{$network}_image_overlay", 0, '', 'play' ) : '';
}
if ( is_author() ) {
return Helper::get_user_meta( "{$network}_enable_image_overlay" ) ? Helper::get_user_meta( "{$network}_image_overlay", 0, 'play' ) : '';
}
return '';
}
}