/home/ivoiecob/www/wp-content/plugins/wp-social-reviews/app/Hooks/Handlers/ShortcodeHandler.php
<?php
namespace WPSocialReviews\App\Hooks\Handlers;
use Exception;
use WPSocialReviews\App\Models\Review;
use WPSocialReviews\App\Services\Platforms\Feeds\Facebook\FacebookFeed;
use WPSocialReviews\App\Services\Platforms\Feeds\Youtube\YoutubeFeed;
use WPSocialReviews\App\Services\Platforms\Reviews\Helper;
use WPSocialReviews\App\Services\Helper as GlobalHelper;
use WPSocialReviews\App\Services\Platforms\Feeds\Facebook\Helper as FacebookHelper;
use WPSocialReviews\App\Services\Platforms\Feeds\Config;
use WPSocialReviews\App\Services\Platforms\Feeds\Twitter\TwitterFeed;
use WPSocialReviews\App\Services\Platforms\Feeds\Instagram\InstagramFeed;
use WPSocialReviews\Framework\Database\Orm\Collection;
use WPSocialReviews\Framework\Foundation\App;
use WPSocialReviews\Framework\Support\Arr;
use WPSocialReviews\App\Services\GlobalSettings;
use WPSocialReviews\App\Services\Platforms\ReviewImageOptimizationHandler;
class ShortcodeHandler
{
private $feedJson;
private $popupSettings;
private $additionalSettings;
private $uniqueId = null;
private $scripts = [];
public $platform = '';
public $imageSettings = [];
public function addShortcode()
{
add_shortcode('wp_social_ninja', array($this, 'makeShortcode'));
// add_shortcode('wp_social_ninja_wall_feed', array($this, 'makeSocialWallFeedShortcode'));
add_action('wp_enqueue_scripts', array($this, 'registerScripts'), 999);
add_action('wp_social_ninja_add_layout_script', array($this, 'enqueueScripts'));
}
public function makeShortcode($args = [], $content = null, $tag = '')
{
// Skip processing during Elementor save/editor to prevent memory exhaustion
if (defined('ELEMENTOR_VERSION')) {
// skip during REST API requests when Elementor is active (block editor compatibility)
if (defined('REST_REQUEST') && REST_REQUEST) {
return '';
}
}
$args = shortcode_atts(array(
'id' => '',
'platform' => ''
), $args);
if (!$args['id']) {
return '';
}
$platform = Arr::get($args, 'platform', '');
$platform = sanitize_text_field($platform);
if (empty($platform) || empty($args['id'])) {
return __('Please, set a template platform name or template id on your shortcode', 'wp-social-reviews');
}
$templateId = absint($args['id']);
if (!in_array($platform, GlobalHelper::shortcodeAllowedPlatforms())) {
return __('Provided platform name is not valid.', 'wp-social-reviews');
}
$this->platform = $platform;
if (!did_action('wp_enqueue_scripts')) {
$this->registerStyles();
}
$this->enqueueStyles([$this->platform]);
$platformName = $platform === 'facebook_feed' ? 'Facebook' : $platform;
$methodName = str_replace('_', ucfirst($platformName), 'render_Template');
$optimize_platform = $platform == 'testimonial' ? 'reviews' : $platform;
$this->imageSettings = Helper::getImageSettings($optimize_platform);
if ($platformName === 'tiktok') {
return apply_filters('wpsocialreviews/render_tiktok_template', $templateId, $platform);
} else {
return $this->{$methodName}($templateId, $platform);
}
}
public function templateMeta($templateId, $platform)
{
$this->platform = $platform;
$encodedMeta = get_post_meta($templateId, '_wpsr_template_config', true);
$template_meta = json_decode($encodedMeta, true);
if (!$template_meta || empty($template_meta)) {
return ['error_message' => __('No template is available for this shortcode!!', 'wp-social-reviews')];
}
$error_message = __('Please set a template platform name on your shortcode', 'wp-social-reviews');
if ($platform === 'reviews' || $platform === 'testimonial') {
$template_meta = Helper::formattedTemplateMeta($template_meta);
if (empty($template_meta['platform'])) {
return [
'error_message' => $error_message
];
}
} elseif ($platform === 'twitter') {
$configs = Arr::get($template_meta, 'feed_settings', []);
$template_meta = Config::formatTwitterConfig($configs, []);
} elseif ($platform === 'youtube') {
$configs = Arr::get($template_meta, 'feed_settings', []);
$template_meta = Config::formatYoutubeConfig($configs, []);
} elseif ($platform === 'instagram') {
$configs = Arr::get($template_meta, 'feed_settings', []);
$template_meta = Config::formatInstagramConfig($configs, []);
} elseif ($platform === 'facebook_feed') {
$configs = Arr::get($template_meta, 'feed_settings', []);
$template_meta = Config::formatFacebookConfig($configs, []);
} else {
$configs = Arr::get($template_meta, 'feed_settings', []);
$template_meta = apply_filters('wpsocialreviews/format_'. $platform .'_config', $configs, []);
}
if (($platform !== 'reviews' && $platform !== 'testimonial') && !Arr::get($template_meta, 'feed_settings.platform')) {
return [
'error_message' => $error_message
];
}
return $template_meta;
}
public function reviewsTemplatePath($template = '')
{
$templateMapping = [
'grid1' => 'public.reviews-templates.template1',
'grid2' => 'public.reviews-templates.template2',
'grid3' => 'public.reviews-templates.template3',
'grid4' => 'public.reviews-templates.template4',
'grid5' => 'public.reviews-templates.template5',
];
if (!isset($templateMapping[$template])) {
return [
'error_message' => __('You need to upgrade to pro to use this template!', 'wp-social-reviews')
];
}
return $templateMapping[$template];
}
public function renderTestimonialTemplate($templateId, $platform)
{
return $this->renderReviewsTemplate($templateId, $platform);
}
public function renderReviewsTemplate($templateId, $platform)
{
$app = App::getInstance();
$template_meta = $this->templateMeta($templateId, $platform);
$html = '';
$platforms = Arr::get($template_meta, 'platform', []);
$badge_settings = Arr::get($template_meta, 'badge_settings', []);
$selectedBusinesses = Arr::get($template_meta, 'selectedBusinesses', []);
$business_info = $this->getRelevantBusinessInfo($platforms, $selectedBusinesses, $templateId);
$validTemplatePlatforms = Helper::validPlatforms($platforms);
$templateType = Arr::get($template_meta, 'templateType');
$connected_account_ids = array_keys(Arr::get($business_info, 'platforms', []));
if (in_array('facebook', $validTemplatePlatforms)) {
$accountsLists = get_option('wpsr_reviews_facebook_settings', []);
$connected_ids = array_keys($accountsLists);
$account_ids = $connected_ids;
if (!empty($account_ids)) {
$account_ids = array_intersect($selectedBusinesses, $connected_ids);
}
do_action('wpsocialreviews/before_display_facebook', $account_ids);
}
$translations = GlobalSettings::getTranslations();
$reviews = array();
$totalReviews = 0;
$data = [];
if (!empty($validTemplatePlatforms)) {
$template_meta = $this->processTemplateMetaForWooCommerce($template_meta, $templateId);
$data = Review::paginatedReviews($validTemplatePlatforms, $template_meta);
$reviews = $data['reviews'];
if (defined('WC_PLUGIN_FILE')) {
$reviews = Helper::trimProductTitle($reviews);
}
$totalReviews = $data['total_reviews'];
}
$optimize_platform = $platform == 'testimonial' ? 'reviews' : $platform;
if (!isset($this->imageSettings['optimized_images'])) {
$this->imageSettings = Helper::getImageSettings($optimize_platform);
}
$optimized_image = Arr::get($this->imageSettings, 'optimized_images', 'false');
$has_gdpr = Arr::get($this->imageSettings, 'has_gdpr', "false");
$errors = Arr::get($data, 'errors');
if ($has_gdpr == "true" && $optimized_image == "false" && $templateType != 'notification') {
$reviews = [];
$errors = (new ReviewImageOptimizationHandler([$platform]))->getOptimizeErrorMessage();
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $errors);
}
if ($errors && in_array('facebook', $validTemplatePlatforms)) {
$html .= apply_filters('wpsocialreviews/display_frontend_error_message', 'facebook', $errors, $connected_account_ids);
}
$template = Arr::get($template_meta, 'template', '');
if ((empty($template) || empty($reviews)) && $templateType != 'notification') {
$error_message = __('Sorry! We could not get any reviews', 'wp-social-reviews');
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message);
}
$this->enqueueScripts();
$resizedImages = [];
if ($optimized_image === 'true') {
$imageHandlerObj = new ReviewImageOptimizationHandler($platforms);
$resizedImages = $imageHandlerObj->getResizeNeededImageLists($reviews);
if ($platform != 'testimonial' && count($resizedImages) < count($reviews)) {
wp_enqueue_script('wpsr-reviews-image-resizer');
}
}
$imageSize = Arr::get($template_meta, 'resolution', 'full');
$reviews = Helper::mediaUrlManage('reviews', $resizedImages, $this->imageSettings, $imageSize, $reviews, $optimized_image); // hardcode 'reviews' denotes its a platform
$reviews = Helper::handleReviewerName($reviews, $template_meta);
$hasReviewImage = Helper::hasReviewImages($reviews);
if ($templateType === 'badge') {
if (empty($business_info)) {
return $html;
}
$html .= apply_filters('wpsocialreviews/add_reviews_badge_template', $templateId, $templateType,
$business_info, $badge_settings);
if (Arr::get($badge_settings, 'display_mode') !== 'popup') {
return $html;
}
}
if ($templateType === 'notification') {
$html .= apply_filters('wpsocialreviews/add_reviews_notification_template', $templateId, $template_meta,
$reviews);
$this->enqueueNotificationScripts();
}
if($hasReviewImage){
$this->enqueuePopupScripts();
}
$hookType = $templateType;
if ($hookType == 'slider') {
$hookType = 'carousel';
}
do_action('wp_social_review_loading_layout_' . $hookType, $templateId, $template_meta);
do_action('wpsocialreviews/load_template_assets', $templateId);
$html .= $app->view->make('public.reviews-templates.header', array(
'template_meta' => $template_meta,
'templateType' => $templateType,
'reviews' => $reviews,
'business_info' => $business_info,
'templateId' => $templateId,
'translations' => $translations,
'platforms' => $platforms,
));
$proAvailable = defined('WPSOCIALREVIEWS_PRO');
if(
$proAvailable &&
class_exists('\WPSocialReviewsPro\App\Services\AI\AIReviewSummarizerHelper')
){
$aiSummaryEnabled = Arr::get($template_meta, 'ai_summary.enabled', 'false');
// Check if AI summarizer is globally enabled and properly configured
$isAIConfigured = \WPSocialReviewsPro\App\Services\AI\AIReviewSummarizerHelper::isAIModelAndApikeySet();
// Also check if AI summarizer is globally enabled
$advanceSettings = (new GlobalSettings())->getGlobalSettings('advance_settings');
$isGloballyEnabled = Arr::get($advanceSettings, 'ai_review_summarizer_enabled', 'false') === 'true';
if($reviews instanceof Collection && $aiSummaryEnabled !== 'false' && $isAIConfigured && $isGloballyEnabled){
try {
$aiSummaryData = \WPSocialReviewsPro\App\Services\AI\AIReviewSummarizerHelper::addAiSummaryToReviewArray($reviews, $templateId, $template_meta);
$reviews = Arr::get($aiSummaryData, 'reviews');
} catch (Exception $e) {
// in the case of shortcodes we should not show the error message
// it depends on the leads decision.
//error_log($e->getMessage());
}
}
}
$templates = ['grid1', 'grid2', 'grid3', 'grid4', 'grid5'];
if (!in_array($template, $templates) && defined('WPSOCIALREVIEWS_PRO')) {
$html .= apply_filters('wpsocialreviews/add_reviews_template', $template, $reviews, $template_meta, $business_info);
} else {
$templatePath = $this->reviewsTemplatePath($template);
if (!empty($templatePath['error_message'])) {
return $templatePath['error_message'] . '<br/>';
}
$html .= $app->view->make($templatePath, array(
'reviews' => $reviews,
'template_meta' => $template_meta,
'business_info' => $business_info
));
}
$html .= $app->view->make('public.reviews-templates.footer', array(
'templateId' => $templateId,
'totalReviews' => $totalReviews,
'template_meta' => $template_meta,
'templateType' => $templateType,
'reviews' => $reviews,
'business_info' => $business_info,
'translations' => $translations
));
return $html;
}
public function processTemplateMetaForWooCommerce($template_meta, $template_id = null){
// Check if Social ninja Pro is available
if(defined('WPSOCIALREVIEWS_PRO') && class_exists('\WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper')){
$wooContext = \WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper::isWooCommerceProductContext();
$product_id = $wooContext['product_id'];
$effectiveSettings = \WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper::getEffectiveSettings($product_id);
$woocommerceTemplate = intval( Arr::get($effectiveSettings, 'selected_template', null) );
if($woocommerceTemplate !== $template_id){
return $template_meta;
}
// Get WooCommerce-specific template meta if applicable
$wooTemplate = \WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper::getRelevantReviewsForProduct($template_meta);
if($wooTemplate){
$template_meta = $wooTemplate;
}
}
return $template_meta;
}
public function getRelevantBusinessInfo($platforms, $selectedBusinesses, $templateId = null){
// Check if WooCommerce Pro is available
if(defined('WPSOCIALREVIEWS_PRO') && class_exists('\WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper')){
$wooContext = \WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper::isWooCommerceProductContext();
$product_id = $wooContext['product_id'];
$effectiveSettings = \WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper::getEffectiveSettings($product_id);
$woocommerceTemplate = intval( Arr::get($effectiveSettings, 'selected_template', null) );
// Get WooCommerce-specific business info if applicable
$wooBusinessInfo = \WPSocialReviewsPro\App\Services\Platforms\Reviews\WooCommerce\WooCommerceHelper::getRelevantBusinessInfoForProduct();
if($wooBusinessInfo && $wooBusinessInfo['use_product_info'] && ($woocommerceTemplate === $templateId)){
return Helper::getSelectedBusinessInfoByPlatforms($platforms, [$wooBusinessInfo['product_id']]);
}
}
return Helper::getSelectedBusinessInfoByPlatforms($platforms, $selectedBusinesses);
}
public function renderTwitterTemplate($templateId, $platform)
{
if(defined('WPSOCIALREVIEWS_PRO_VERSION') && version_compare(WPSOCIALREVIEWS_PRO_VERSION, '3.10.0', '<=')){
return 'You are using old version of WP Social Ninja Pro. Please update it to the latest version from your plugins list to ensure your feed functions properly.';
}
// Clear LiteSpeed cache if plugin is active
if (defined('LSCWP_V')) {
do_action('litespeed_tag_add', 'wpsn_purge_twitter_feed'); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
}
$app = App::getInstance();
$template_meta = $this->templateMeta($templateId, $platform);
if (!empty($template_meta['error_message'])) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $template_meta['error_message']);
}
$feed = (new TwitterFeed())->getTemplateMeta($template_meta, $templateId);
$settings = $this->formatFeedSettings($feed, $platform);
$error_message = Arr::get($feed, 'error_message');
if ($error_message) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message);
}
//pagination settings
$pagination_settings = $this->formatPaginationSettings($feed, $platform);
if (Arr::get($settings['feed_settings'], 'advance_settings.tweet_action_target') === 'popup') {
$this->makePopupModal(Arr::get($settings, 'dynamic.items', []), Arr::get($settings, 'dynamic.header', []), $settings['feed_settings'], $templateId, $platform);
do_action('wp_social_review_loading_layout_carousel', $templateId, $settings);
}
if (Arr::get($settings['feed_settings'], 'pagination_settings.pagination_type') != 'none') {
$this->enqueueScripts();
}
$layout = Arr::get($settings, 'feed_settings.layout_type');
if ($layout) {
do_action('wp_social_review_loading_layout_' . $layout, $templateId, $settings);
}
if (Arr::get($settings, 'feed_settings.advance_settings.tweet_action_target') == 'popup') {
$this->enqueuePopupScripts();
}
$template_body_data = [
'templateId' => $templateId,
'wpsr_feeds' => Arr::get($settings, 'dynamic.items', []),
'template_meta' => $settings['feed_settings'],
'paginate' => $pagination_settings['paginate'],
'total' => $pagination_settings['total'],
'sinceId' => $pagination_settings['sinceId'],
'maxId' => $pagination_settings['maxId'],
];
$translations = GlobalSettings::getTranslations();
do_action('wpsocialreviews/load_template_assets', $templateId);
$html = '';
$html .= $app->view->make('public.feeds-templates.twitter.header', [
'templateId' => $templateId,
'header' => Arr::get($settings, 'dynamic.header', []),
'feed_settings' => $settings['feed_settings'],
'column_gaps' => $settings['column_gaps'],
'layout_type' => $settings['layout_type'],
'pagination_type' => $pagination_settings['pagination_type'],
'translations' => $translations
]);
if ($settings['layout_type'] !== 'standard' && defined('WPSOCIALREVIEWS_PRO')) {
$html .= apply_filters('wpsocialreviews/add_twitter_template', $template_body_data);
} else {
$html .= $app->view->make('public.feeds-templates.twitter.template1', $template_body_data);
}
$html .= $app->view->make('public.feeds-templates.twitter.footer', [
'templateId' => $templateId,
'header' => Arr::get($settings, 'dynamic.header', []),
'feed_settings' => $settings['feed_settings'],
'column_gaps' => $settings['column_gaps'],
'layout_type' => $settings['layout_type'],
'paginate' => $pagination_settings['paginate'],
'total' => $pagination_settings['total'],
'pagination_type' => $pagination_settings['pagination_type']
]);
return $html;
}
public function renderYoutubeTemplate($templateId, $platform)
{
$app = App::getInstance();
$template_meta = $this->templateMeta($templateId, $platform);
if (!empty($template_meta['error_message'])) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $template_meta['error_message']);
}
$feed = (new YoutubeFeed())->getTemplateMeta($template_meta, $templateId);
$feed_info = Arr::get($feed, 'feed_info', []);
$settings = $this->formatFeedSettings($feed);
$error_message = Arr::get($settings['dynamic'], 'error_message');
if (Arr::get($error_message, 'error_message')) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message['error_message']);
} elseif ($error_message) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message);
}
//pagination settings
$pagination_settings = $this->formatPaginationSettings($feed);
$template = Arr::get($settings['feed_settings'], 'template', '');
// render template 1, template 2, template 3 from template 1
$template = !defined('WPSOCIALREVIEWS_PRO') && ($template === 'template2' || $template === 'template3') ? 'template1' : $template;
$layout = Arr::get($settings, 'feed_settings.layout_type');
if ($layout) {
do_action('wp_social_review_loading_layout_' . $layout, $templateId, $settings);
}
$this->enqueuePopupScripts();
//if (Arr::get($settings['feed_settings'], 'pagination_settings.pagination_type') != 'none') {
$this->enqueueScripts();
// }
$translations = GlobalSettings::getTranslations();
$global_settings = get_option('wpsr_youtube_global_settings');
$advanceSettings = (new GlobalSettings())->getGlobalSettings('advance_settings');
$hasLatestPost = Arr::get($settings, 'dynamic.has_latest_post', false);
$feeds = Arr::get($settings, 'dynamic.items', []);
$image_settings = [
'optimized_images' => Arr::get($global_settings, 'global_settings.optimized_images', 'false'),
'has_gdpr' => Arr::get($advanceSettings, 'has_gdpr', "false")
];
if (!isset($settings['header']) || !is_array($settings['header'])) {
$settings['header'] = [];
$settings['header']['avatar'] = '';
$settings['header']['cover'] = '';
}
$dp = $image_settings['optimized_images'] === 'true' ? Arr::get($settings, 'header.avatar.local_avatar', '') : Arr::get($settings, 'header.items.0.snippet.thumbnails.high.url', '');
$cover = $image_settings['optimized_images'] === 'true' ? Arr::get($settings, 'header.covers.local_cover', '') : Arr::get($settings, 'header.items.0.brandingSettings.image.bannerExternalUrl', '');
$settings['header']['avatar'] = $dp;
$settings['header']['cover'] = $cover;
$resizedImages = Arr::get($settings, 'dynamic.resize_data', []);
if(Arr::get($image_settings, 'optimized_images', 'false') === 'true' && (count($resizedImages) < count($feeds) || $hasLatestPost)) {
wp_enqueue_script('wpsr-image-resizer');
}
do_action('wpsocialreviews/load_template_assets', $templateId);
$html = '';
$html .= $app->view->make('public.feeds-templates.youtube.header', array(
'template' => $template,
'templateId' => $templateId,
'header' => $settings['header'],
'feeds' => $settings['feeds'],
'feed_settings' => $settings['feed_settings'],
'image_settings' => $image_settings,
'paginate' => $pagination_settings['paginate'],
'pagination_type' => $pagination_settings['pagination_type'],
'total' => $pagination_settings['total'],
'translations' => $translations
));
$html .= $app->view->make('public.feeds-templates.youtube.template1', array(
'templateId' => $templateId,
'feeds' => $settings['feeds'],
'feed_info' => $feed_info,
'template_meta' => $settings['feed_settings'],
'total' => $pagination_settings['total'],
'sinceId' => $pagination_settings['sinceId'],
'maxId' => $pagination_settings['maxId'],
));
$html .= $app->view->make('public.feeds-templates.youtube.footer', array(
'templateId' => $templateId,
'header' => $settings['header'],
'feed_settings' => $settings['feed_settings'],
'column_gaps' => $settings['column_gaps'],
'layout_type' => $settings['layout_type'],
'paginate' => $pagination_settings['paginate'],
'pagination_type' => $pagination_settings['pagination_type'],
'total' => $pagination_settings['total'],
));
return $html;
}
public function renderFacebookTemplate($templateId, $platform)
{
// Clear LiteSpeed cache if plugin is active
if (defined('LSCWP_V')) {
do_action('litespeed_tag_add', 'wpsn_purge_facebook_feed'); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
}
$app = App::getInstance();
$template_meta = $this->templateMeta($templateId, $platform);
$account_ids = Arr::get($template_meta, 'feed_settings.source_settings.selected_accounts');
do_action('wpsocialreviews/before_display_facebook_feed', $account_ids);
if (!empty($template_meta['error_message'])) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $template_meta['error_message']);
}
$feed = (new FacebookFeed())->getTemplateMeta($template_meta, $templateId);
$settings = $this->formatFeedSettings($feed);
$feeds = Arr::get($settings, 'feeds', []);
if (Arr::get($feed , 'feed_settings.source_settings.feed_type') === 'album_feed') {
$this->enqueueAlbumScripts();
}
$template = Arr::get($settings, 'feed_settings.template', '');
$layout = Arr::get($settings, 'feed_settings.layout_type');
do_action('wp_social_review_loading_layout_' . $layout, $templateId, $settings);
//pagination settings
$pagination_settings = $this->formatPaginationSettings($feed);
$translations = GlobalSettings::getTranslations();
$hasLatestPost = Arr::get($settings, 'dynamic.has_latest_post', false);
//header logo and cover update
$global_settings = get_option('wpsr_facebook_feed_global_settings');
$advanceSettings = (new GlobalSettings())->getGlobalSettings('advance_settings');
$image_settings = [
'optimized_images' => Arr::get($global_settings, 'global_settings.optimized_images', 'false'),
'has_gdpr' => Arr::get($advanceSettings, 'has_gdpr', "false")
];
if($image_settings['optimized_images'] == 'true'){
$cover = Arr::get($settings, 'header.covers.local_cover');
$logo = Arr::get($settings, 'header.avatar.local_avatar');
}else{
$cover = Arr::get($settings, 'header.cover.source');
$logo = Arr::get($settings, 'header.picture.data.url');
}
$settings['header']['logo'] = $logo;
$settings['header']['cover'] = $cover;
if (Arr::get($settings['feed_settings'], 'post_settings.display_mode') === 'popup') {
$hasMulti = false;
$display_wp_date_format = Arr::get($settings, 'feed_settings.post_settings.display_wp_date_format', 'false');
foreach ($feeds as $index => $feed) {
$comments_text = Arr::get($translations, 'comments') ?: __('Comments', 'wp-social-reviews');
$comment_total_count = Arr::get($feed, 'comments.summary.total_count');
$feeds[$index]['comments_count'] = $comment_total_count > 0 ? GlobalHelper::shortNumberFormat($comment_total_count) .' '. $comments_text : '';
$feeds[$index]['react_count'] = FacebookHelper::getTotalFeedReactions($feed);
$feed_type = Arr::get($settings, 'feed_settings.source_settings.feed_type');
$subAttachments = Arr::get($feed, 'attachments.data.0.subattachments.data');
if (!$hasMulti && $subAttachments) {
$hasMulti = true;
}
}
$this->makePopupModal($feeds, $settings['header'], $settings['feed_settings'], $templateId, $platform);
$this->enqueuePopupScripts();
if ($hasMulti) {
do_action('wp_social_review_loading_layout_carousel', $templateId, $settings);
}
}
// if(Arr::get($settings['feed_settings'], 'pagination_settings.pagination_type') != 'none') {
$this->enqueueScripts();
//}
//enable when gdpr is on
$resizedImages = Arr::get($settings, 'dynamic.resize_data', []);
if(Arr::get($this->imageSettings, 'optimized_images', 'false') === 'true' && (count($resizedImages) < count($feeds) || $hasLatestPost)) {
wp_enqueue_script('wpsr-image-resizer');
}
if (Arr::get($this->imageSettings, 'optimized_images', 'false') === 'true' || Arr::get($settings['feed_settings'], 'pagination_settings.pagination_type') != 'none' || Arr::get($settings['feed_settings'], 'post_settings.display_mode') === 'popup') {
$this->enqueueScripts();
}
do_action('wpsocialreviews/load_template_assets', $templateId);
$html = '';
$error_message = Arr::get($settings, 'dynamic.error_message');
if (Arr::get($error_message, 'error_message')) {
$html .= apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message['error_message'], $account_ids);
} elseif ($error_message) {
$html .= apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message, $account_ids);
}
$imageResolution = Arr::get($settings, 'feed_settings.post_settings.resolution');
$display_mode = Arr::get($settings, 'feed_settings.post_settings.display_mode');
$display_optimized_image = Arr::get($image_settings, 'optimized_images', 'false');
$has_gdpr = Arr::get($image_settings, 'has_gdpr', 'false');
$feed_type = Arr::get($settings, 'feed_settings.source_settings.feed_type');
$template_body_data = [
'templateId' => $templateId,
'feeds' => $feeds,
'template_meta' => $settings['feed_settings'],
'paginate' => $pagination_settings['paginate'],
'sinceId' => $pagination_settings['sinceId'],
'maxId' => $pagination_settings['maxId'],
'pagination_settings' => $pagination_settings,
'translations' => $translations,
'image_settings' => $image_settings,
'imageResolution' => $imageResolution,
'display_mode' => $display_mode,
'display_optimized_image' => $display_optimized_image,
'has_gdpr' => $has_gdpr,
'feed_type' => $feed_type
];
$html .= $app->view->make('public.feeds-templates.facebook.header', array(
'templateId' => $templateId,
'template' => $template,
'header' => $settings['header'],
'feed_settings' => $settings['feed_settings'],
'layout_type' => $settings['layout_type'],
'column_gaps' => $settings['column_gaps'],
'translations' => $translations
));
if (defined('WPSOCIALREVIEWS_PRO') && $template !== 'template1') {
$html .= apply_filters('wpsocialreviews/add_facebook_feed_template', $template_body_data);
} else {
$html .= $app->view->make('public.feeds-templates.facebook.template1', $template_body_data);
}
$html .= $app->view->make('public.feeds-templates.facebook.footer', array(
'templateId' => $templateId,
'feeds' => $feeds,
'feed_settings' => $settings['feed_settings'],
'layout_type' => $settings['layout_type'],
'column_gaps' => $settings['column_gaps'],
'paginate' => $pagination_settings['paginate'],
'pagination_type' => $pagination_settings['pagination_type'],
'header' => $settings['header'],
'total' => $pagination_settings['total'],
));
return $html;
}
public function renderInstagramTemplate($templateId, $platform)
{
$html = '';
// Clear LiteSpeed cache if plugin is active
if (defined('LSCWP_V')) {
do_action('litespeed_tag_add', 'wpsn_purge_instagram'); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
}
$app = App::getInstance();
$template_meta = $this->templateMeta($templateId, $platform);
$account_ids = Arr::get($template_meta, 'feed_settings.source_settings.account_ids');
do_action('wpsocialreviews/before_display_instagram_feed', $account_ids);
if (!empty($template_meta['error_message'])) {
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $template_meta['error_message']);
}
$feed = (new InstagramFeed())->getTemplateMeta($template_meta, $templateId);
$settings = $this->formatFeedSettings($feed);
//template mapping
$templateMapping = [
'template1' => 'public.feeds-templates.instagram.template1',
'template2' => 'public.feeds-templates.instagram.template2',
];
$template = Arr::get($settings['feed_settings'], 'template', '');
if (!isset($templateMapping[$template])) {
$error_message = __('No templates found!! Please save and try again', 'wp-social-reviews');
return apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message);
}
$file = $templateMapping[$template];
$layout = Arr::get($settings, 'feed_settings.layout_type');
do_action('wp_social_review_loading_layout_' . $layout, $templateId, $settings);
//pagination settings
$pagination_settings = $this->formatPaginationSettings($feed);
$translations = GlobalSettings::getTranslations();
$feeds = Arr::get($settings, 'dynamic.items', []);
$hasLatestPost = Arr::get($settings, 'dynamic.has_latest_post', false);
if (Arr::get($settings['feed_settings'], 'post_settings.display_mode') === 'popup') {
$hasMulti = false;
foreach ($feeds as $index => $feed) {
/* translators: %s: Human-readable time difference. */
$feeds[$index]['time_ago'] = sprintf(__('%s ago', 'wp-social-reviews'), human_time_diff(strtotime(Arr::get($feed, 'timestamp'))));
if (isset($feed['comments'])) {
foreach ($feed['comments'] as $commentIndex => $comment) {
// translators: Please retain the placeholders (%s, %d, etc.) and ensure they are correctly used in context.
$feeds[$index]['comments'][$commentIndex]['time_ago'] = sprintf(__('%s ago', 'wp-social-reviews'), human_time_diff(strtotime($comment['timestamp'])));
}
}
if (!$hasMulti && isset($feed['children'])) {
$hasMulti = true;
}
}
$this->makePopupModal($feeds, $settings['header'], $settings['feed_settings'], $templateId, $platform);
$this->enqueuePopupScripts();
if ($hasMulti) {
do_action('wp_social_review_loading_layout_carousel', $templateId, $settings);
}
}
//enable when gdpr is on
$resizedImages = Arr::get($settings, 'dynamic.resize_data', []);
if(Arr::get($this->imageSettings, 'optimized_images', 'false') === 'true' && (count($resizedImages) < count($feeds) || $hasLatestPost)) {
wp_enqueue_script('wpsr-image-resizer');
}
if (Arr::get($this->imageSettings, 'optimized_images', 'false') === 'true' || Arr::get($settings['feed_settings'], 'pagination_settings.pagination_type') != 'none' || Arr::get($settings['feed_settings'], 'post_settings.display_mode') === 'popup') {
$this->enqueueScripts();
}
do_action('wpsocialreviews/load_template_assets', $templateId);
$settings = apply_filters('wpsocialreviews/get_shoppable_feeds', $settings);
if(defined('WPSOCIALREVIEWS_PRO') && class_exists('\WPSocialReviewsPro\App\Services\Platforms\Feeds\Shoppable')){
$settings = (new \WPSocialReviewsPro\App\Services\Platforms\Feeds\Shoppable())->makeShoppableFeeds($settings, 'instagram');
}
$error_message = Arr::get($settings, 'dynamic.error_message');
$hashtags = Arr::get($settings, 'feed_settings.source_settings.hash_tags');
if (Arr::get($error_message, 'error_message')) {
$html .= apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message['error_message'], $account_ids, $hashtags);
} else {
$html .= apply_filters('wpsocialreviews/display_frontend_error_message', $platform, $error_message, $account_ids, $hashtags);
}
$html .= $app->view->make('public.feeds-templates.instagram.header', array(
'templateId' => $templateId,
'template' => $template,
'header' => $settings['header'],
'feed_settings' => $settings['feed_settings'],
'layout_type' => $settings['layout_type'],
'column_gaps' => $settings['column_gaps'],
'translations' => $translations,
));
if(!empty($feeds)) {
$html .= $app->view->make($file, array(
'templateId' => $templateId,
'feeds' => $feeds,
'template_meta' => $settings['feed_settings'],
'sinceId' => $pagination_settings['sinceId'],
'maxId' => $pagination_settings['maxId'],
'image_settings' => $this->imageSettings
));
}
$html .= $app->view->make('public.feeds-templates.instagram.footer',
array(
'templateId' => $templateId,
'feeds' => $feeds,
'feed_settings' => $settings['feed_settings'],
'layout_type' => $settings['layout_type'],
'column_gaps' => $settings['column_gaps'],
'paginate' => $pagination_settings['paginate'],
'pagination_type' => $pagination_settings['pagination_type'],
'total' => $pagination_settings['total'],
));
return $html;
}
public function formatFeedSettings($feed = [], $platform = '')
{
$feed_settings = Arr::get($feed, 'feed_settings', []);
$filterSettings = Arr::get($feed_settings, 'filters', []);
$dynamic = Arr::get($feed, 'dynamic', $feed);
$feeds = Arr::get($dynamic, 'items', []);
if ($platform === 'twitter') {
$header = Arr::get($feed, 'header', []);
$layout_type = Arr::get($feed_settings, 'layout_type', 'standard');
} else {
$header = Arr::get($dynamic, 'header', []);
$layout_type = Arr::get($feed_settings, 'layout_type', 'grid');
}
$column_gaps = Arr::get($feed_settings, 'column_gaps', 'default');
return [
'feeds' => $feeds,
'header' => $header,
'feed_settings' => $feed_settings,
'filter_settings' => $filterSettings,
'layout_type' => $layout_type,
'column_gaps' => $layout_type !== 'carousel' ? $column_gaps : null,
'dynamic' => $dynamic,
];
}
public function formatPaginationSettings($feed = [], $platform = '')
{
$settings = $this->formatFeedSettings($feed);
$sinceId = 0;
// Get responsive paginate_number if available (for Instagram and other feeds)
$paginateNumber = Arr::get($settings, 'feed_settings.pagination_settings.paginate_number', []);
$fallbackPaginate = intval(Arr::get($settings, 'feed_settings.pagination_settings.paginate', 6));
// Use responsive paginate_number if available, otherwise fall back to paginate
if (!empty($paginateNumber)) {
$paginate = wp_is_mobile()
? (int) Arr::get($paginateNumber, 'mobile', $fallbackPaginate)
: (int) Arr::get($paginateNumber, 'desktop', $fallbackPaginate);
} else {
$paginate = $fallbackPaginate;
}
$maxId = ($sinceId + $paginate) - 1;
$totalFeed = is_array($settings['feeds']) ? count($settings['feeds']) : 0;
$numOfFeeds = Arr::get($settings, 'filter_settings.total_posts_number');
$totalFilterFeed = wp_is_mobile() ? Arr::get($numOfFeeds, 'mobile') : Arr::get($numOfFeeds, 'desktop');
$total = (int)($totalFilterFeed && $totalFeed < $totalFilterFeed) ? $totalFeed : $totalFilterFeed;
$pagination_type = Arr::get($settings['feed_settings'], 'pagination_settings.pagination_type', 'none');
if ($settings['layout_type'] === 'carousel' || $pagination_type === 'none') {
$maxId = $totalFeed;
}
return [
'sinceId' => $sinceId,
'maxId' => $maxId,
'paginate' => $paginate,
'total' => $total,
'pagination_type' => $pagination_type,
];
}
public function loadPopupScripts()
{
foreach ($this->scripts as $script) {
$platform = Arr::get($script, 'platform_name');
$platform = $platform === 'facebook_feed' ? 'FacebookFeed' : $platform;
$prefix = 'WPSR_';
$frontEndJson = str_replace('_', $prefix . ucfirst($platform), '_FrontEndJson');
$popupSettings = str_replace('_', $prefix . ucfirst($platform), '_PopupSettings');
$additionalSettings = str_replace('_', $prefix . ucfirst($platform), '_AdditionalSettings');
?>
<script type="text/javascript" id="wpsr-popup-script">
if (!window.<?php echo esc_js($frontEndJson); ?>) {
window.<?php echo esc_js($frontEndJson); ?> = {};
}
if (!window.<?php echo esc_js($popupSettings); ?>) {
window.<?php echo esc_js($popupSettings); ?> = {};
}
if (!window.<?php echo esc_js($additionalSettings); ?>) {
window.<?php echo esc_js($additionalSettings); ?> = {};
}
window.<?php echo esc_js($frontEndJson); ?>["<?php echo esc_js($script['uniqueId']); ?>"] = <?php echo GlobalHelper::printInternalString($script['feedJson']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>;
window.<?php echo esc_js($popupSettings); ?>["<?php echo esc_js($script['uniqueId']); ?>"] = <?php echo GlobalHelper::printInternalString($script['popupSettings']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>;
window.<?php echo esc_js($additionalSettings); ?>["<?php echo esc_js($script['uniqueId']); ?>"] = <?php echo GlobalHelper::printInternalString($script['additionalSettings']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>;
</script>
<?php
}
}
public function makePopupModal($feeds = [], $header = [], $feed_settings = [], $templateId = null, $platform = '')
{
$popupSettings = Arr::get($feed_settings, 'popup_settings', []);
$headerSettings = Arr::get($feed_settings, 'header_settings', []);
//set all data, settings for popup
$additionalSettings = array(
'header_settings' => $headerSettings
);
if ($platform === 'instagram') {
$additionalSettings['assets_url'] = WPSOCIALREVIEWS_URL . 'assets';
$additionalSettings['user_avatar'] = Arr::get($header, 'user_avatar');
$additionalSettings['avatar'] = Arr::get($header, 'avatar');
$additionalSettings['feed_type'] = Arr::get($feed_settings, 'source_settings.feed_type');
$additionalSettings['hash_tags'] = Arr::get($feed_settings, 'source_settings.hash_tags');
}
if ($platform === 'facebook_feed' || $platform === 'tiktok') {
$additionalSettings['assets_url'] = WPSOCIALREVIEWS_URL . 'assets';
$additionalSettings['feed_type'] = Arr::get($feed_settings, 'source_settings.feed_type');
}
$this->feedJson = json_encode($feeds);
$this->popupSettings = json_encode($popupSettings);
$this->additionalSettings = json_encode($additionalSettings);
$this->uniqueId = $templateId;
$this->scripts[] = $this->setPopupModalData($platform);
add_action('wp_footer', array($this, 'loadPopupScripts'), 99);
}
public function setPopupModalData($platform)
{
return [
'platform_name' => $platform,
'uniqueId' => intval($this->uniqueId),
'feedJson' => $this->feedJson,
'popupSettings' => $this->popupSettings,
'additionalSettings' => $this->additionalSettings,
];
}
/**
* Enqueue All Front-End Assets
*
* @param
*/
public function registerScripts()
{
wp_register_script('wpsr-image-resizer', WPSOCIALREVIEWS_URL . 'assets/js/image_resizer.js',
array('jquery'), WPSOCIALREVIEWS_VERSION, true);
wp_register_script('wpsr-reviews-image-resizer', WPSOCIALREVIEWS_URL . 'assets/js/reviews-image-resizer.js',
array('jquery'), WPSOCIALREVIEWS_VERSION, true);
wp_register_script('wp-social-review', WPSOCIALREVIEWS_URL . 'assets/js/wp-social-review.js',
array('jquery'), WPSOCIALREVIEWS_VERSION, true);
wp_register_script('social-ninja-modal', WPSOCIALREVIEWS_URL . 'assets/js/social-ninja-modal.js',
array('jquery'), WPSOCIALREVIEWS_VERSION, true);
wp_register_script('wpsn-notification', WPSOCIALREVIEWS_URL . 'assets/js/wpsn-notification.js',
array('jquery'), WPSOCIALREVIEWS_VERSION, true);
wp_register_script('wp-social-reviews_album_js', WPSOCIALREVIEWS_URL . 'assets/js/wpsr-fb-album.js',
array('jquery'), WPSOCIALREVIEWS_VERSION, true);
$this->registerStyles();
global $post;
// load assets for woo products
$woo_wpsn_ids = get_option('_wpsn_ids', []);
$post_id = $post->ID ?? null;
if(!empty($woo_wpsn_ids) && $post_id && in_array($post_id, $woo_wpsn_ids)) {
$this->enqueueStyles(['woocommerce']);
}
// load assets in single page/products
if ((is_a($post, 'WP_Post') && $shortcodeIds = get_post_meta($post_id, '_wpsn_ids', true))) {
$this->enqueueStyles($shortcodeIds);
}
}
public function registerStyles()
{
wp_register_style(
'wp_social_ninja_reviews',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_reviews.css',
array(),
WPSOCIALREVIEWS_VERSION
);
wp_register_style(
'wp_social_ninja_testimonial',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_testimonial.css',
array(),
WPSOCIALREVIEWS_VERSION
);
wp_register_style(
'wp_social_ninja_ig',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_ig.css',
array(),
WPSOCIALREVIEWS_VERSION
);
wp_register_style(
'wp_social_ninja_fb',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_fb.css',
array(),
WPSOCIALREVIEWS_VERSION
);
wp_register_style(
'wp_social_ninja_tw',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_tw.css',
array(),
WPSOCIALREVIEWS_VERSION
);
wp_register_style(
'wp_social_ninja_yt',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_yt.css',
array(),
WPSOCIALREVIEWS_VERSION
);
wp_register_style(
'wp_social_ninja_tt',
WPSOCIALREVIEWS_URL . 'assets/css/wp_social_ninja_tt.css',
array(),
WPSOCIALREVIEWS_VERSION
);
}
public function enqueueStyles($platformNames = [])
{
if (!$platformNames) {
return false;
}
$maps = [
'twitter' => 'tw',
'youtube' => 'yt',
'instagram' => 'ig',
'facebook_feed' => 'fb',
'tiktok' => 'tt',
'reviews' => 'reviews',
'testimonial' => 'testimonial'
];
$styles = [];
foreach ($platformNames as $platform) {
if (isset($maps[$platform])) {
$styles[$maps[$platform]] = $maps[$platform];
} else {
$styles['reviews'] = 'reviews';
}
}
if (!$styles) {
return false;
}
$styles = array_keys($styles);
foreach ($styles as $style) {
wp_enqueue_style('wp_social_ninja_' . $style);
}
}
public function loadLocalizeScripts()
{
static $jsLoaded;
if ($jsLoaded) {
return;
}
$upload = wp_upload_dir();
$upload_url = trailingslashit($upload['baseurl']) . WPSOCIALREVIEWS_UPLOAD_DIR_NAME;
$translations = GlobalSettings::getTranslations();
$platform = $this->platform ?: '';
$params = apply_filters('wpsocialreviews/frontend_vars', array(
'ajax_url' => admin_url('admin-ajax.php'),
'wpsr_nonce' => wp_create_nonce('wpsr-ajax-nonce'),
'has_pro' => defined('WPSOCIALREVIEWS_PRO'),
'is_custom_feed_for_tiktok_activated' => defined('CUSTOM_FEED_FOR_TIKTOK'),
'read_more' => Arr::get($translations, 'read_more') ?: __('Read more', 'wp-social-reviews'),
'read_less' => Arr::get($translations, 'read_less') ?: __('Read less', 'wp-social-reviews'),
'view_on_fb' => Arr::get($translations, 'view_on_fb') ?: __('View on Facebook', 'wp-social-reviews'),
'people_responded' => Arr::get($translations, 'people_responded') ?: __( 'People Responded', 'wp-social-reviews' ),
'online_event' => Arr::get($translations, 'online_event') ?: __( 'Online Event', 'wp-social-reviews' ),
'view_on_ig' => Arr::get($translations, 'view_on_ig') ?: __( 'View on Instagram', 'wp-social-reviews' ),
'view_on_tiktok' => Arr::get($translations, 'view_on_tiktok') ?: __( 'View on TikTok', 'wp-social-reviews' ),
'likes' => Arr::get($translations, 'likes') ?: __( 'likes', 'wp-social-reviews' ),
'interested' => Arr::get($translations, 'interested') ?: __( 'interested', 'wp-social-reviews' ),
'going' => Arr::get($translations, 'going') ?: __( 'going', 'wp-social-reviews' ),
'went' => Arr::get($translations, 'went') ?: __( 'went', 'wp-social-reviews' ),
'ai_generated_summary' => Arr::get($translations, 'ai_generated_summary') ?: __( 'AI-Generated Summary', 'wp-social-reviews' ),
'plugin_url' => WPSOCIALREVIEWS_URL,
'image_settings' => Helper::getImageSettings($platform),
'upload_url' => $upload_url,
'user_role' => current_user_can('administrator'),
'a11y' => [
'prevSlideMessage' => __('Previous slide', 'wp-social-reviews'),
'nextSlideMessage' => __('Next slide', 'wp-social-reviews'),
'firstSlideMessage' => __('This is the first slide', 'wp-social-reviews'),
'lastSlideMessage' => __('This is the last slide', 'wp-social-reviews'),
// translators: Please retain the placeholders (%s, %d, etc.) and ensure they are correctly used in context.
'paginationBulletMessage' => sprintf(__('Go to slide %s', 'wp-social-reviews'), '{{index}}'),
]
));
?>
<script type="text/javascript" id="wpsr-localize-script">
window.wpsr_ajax_params = <?php echo json_encode($params); ?>;
</script>
<?php
$jsLoaded = true;
}
public function enqueueScripts()
{
static $jsLoaded;
if ($jsLoaded) {
return;
}
wp_enqueue_script('wp-social-review');
add_action('wp_footer', array($this, 'loadLocalizeScripts'), 99);
$jsLoaded = true;
}
public function enqueueNotificationScripts()
{
wp_enqueue_script('wpsn-notification');
}
public function localizePopupScripts()
{
static $jsLoaded;
if ($jsLoaded) {
return;
}
$params = array(
'ajax_url' => admin_url('admin-ajax.php'),
);
?>
<script type="text/javascript" id="wpsr-localize-popup-script">
window.wpsr_popup_params = <?php echo json_encode($params); ?>;
</script>
<?php
$jsLoaded = true;
}
public function enqueuePopupScripts()
{
wp_enqueue_script('social-ninja-modal');
add_action('wp_footer', array($this, 'localizePopupScripts'), 99);
}
public function enqueueAlbumScripts()
{
wp_enqueue_script('wp-social-reviews_album_js');
}
public function handleLoadMoreAjax()
{
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reading AJAX parameters for pagination, not processing sensitive form data
$templateId = absint(Arr::get($_REQUEST, 'template_id'));
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reading AJAX parameters for pagination, not processing sensitive form data
$platform = sanitize_text_field(Arr::get($_REQUEST, 'platform'));
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reading AJAX parameters for pagination, not processing sensitive form data
$page = absint(Arr::get($_REQUEST, 'page', 2));
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reading AJAX parameters for pagination, not processing sensitive form data
$feed_type = sanitize_text_field(Arr::get($_REQUEST, 'feed_type' , ''));
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reading AJAX parameters for pagination, not processing sensitive form data
$feed_id = sanitize_text_field(Arr::get($_REQUEST, 'feed_id' , null));
if ($platform == 'youtube') {
$content = (new YoutubeTemplateHandler())->getPaginatedFeedHtml($templateId, $page);
} else if ($platform == 'twitter') {
$content = (new TwitterTemplateHandler())->getPaginatedFeedHtml($templateId, $page);
} else if ($platform == 'facebook_feed') {
$content = (new FacebookFeedTemplateHandler())->getPaginatedFeedHtml($templateId, $page, $feed_id, $feed_type);
} else if ($platform === 'tiktok') {
$content = apply_filters('wpsocialreviews/get_paginated_feed_html', $templateId, $page);
}else if ($platform == 'reviews') {
$this->platform = 'reviews';
$this->imageSettings = Helper::getImageSettings($platform);
$content = (new ReviewsTemplateHandler())->getPaginatedFeedHtml($templateId, $page, $this->imageSettings);
} else {
$content = apply_filters('wpsr_feed_items_by_page_' . $platform, '', $templateId, $page);
}
wp_send_json([
'content' => $content
]);
die();
}
public function makeSocialWallFeedShortcode($args = [], $content = null, $tag = '')
{
$args = shortcode_atts(array(
'id' => '',
'platform' => ''
), $args);
if (!$args['id']) {
return '';
}
$templateId = absint($args['id']);
$feed_meta = get_post_meta($templateId, '_wpsr_template_config', true);
$decodedMeta = json_decode($feed_meta, true);
$feed_settings = Arr::get($decodedMeta, 'social_wall_settings', array());
$data = Config::formatSocialWallConfig($feed_settings, array());
$social_wall_list = Arr::get($data, 'social_wall_settings.social_wall_list', []);
$html = '';
if(!empty($social_wall_list)){
$feedsHtml = '';
$html .= '<div class="wpsr-social-wall-tabs">';
foreach ($social_wall_list as $index => $platformArray) {
$platformName = Arr::get($platformArray, 'name');
$platformLabel = Arr::get($platformArray, 'label');
$platformTemplateId = Arr::get($platformArray, 'template.value');
$platform = $platformName === 'facebook_feed' ? 'Facebook' : $platformName;
$methodName = str_replace('_', ucfirst($platform), 'render_Template');
$classActive = $index === 0 ? 'wpsr-active' : 'wpsr-deactivate';
$platformClass = 'wpsr-'.$platformName;
if (!did_action('wp_enqueue_scripts')) {
$this->registerStyles();
}
$this->enqueueStyles([$platformName]);
$this->enqueuePopupScripts();
if($platformTemplateId && $platformName){
$feedsHtml .= '<div class="wpsr-social-wall-content '.esc_attr($platformClass).' '.esc_attr($classActive).'">';
if ($platformName === 'tiktok') {
$feedsHtml .= apply_filters('wpsocialreviews/render_tiktok_template', $platformTemplateId, $platformName);
} else {
$feedsHtml .= $this->{$methodName}($platformTemplateId, $platformName);
}
$feedsHtml .= '</div>';
}
$html .= '<a href="#" role="tab" aria-selected="true" aria-label="'.esc_attr($platformLabel).'" class="wpsr-social-wall-tab '.esc_attr($classActive).'" data-platform="'.esc_attr($platformName).'" data-template_id="'.esc_attr($platformTemplateId).'">'.esc_html($platformLabel).'</a>';
}
$html .= '</div>';
$html .= '<div class="wpsr-social-wall-tab-content-wrapper">';
$html .= $feedsHtml;
$html .= '</div>';
}
return $html;
}
}