: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Instagram Feed Saver Manager
namespace TwitterFeed\Builder;
use TwitterFeed\Admin\CTF_Cache_Handler;
use TwitterFeed\V2\CtfOauthConnect;
use TwitterFeed\Admin\CTF_HTTP_Request;
use TwitterFeed\CTF_Settings;
use TwitterFeed\CTF_Parse;
use TwitterFeed\Admin\Traits\CTF_Feed_Templates_Settings;
class CTF_Feed_Saver_Manager {
use CTF_Feed_Templates_Settings;
* AJAX hooks for various feed data related functionality
public static function hooks() {
add_action( 'wp_ajax_ctf_feed_saver_manager_builder_update', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'builder_update' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_get_feed_settings', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'get_feed_settings' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_get_feed_list_page', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'get_feed_list_page' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_get_locations_page', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'get_locations_page' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_delete_feeds', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'delete_feed' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_duplicate_feed', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'duplicate_feed' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_clear_single_feed_cache', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'clear_single_feed_cache' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_importer', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'importer' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_fly_preview', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'feed_customizer_fly_preview' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_retrieve_comments', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'retrieve_comments' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_search_username_lists', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'search_username_lists' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_check_twitter_list_by_id', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'check_twitter_list_by_id' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_connect_manual_account', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'connect_manual_account' ) );
add_action( 'wp_ajax_ctf_feed_saver_manager_delete_account', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'delete_account' ) );
//Detect Leaving the Page
add_action( 'wp_ajax_ctf_feed_saver_manager_recache_feed', array( 'TwitterFeed\Builder\CTF_Feed_Saver_Manager', 'recache_feed' ) );
* Create Mixed Feed Type Data
public static function create_mixed_feed_type_data( $selected_feeds, $selected_feed_models ){
foreach ($selected_feeds as $feed_type) {
$feeds_types['screenname'] = isset( $selected_feed_models['usertimeline'] ) ? $selected_feed_models['usertimeline'] : '';
$feeds_types['hashtag'] = isset( $selected_feed_models['hashtag'] ) ? $selected_feed_models['hashtag'] : '';
$feeds_types['search'] = isset( $selected_feed_models['search'] ) ? $selected_feed_models['search'] : '';
$feeds_types['home'] = true;
$feeds_types['mentions'] = true;
$feeds_types['lists'] = isset( $selected_feed_models['lists'] ) ? $selected_feed_models['lists'] : '';
* Create Single Feed Type Data
public static function create_single_feed_type_data( $selected_feed, $selected_feed_model ){
switch ($selected_feed) {
$feed_data['usertimeline_text'] = isset( $selected_feed_model['usertimeline'] ) ? $selected_feed_model['usertimeline'] : '';
$feed_data['screenname'] = isset( $selected_feed_model['usertimeline'] ) ? $selected_feed_model['usertimeline'] : '';
$feed_data['hashtag_text'] = isset( $selected_feed_model['hashtag'] ) ? $selected_feed_model['hashtag'] : '';
$feed_data['hashtag'] = isset( $selected_feed_model['hashtag'] ) ? $selected_feed_model['hashtag'] : '';
$feed_data['home'] = true;
$feed_data['type'] = $selected_feed;
public static function get_max_feed_name( $feed_name, $type = 'text' ){
$list_array = array_slice($feed_name , 0, 3);
foreach ($list_array as $list) {
$feed_name_array = explode(',', $feed_name);
$feed_name_array = array_slice($feed_name_array , 0, 3);
$feed_name = implode(' ', $feed_name_array);
* This will create the feed name when creating new Feeds
public static function create_feed_name( $selected_feeds, $selected_feed_models ){
$feed_name = 'Twitter Feed';
if(is_array($selected_feeds) && isset($selected_feeds[0])){
switch ($selected_feeds[0]) {
$feed_name = isset( $selected_feed_models['usertimeline'] ) ? CTF_Feed_Saver_Manager::get_max_feed_name($selected_feed_models['usertimeline']) : $feed_name;
$feed_name = isset( $selected_feed_models['hashtag'] ) ? CTF_Feed_Saver_Manager::get_max_feed_name($selected_feed_models['hashtag']) : $feed_name;
$feed_name = isset( $selected_feed_models['search'] ) ? CTF_Feed_Saver_Manager::get_max_feed_name($selected_feed_models['search']) : $feed_name;
$feed_name = 'Home Timeline';
$feed_name = isset( $selected_feed_models['listsObject'] ) && sizeof($selected_feed_models['listsObject']) > 0 ? CTF_Feed_Saver_Manager::get_max_feed_name($selected_feed_models['listsObject'], 'list') : $feed_name;
return CTF_Db::feeds_query_name( $feed_name );
* Used in an AJAX call to update settings for a particular feed.
* Can also be used to create a new feed if no feed_id sent in
public static function builder_update() {
check_ajax_referer( 'ctf-admin' , 'nonce');
$cap = ctf_get_manage_options_cap();
if ( ! current_user_can( $cap ) ) {
wp_send_json_error(); // This auto-dies.
unset( $settings_data['nonce'] );
$is_new_feed = isset($settings_data['new_insert'] ) ? true : false;
if ( ! empty( $settings_data['feed_id'] ) ) {
$feed_id = sanitize_text_field( $settings_data['feed_id'] );
unset( $settings_data['feed_id'] );
} elseif ( isset( $settings_data['feed_id'] ) ) {
unset( $settings_data['feed_id'] );
unset( $settings_data['action'] );
$update_feed = isset( $settings_data['update_feed'] ) ? true : false;
unset( $settings_data['update_feed'] );
$settings_data = CTF_Feed_Templates_Settings::get_feed_settings_by_feed_templates( $settings_data );
$feed_name = $settings_data['feed_name'];
$settings_data = $settings_data['settings'];
#if ( isset( $settings_data['new_insert'] ) && $settings_data['new_insert'] == 'true') {
if( isset( $_POST['selectedFeed'] ) && is_array( $_POST['selectedFeed'] ) ){
if( sizeof($_POST['selectedFeed']) == 1 ){
$_POST['type'] = $_POST['selectedFeed'][0];
$feed_type_data = CTF_Feed_Saver_Manager::create_single_feed_type_data( $_POST['type'], $_POST['selectedFeedModel'] );
$settings_data = array_merge($settings_data,$feed_type_data);
$settings_data['feed_name'] = CTF_Feed_Saver_Manager::create_feed_name( $_POST['selectedFeed'], $_POST['selectedFeedModel'] );
unset( $settings_data['new_insert'] );
unset( $settings_data['selectedFeed'] );
unset( $settings_data['selectedFeedModel'] );
unset( $settings_data['customizer'] );
$feed_saver = new CTF_Feed_Saver( $feed_id );
$feed_saver->set_feed_name( $feed_name );
$feed_saver->set_data( $settings_data );
if ( $feed_saver->update_or_insert() ) {
'feed_id' => $feed_saver->get_feed_id()
echo wp_json_encode( $return );
$feed_cache = new \SB_Instagram_Cache( $feed_id );
$feed_cache->clear( 'all' );
$feed_cache->clear( 'posts' );
echo wp_json_encode( $return );
* Retrieve comments AJAX call
public static function retrieve_comments() {
if ( empty( $_POST['feed_id'] )) {
$feed_id = $_POST['feed_id'];
$feed_saver = new CTF_Feed_Saver( $feed_id );
$settings = $feed_saver->get_feed_settings();
if ( $settings != false ){
$post_set = new CTF_Post_Set( $feed_id );
$return = $post_set->fetch_comments();
echo ctf_json_encode( $return );
* Used in an AJAX call to delete feeds from the Database
public static function delete_feed()
check_ajax_referer('ctf-admin', 'nonce');
$cap = ctf_get_manage_options_cap();
if (! current_user_can($cap)) {
wp_send_json_error(); // This auto-dies.
if (! empty($_POST['feeds_ids']) && is_array($_POST['feeds_ids'])) {
$sanitized_feed_ids_array = array();
foreach ($_POST['feeds_ids'] as $id) {
$sanitized_feed_ids_array[] = absint($id);
CTF_Db::delete_feeds_query($sanitized_feed_ids_array);
public static function recache_feed() {
check_ajax_referer( 'ctf-admin' , 'nonce');
$cap = ctf_get_manage_options_cap();
if ( ! current_user_can( $cap ) ) {
wp_send_json_error(); // This auto-dies.
$feed_id = sanitize_text_field( $_POST['feedID'] );
$feed_cache = new \SB_Instagram_Cache( $feed_id );
$feed_cache->clear( 'all' );
$feed_cache->clear( 'posts' );
* Used in an AJAX call to delete a feed cache from the Database
public static function clear_single_feed_cache() {
check_ajax_referer( 'ctf-admin' , 'nonce');
$cap = ctf_get_manage_options_cap();
if ( ! current_user_can( $cap ) ) {
wp_send_json_error(); // This auto-dies.
$feed_id = sanitize_text_field( $_POST['feedID'] );
$cache = new CTF_Cache_Handler();
if ( $feed_id === 'legacy' ) {
$cache->clear_legacy_caches();
$cache->clear_single_feed_cache( $feed_id );
CTF_Feed_Saver_Manager::feed_customizer_fly_preview();
* Used in an AJAX call to duplicate a Feed
public static function duplicate_feed() {
check_ajax_referer( 'ctf-admin' , 'nonce');
$cap = ctf_get_manage_options_cap();
if ( ! current_user_can( $cap ) ) {
wp_send_json_error(); // This auto-dies.
if ( ! empty( $_POST['feed_id'] ) ) {
CTF_Db::duplicate_feed_query( $_POST['feed_id'] );
* Import a feed from JSON data
public static function importer() {
check_ajax_referer( 'ctf-admin' , 'nonce');
$cap = ctf_get_manage_options_cap();
if ( ! current_user_can( $cap ) ) {
wp_send_json_error(); // This auto-dies.
if ( ! empty( $_POST['feed_json'] ) && strpos( $_POST['feed_json'], '{' ) === 0 ) {
echo json_encode( CTF_Feed_Saver_Manager::import_feed( stripslashes( $_POST['feed_json'] ) ) );
echo json_encode( array( 'success' => false, 'message' => __( 'Invalid JSON. Must have brackets "{}"', 'custom-twitter-feeds' ) ) );
* Used To check if it's customizer Screens
* Returns Feed info or false!
* @param bool $include_comments
public static function maybe_feed_customizer_data( $include_comments = false ) {
if ( isset( $_GET['feed_id'] ) ){
$feed_id = $_GET['feed_id'];
$feed_saver = new CTF_Feed_Saver( $feed_id );
$settings = $feed_saver->get_feed_settings();
$feed_db_data = $feed_saver->get_feed_db_data();
$settings = self::check_valid_settings($settings);
'feed_info' => $feed_db_data,
'headerData' => $feed_db_data,
'feed_enabled' => CTF_Feed_Builder::auto_enable_disable_feed( $settings, $feed_id )
if ( intval( $feed_id ) > 0 ) {
$twitter_feed_settings = new CTF_Settings( array( 'feed' => $feed_id, 'customizer' => true ) , CTF_Feed_Saver::settings_defaults() );
$twitter_feed_settings = new CTF_Settings( array(), ctf_get_database_settings() );
$twitter_feed_settings->set_feed_type_and_terms();
$settings = $twitter_feed_settings->get_settings();
//$header_info = CTF_Parse_Pro::get_user_header_json( $settings );
#$feed_type_and_terms = $instagram_feed_settings->get_feed_type_and_terms();
//$return['header'] = $header_info;
//$return['headerData'] = $header_info;
* Set Fly Preview Sources Settings
public static function set_fly_preview_sources( $previewSettings ) {
switch ($previewSettings['type']) {
$previewSettings['feed_term'] = $previewSettings['screenname'];
$previewSettings['usertimeline_text'] = $previewSettings['screenname'];
$previewSettings['feed_term'] = $previewSettings['hashtag'];
$previewSettings['hashtag_text'] = $previewSettings['screenname'];
$previewSettings['hometimeline'] = true;
$previewSettings['feed_term'] = '';
* Used to retrieve Feed Posts for preview screen
* Returns Feed info or false!
public static function feed_customizer_fly_preview() {
check_ajax_referer( 'ctf-admin' , 'nonce');
$cap = ctf_get_manage_options_cap();
if ( ! current_user_can( $cap ) ) {
wp_send_json_error(); // This auto-dies.