JezK
Edit File: Facebook_Feed.php
<?php namespace Essential_Addons_Elementor\Traits; if ( ! defined( 'ABSPATH' ) ) { exit; } // Exit if accessed directly use \Essential_Addons_Elementor\Classes\Helper as HelperClass; trait Facebook_Feed { /** * Facebook Feed * * @param array $settings optional widget's settings * * @return false|string|void * @since 3.4.0 */ public function facebook_feed_render_items( $settings = [] ) { // check if ajax request if ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'facebook_feed_load_more' ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing $ajax = wp_doing_ajax(); // check ajax referer check_ajax_referer( 'essential-addons-elementor', 'security' ); // init vars $page = !empty( $_POST['page'] ) ? intval( wp_unslash( $_POST['page'] ), 10 ) : 0; if ( ! empty( $_POST['post_id'] ) ) { $post_id = intval( wp_unslash( $_POST['post_id'] ), 10 ); } else { $err_msg = __( 'Post ID is missing', 'essential-addons-for-elementor-lite' ); if ( $ajax ) { wp_send_json_error( $err_msg ); } return false; } if ( ! empty( $_POST['widget_id'] ) ) { $widget_id = sanitize_text_field( wp_unslash( $_POST['widget_id'] ) ); } else { $err_msg = __( 'Widget ID is missing', 'essential-addons-for-elementor-lite' ); if ( $ajax ) { wp_send_json_error( $err_msg ); } return false; } $settings = HelperClass::eael_get_widget_settings( $post_id, $widget_id ); } else { // init vars $page = 0; $settings = ! empty( $settings ) ? $settings : $this->get_settings_for_display(); } $html = ''; $page_id = $settings['eael_facebook_feed_page_id']; $token = $settings['eael_facebook_feed_access_token']; $source = $settings['eael_facebook_feed_data_source']; $display_comment = isset( $settings['eael_facebook_feed_comments'] ) ? $settings['eael_facebook_feed_comments'] : ''; if ( empty( $page_id ) || empty( $token ) ) { return; } $key = sprintf( 'eael_facebook_feed_%s', md5( sanitize_text_field( wp_unslash( $source . $page_id . $token ) ) . absint( $settings['eael_facebook_feed_cache_limit'] ) ) ); $facebook_data = get_transient( $key ); if ( $facebook_data == false ) { $facebook_data = wp_remote_retrieve_body( wp_remote_get( $this->get_url($page_id, $token, $source, $display_comment), [ 'timeout' => 70, ] ) ); $facebook_data = json_decode( $facebook_data, true ); if ( isset( $facebook_data['data'] ) ) { set_transient( $key, $facebook_data, ( $settings['eael_facebook_feed_cache_limit'] * MINUTE_IN_SECONDS ) ); } } if ( ! isset( $facebook_data['data'] ) ) { return; } $facebook_data = $facebook_data['data']; switch ( $settings['eael_facebook_feed_sort_by'] ) { case 'least-recent': $facebook_data = array_reverse( $facebook_data ); break; } $items = array_splice( $facebook_data, ( $page * $settings['eael_facebook_feed_image_count']['size'] ), $settings['eael_facebook_feed_image_count']['size'] ); $bg_style = isset( $settings['eael_facebook_feed_image_render_type'] ) && $settings['eael_facebook_feed_image_render_type'] == 'cover' ? "background-size: cover;background-position: center;background-repeat: no-repeat;" : "background-size: 100% 100%;background-repeat: no-repeat;"; foreach ( $items as $item ) { $t = 'eael_facebook_feed_message_max_length'; // short it $limit = isset( $settings[ $t ] ) && isset( $settings[ $t ]['size'] ) ? $settings[ $t ]['size'] : null; $message = wp_trim_words( ( isset( $item['message'] ) ? $item['message'] : ( isset( $item['story'] ) ? $item['story'] : '' ) ), $limit, '...' ); $photo = ( isset( $item['full_picture'] ) ? esc_url( $item['full_picture'] ) : '' ); $likes = ( isset( $item['reactions'] ) ? $item['reactions']['summary']['total_count'] : 0 ); $comments = ( isset( $item['comments'] ) ? $item['comments']['summary']['total_count'] : 0 ); if ( empty( $photo ) ) { $photo = isset( $item['attachments']['data'][0]['media']['image']['src'] ) ? esc_url( $item['attachments']['data'][0]['media']['image']['src'] ) : $photo; } if ( $settings['eael_facebook_feed_layout'] == 'card' ) { $item_form_name = ! empty( $item['from']['name'] ) ? $item['from']['name'] : ''; $current_page_id = ! empty( $item['from']['id'] ) ? $item['from']['id'] : $page_id; $html .= '<div class="eael-facebook-feed-item"> <div class="eael-facebook-feed-item-inner"> <header class="eael-facebook-feed-item-header clearfix"> <div class="eael-facebook-feed-item-user clearfix"> <a href="https://www.facebook.com/' . $current_page_id . '" target="' . ( $settings['eael_facebook_feed_link_target'] == 'yes' ? '_blank' : '_self' ) . '"><img src="https://graph.facebook.com/v4.0/' . $current_page_id . '/picture" alt="' . eael_neutralize_shortcodes( esc_attr( $item_form_name ) ) . '" class="eael-facebook-feed-avatar"></a> <a href="https://www.facebook.com/' . $current_page_id . '" target="' . ( $settings['eael_facebook_feed_link_target'] == 'yes' ? '_blank' : '_self' ) . '"><p class="eael-facebook-feed-username">' . eael_neutralize_shortcodes( esc_html( $item_form_name ) ) . '</p></a> </div>'; if ( $settings['eael_facebook_feed_date'] ) { $html .= '<a href="' . esc_url( $item['permalink_url'] ) . '" target="' . ( $settings['eael_facebook_feed_link_target'] ? '_blank' : '_self' ) . '" class="eael-facebook-feed-post-time"><i class="far fa-clock" aria-hidden="true"></i> ' . date_i18n( get_option('date_format'), strtotime( $item['created_time'] ) ) . '</a>'; } $html .= '</header>'; if ( $settings['eael_facebook_feed_message'] && ! empty( $message ) ) { $html .= '<div class="eael-facebook-feed-item-content"> <p class="eael-facebook-feed-message">' . eael_neutralize_shortcodes( wp_kses_post( $this->eael_str_check( $message ) ) ) . '</p> </div>'; } if ( ! empty( $photo ) || isset( $item['attachments']['data'] ) ) { $html .= '<div class="eael-facebook-feed-preview-wrap">'; if ( $item['status_type'] == 'shared_story' ) { if ( isset( $settings['eael_facebook_feed_is_show_preview_thumbnail'] ) && 'yes' == $settings['eael_facebook_feed_is_show_preview_thumbnail'] ) { $html .= '<a href="' . esc_url( $item['permalink_url'] ) . '" target="' . ( $settings['eael_facebook_feed_link_target'] == 'yes' ? '_blank' : '_self' ) . '" class="eael-facebook-feed-preview-img">'; if ( !empty($item['attachments']['data'][0]['media_type']) && $item['attachments']['data'][0]['media_type'] == 'video' ) { $html .= '<div class="eael-facebook-feed-img-container" style="background:url(' . esc_url( $photo ) . ');' . esc_attr( $bg_style ) . '"> <img class="eael-facebook-feed-img" src="' . esc_url( $photo ) . '"></div> <div class="eael-facebook-feed-preview-overlay"><i class="far fa-play-circle" aria-hidden="true"></i></div>'; } else { $html .= '<div class="eael-facebook-feed-img-container" style="background:url(' . esc_url( $photo ) . ');' . esc_attr( $bg_style ) . '"> <img class="eael-facebook-feed-img" src="' . esc_url( $photo ) . '"></div>'; } $html .= '</a>'; } $html .= '<div class="eael-facebook-feed-url-preview">'; if ( isset( $settings['eael_facebook_feed_is_show_preview_host'] ) && 'yes' == $settings['eael_facebook_feed_is_show_preview_host'] && !empty($item['attachments']['data'][0]['unshimmed_url']) ) { $html .= '<p class="eael-facebook-feed-url-host">' . eael_neutralize_shortcodes( esc_html( wp_parse_url( $item['attachments']['data'][0]['unshimmed_url'] )['host'] ) ) . '</p>'; } if ( isset( $settings['eael_facebook_feed_is_show_preview_title'] ) && 'yes' == $settings['eael_facebook_feed_is_show_preview_title'] ) { $html .= '<h2 class="eael-facebook-feed-url-title">' . eael_neutralize_shortcodes( esc_html( $item['attachments']['data'][0]['title'] ?? '' ) ) . '</h2>'; } if ( isset( $settings['eael_facebook_feed_is_show_preview_description'] ) && 'yes' == $settings['eael_facebook_feed_is_show_preview_description'] ) { $description = isset( $item['attachments']['data'][0]['description'] ) ? $item['attachments']['data'][0]['description'] : ''; $html .= '<p class="eael-facebook-feed-url-description">' . eael_neutralize_shortcodes( wp_kses( $description, HelperClass::eael_allowed_tags() ) ) . '</p>'; } $html .= '</div>'; } else if ( $item['status_type'] == 'added_video' ) { if ( isset( $settings['eael_facebook_feed_is_show_preview_thumbnail'] ) && 'yes' == $settings['eael_facebook_feed_is_show_preview_thumbnail'] ) { $html .= '<a href="' . esc_url( $item['permalink_url'] ) . '" target="' . ( $settings['eael_facebook_feed_link_target'] == 'yes' ? '_blank' : '_self' ) . '" class="eael-facebook-feed-preview-img"> <div class="eael-facebook-feed-img-container" style="background:url(' . esc_url( $photo ) . '); ' . esc_attr( $bg_style ) . '"> <img class="eael-facebook-feed-img" src="' . esc_url( $photo ) . '"> </div> <div class="eael-facebook-feed-preview-overlay"><i class="far fa-play-circle" aria-hidden="true"></i></div> </a>'; } } else { if ( isset( $settings['eael_facebook_feed_is_show_preview_thumbnail'] ) && 'yes' == $settings['eael_facebook_feed_is_show_preview_thumbnail'] ) { $html .= '<a href="' . esc_url( $item['permalink_url'] ) . '" target="' . ( $settings['eael_facebook_feed_link_target'] == 'yes' ? '_blank' : '_self' ) . '" class="eael-facebook-feed-preview-img"> <div class="eael-facebook-feed-img-container" style="background:url(' . esc_url( $photo ) . '); ' . esc_attr( $bg_style ) . '"> <img class="eael-facebook-feed-img" src="' . esc_url( $photo ) . '"> </div> </a>'; } } $html .= '</div>'; } if ( $settings['eael_facebook_feed_likes'] || $settings['eael_facebook_feed_comments'] ) { $html .= '<footer class="eael-facebook-feed-item-footer"> <div class="clearfix">'; if ( $settings['eael_facebook_feed_likes'] ) { $html .= '<span class="eael-facebook-feed-post-likes"><i class="far fa-thumbs-up" aria-hidden="true"></i> ' . esc_html( $likes ) . '</span>'; } if ( $settings['eael_facebook_feed_comments'] ) { $html .= '<span class="eael-facebook-feed-post-comments"><i class="far fa-comments" aria-hidden="true"></i> ' . esc_html( $comments ) . '</span>'; } $html .= '</div> </footer>'; } $html .= '</div> </div>'; } else { $html .= '<a href="' . esc_url( $item['permalink_url'] ) . '" target="' . ( $settings['eael_facebook_feed_link_target'] ? '_blank' : '_self' ) . '" class="eael-facebook-feed-item"> <div class="eael-facebook-feed-item-inner"> <div class="eael-facebook-feed-img-container" style="background:url(' . ( empty( $photo ) ? EAEL_PLUGIN_URL . 'assets/front-end/img/flexia-preview.jpg' : esc_url( $photo ) ) . '); ' . esc_attr( $bg_style ) . '"> <img class="eael-facebook-feed-img" src="' . ( empty( $photo ) ? EAEL_PLUGIN_URL . 'assets/front-end/img/flexia-preview.jpg' : esc_url( $photo ) ) . '"> </div>'; if ( $settings['eael_facebook_feed_likes'] || $settings['eael_facebook_feed_comments'] ) { $html .= '<div class="eael-facebook-feed-item-overlay"> <div class="eael-facebook-feed-item-overlay-inner"> <div class="eael-facebook-feed-meta">'; if ( $settings['eael_facebook_feed_likes'] ) { $html .= '<span class="eael-facebook-feed-post-likes"><i class="far fa-thumbs-up" aria-hidden="true"></i> ' . esc_html( $likes ) . '</span>'; } if ( $settings['eael_facebook_feed_comments'] ) { $html .= '<span class="eael-facebook-feed-post-comments"><i class="far fa-comments" aria-hidden="true"></i> ' . esc_html( $comments ) . '</span>'; } $html .= '</div> </div> </div>'; } $html .= '</div> </a>'; } } if ( isset( $_REQUEST['action'] ) && $_REQUEST['action'] == 'facebook_feed_load_more' ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing $data = [ 'num_pages' => ceil( count( $facebook_data ) / $settings['eael_facebook_feed_image_count']['size'] ), 'html' => $html, ]; while ( ob_get_status() ) { ob_end_clean(); } wp_send_json( $data ); wp_die(); } return $html; } public function eael_str_check( $textData = '' ) { $stringText = ''; if ( strlen( $textData ) > 5 ) { $explodeText = explode( ' ', trim( $textData ) ); for ( $st = 0; $st < count( $explodeText ); $st ++ ) { $pos = stripos( trim( $explodeText[ $st ] ), '#' ); $pos1 = stripos( trim( $explodeText[ $st ] ), '@' ); $poshttp = stripos( trim( $explodeText[ $st ] ), 'http' ); $poshttps = stripos( trim( $explodeText[ $st ] ), 'https' ); if ( $pos !== false ) { $stringText .= '<a href="https://facebook.com/hashtag/' . esc_attr( str_replace( '#', '', $explodeText[ $st ] ) ) . '?source=feed_text" target="_blank"> ' . esc_html( $explodeText[ $st ] ) . ' </a>'; } elseif ( $pos1 !== false ) { $stringText .= '<a href="https://facebook.com/' . esc_attr( $explodeText[ $st ] ) . '/" target="_blank"> ' . esc_html( $explodeText[ $st ] ) . ' </a>'; } elseif ( $poshttp !== false || $poshttps !== false ) { $stringText .= '<a href="' . esc_url( $explodeText[ $st ] ) . '" target="_blank"> ' . esc_html( $explodeText[ $st ] ) . ' </a>'; } else { $stringText .= ' ' . esc_html( $explodeText[ $st ] ); } } } return $stringText; } /** * get_url * Build and return api endpoint based on source type * * @param string $page_id string * @param string $token string * @param string $source string * * @return string */ public function get_url( $page_id = '', $token = '', $source = 'posts', $display_comment = '' ) { // Comments yes/no $comment_count = $display_comment === 'yes' ? ',comments.summary(total_count)' : ''; // Safe limit $post_limit = apply_filters( 'eael_facebook_feed_post_limit', 80 ); // ----------------------------- // 1. Lightweight field sets // ----------------------------- $post_fields = "status_type,created_time,from,message,story,permalink_url," . "attachments.limit(1){type,media_type,unshimmed_url,media{image}}" . "{$comment_count},reactions.summary(total_count)"; $feed_fields = "id,message,status_type,created_time,from,permalink_url,privacy," . "attachments.limit(1){type,media_type,unshimmed_url,media{image}}" . "{$comment_count},reactions.summary(total_count)"; // ----------------------------- // 2. Build URLs // ----------------------------- $post_url = "https://graph.facebook.com/v18.0/{$page_id}/posts" . "?fields={$post_fields}" . "&limit={$post_limit}" . "&access_token={$token}"; $feed_url = "https://graph.facebook.com/v18.0/{$page_id}/feed" . "?fields={$feed_fields}" . "&limit={$post_limit}" . "&locale=en_US" . "&access_token={$token}"; // ----------------------------- // 3. If feed is requested → return feed // ----------------------------- if ( $source !== 'posts' ) { return $feed_url; } // ----------------------------- // 4. Source = posts → test if /posts works // ----------------------------- $test = wp_remote_get( "https://graph.facebook.com/v18.0/{$page_id}/posts?limit=1&access_token={$token}", [ 'timeout' => 6 ] ); // If request failed (network timeout) → fallback to feed if ( is_wp_error( $test ) ) { return $feed_url; } $body = json_decode( wp_remote_retrieve_body( $test ), true ); // If /posts is invalid (Facebook code 2500) → return feed if ( isset( $body['error']['code'] ) && (int) $body['error']['code'] === 2500 ) { return $feed_url; } // Otherwise /posts is allowed return $post_url; } }