Created
September 1, 2023 07:12
-
-
Save code-flow/3395bf1ccb6392895974065a31d3e3a5 to your computer and use it in GitHub Desktop.
SNIP Yotpo Bridge Plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Plugin Name: SNIP/Yotpo Bridge | |
Description: Allows to use Yotpo ratings on Structured Data generated with SNIP. | |
Author: Florian Simeth | |
Version: 0.3.0 | |
Author URI: https://rich-snippets.io/yotpo-bridge | |
Plugin URI: https://rich-snippets.io | |
*/ | |
define( 'SNIP_YOTPO_CACHE_TIME', 3 * HOUR_IN_SECONDS ); | |
if ( ! defined( 'ABSPATH' ) ) { | |
exit; | |
} // Exit if accessed directly | |
/** | |
* | |
* PHP Version check. | |
* | |
*/ | |
if ( version_compare( PHP_VERSION, '7.0', '<' ) ) { | |
add_action( 'admin_notices', 'snip_yotpo_old_php_notice' ); | |
function snip_yotpo_old_php_notice() { | |
printf( | |
'<div class="notice error"><p>%s</p></div>', | |
sprintf( | |
__( 'Hey mate! Sorry for interrupting you. It seem\'s that you\'re using an old PHP version (your current version is %s). You should upgrade to at least 7.0 or higher in order to use the SNIP/Yotpo Bridge plugin. Thank you!', 'snip-yotpo' ), | |
esc_html( PHP_VERSION ) | |
) | |
); | |
} | |
# sorry. The plugin will not work with an old PHP version. | |
return; | |
} | |
function snip_yotpo_get_reviews( $product_id ) { | |
if ( ! function_exists( 'wc_yotpo_get_default_settings' ) ) { | |
return []; | |
} | |
$transient_key = "snip/yotpo/prod/{$product_id}/comments"; | |
$cache = get_transient( $transient_key ); | |
if ( is_array( $cache ) ) { | |
return $cache; | |
} | |
if ( ! class_exists( 'Yotpo' ) ) { | |
$yotpo_dir = realpath( __DIR__ . '/../yotpo-social-reviews-for-woocommerce/lib/yotpo-api/' ); | |
$yotpo_file = trailingslashit( $yotpo_dir ) . 'Yotpo.php'; | |
if ( ! is_file( $yotpo_file ) ) { | |
return []; | |
} | |
include( $yotpo_file ); | |
if ( ! class_exists( 'Yotpo' ) ) { | |
return []; | |
} | |
} | |
$yotpo_settings = get_option( 'yotpo_settings', wc_yotpo_get_default_settings() ); | |
if ( ! isset( $yotpo_settings['secret'] ) || ! isset( $yotpo_settings['app_key'] ) ) { | |
return []; | |
} | |
$secret = $yotpo_settings['secret']; | |
$app_key = $yotpo_settings['app_key']; | |
try { | |
$yotpo_api = new Yotpo( $app_key, $secret ); | |
$result = $yotpo_api->get_product_reviews( [ | |
'product_id' => $product_id, | |
'count' => 5, | |
] ); | |
} catch ( Exception $e ) { | |
return []; | |
} | |
if ( ! isset( $result['response'] ) ) { | |
set_transient( $transient_key, [], SNIP_YOTPO_CACHE_TIME ); | |
return false; | |
} | |
if ( ! isset( $result['response']['reviews'] ) ) { | |
set_transient( $transient_key, [], SNIP_YOTPO_CACHE_TIME ); | |
return false; | |
} | |
if ( ! is_array( $result['response']['reviews'] ) ) { | |
set_transient( $transient_key, [], SNIP_YOTPO_CACHE_TIME ); | |
return false; | |
} | |
set_transient( $transient_key, $result['response']['reviews'], SNIP_YOTPO_CACHE_TIME ); | |
return $result['response']['reviews']; | |
} | |
/** | |
* Get the 'average_score' and the 'total_reviews' of a product rated on Yotpo. | |
* | |
* @param int $product_id The WooCommerce product ID. | |
* | |
* @since 0.1.0 | |
* | |
* @return array|bool | |
*/ | |
function snip_yotpo_get_bottomline( $product_id ) { | |
$default = [ | |
'average_score' => '', | |
'total_reviews' => '', | |
]; | |
if ( ! function_exists( 'wc_yotpo_get_default_settings' ) ) { | |
return $default; | |
} | |
$transient_key = "snip/yotpo/prod/{$product_id}/bottomline"; | |
$cache = get_transient( $transient_key ); | |
if ( is_array( $cache ) ) { | |
return $cache; | |
} | |
if ( ! class_exists( 'Yotpo' ) ) { | |
$yotpo_dir = realpath( __DIR__ . '/../yotpo-social-reviews-for-woocommerce/lib/yotpo-api/' ); | |
$yotpo_file = trailingslashit( $yotpo_dir ) . 'Yotpo.php'; | |
if ( ! is_file( $yotpo_file ) ) { | |
return $default; | |
} | |
include( $yotpo_file ); | |
if ( ! class_exists( 'Yotpo' ) ) { | |
return $default; | |
} | |
} | |
$yotpo_settings = get_option( 'yotpo_settings', wc_yotpo_get_default_settings() ); | |
if ( ! isset( $yotpo_settings['secret'] ) || ! isset( $yotpo_settings['app_key'] ) ) { | |
return $default; | |
} | |
$secret = $yotpo_settings['secret']; | |
$app_key = $yotpo_settings['app_key']; | |
try { | |
$yotpo_api = new Yotpo( $app_key, $secret ); | |
$result = $yotpo_api->get_product_bottom_line( [ 'product_id' => $product_id, ] ); | |
} catch ( Exception $e ) { | |
return $default; | |
} | |
if ( ! isset( $result['response'] ) ) { | |
set_transient( $transient_key, $default, SNIP_YOTPO_CACHE_TIME ); | |
return false; | |
} | |
if ( ! isset( $result['response']['bottomline'] ) ) { | |
set_transient( $transient_key, $default, SNIP_YOTPO_CACHE_TIME ); | |
return false; | |
} | |
if ( ! is_array( $result['response']['bottomline'] ) ) { | |
set_transient( $transient_key, $default, SNIP_YOTPO_CACHE_TIME ); | |
return false; | |
} | |
$reviews = wp_parse_args( | |
$result['response']['bottomline'], | |
$default | |
); | |
set_transient( $transient_key, $reviews, SNIP_YOTPO_CACHE_TIME ); | |
return $reviews; | |
} | |
add_filter( 'wpbuddy/rich_snippets/fields/internal_subselect/values', 'snip_yotpo_subselects' ); | |
/** | |
* Adds new field to use in Global Snippets in the SNIP plugin. | |
* | |
* @param array $values | |
* | |
* @since 0.1.0 | |
* | |
* @return array | |
*/ | |
function snip_yotpo_subselects( $values ) { | |
if ( ! function_exists( 'wc_yotpo_get_default_settings' ) ) { | |
return $values; | |
} | |
$values['http://schema.org/Text'][] = array( | |
'id' => 'yotpo_average_score', | |
'label' => esc_html_x( 'Average Score (Yotpo)', 'subselect field', 'yotpo-snip' ), | |
'method' => 'snip_yotpo_average_score', | |
); | |
$values['http://schema.org/Integer'][] = array( | |
'id' => 'yotpo_average_score', | |
'label' => esc_html_x( 'Average Score (Yotpo)', 'subselect field', 'yotpo-snip' ), | |
'method' => 'snip_yotpo_average_score', | |
); | |
$values['http://schema.org/Text'][] = array( | |
'id' => 'yotpo_total_reviews', | |
'label' => esc_html_x( 'Total Reviews (Yotpo)', 'subselect field', 'yotpo-snip' ), | |
'method' => 'snip_yotpo_total_reviews', | |
); | |
$values['http://schema.org/Integer'][] = array( | |
'id' => 'yotpo_total_reviews', | |
'label' => esc_html_x( 'Total Reviews (Yotpo)', 'subselect field', 'yotpo-snip' ), | |
'method' => 'snip_yotpo_total_reviews', | |
); | |
$values['http://schema.org/Review'][] = array( | |
'id' => 'yotpo_reviews', | |
'label' => esc_html_x( 'Yotpo Review Comments', 'subselect field', 'yotpo-snip' ), | |
'method' => 'snip_yotpo_reviews', | |
); | |
return $values; | |
} | |
/** | |
* Returns the average score of a product rated on Yotpo. | |
* | |
* @param $val | |
* @param \wpbuddy\rich_snippets\Rich_Snippet $rich_snippet | |
* @param array $meta_info | |
* | |
* @return string | |
*/ | |
function snip_yotpo_average_score( $val, \wpbuddy\rich_snippets\Rich_Snippet $rich_snippet, array $meta_info ) { | |
$ratings = snip_yotpo_get_bottomline( $meta_info['current_post_id'] ); | |
if ( ! is_array( $ratings ) ) { | |
return ''; | |
} | |
return $ratings['average_score']; | |
} | |
/** | |
* Returns the total reviews of a product rated on Yotpo. | |
* | |
* @param $val | |
* @param \wpbuddy\rich_snippets\Rich_Snippet $rich_snippet | |
* @param array $meta_info | |
* | |
* @return string | |
*/ | |
function snip_yotpo_total_reviews( $val, \wpbuddy\rich_snippets\Rich_Snippet $rich_snippet, array $meta_info ) { | |
$ratings = snip_yotpo_get_bottomline( $meta_info['current_post_id'] ); | |
if ( ! is_array( $ratings ) ) { | |
return ''; | |
} | |
return $ratings['total_reviews']; | |
} | |
/** | |
* Returns a review object. | |
* | |
* @param $val | |
* @param \wpbuddy\rich_snippets\Rich_Snippet $rich_snippet | |
* @param array $meta_info | |
* | |
* @since 0.2.0 | |
* | |
* @return \stdClass[] | |
*/ | |
function snip_yotpo_reviews( $val, \wpbuddy\rich_snippets\Rich_Snippet $rich_snippet, array $meta_info ) { | |
if ( ! function_exists( '\wc_get_product' ) ) { | |
return []; | |
} | |
$comments = snip_yotpo_get_reviews( $meta_info['current_post_id'] ); | |
if ( ! is_array( $comments ) || count( $comments ) <= 0 ) { | |
return []; | |
} | |
$reviews = []; | |
foreach ( $comments as $comment ) { | |
$review = new \stdClass(); | |
$review->{'@context'} = 'http://schema.org'; | |
$review->{'@type'} = 'Review'; | |
$review->author = new \stdClass(); | |
$review->author->{'@context'} = 'http://schema.org'; | |
$review->author->{'@type'} = 'Person'; | |
$review->author->name = $comment['user']['display_name']; | |
$review->reviewRating = new \stdClass(); | |
$review->reviewRating->{'@context'} = 'http://schema.org'; | |
$review->reviewRating->{'@type'} = 'Rating'; | |
$review->reviewRating->bestRating = 5; | |
$review->reviewRating->worstRating = 1; | |
$review->reviewRating->ratingValue = max( 1, intval( $comment['score'] ) ); | |
$review->reviewBody = strip_tags( $comment['content'] ); | |
$review->datePublished = date_i18n( 'c', strtotime( $comment['created_at'] ) ); | |
$review->headline = strip_tags( $comment['title'] ); | |
$reviews[] = $review; | |
} | |
return $reviews; | |
} | |
add_action( 'save_post_wpb-rs-global', function ( $post_id ) { | |
global $wpdb; | |
$wpdb->query( | |
"DELETE FROM {$wpdb->options} WHERE option_name LIKE '%snip/yotpo/prod%'" | |
); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment