'on', // advanced. 'disable_review_notice' => 'off', // advanced. 'disable_debug_info' => 'off', // advanced. 'enable_user_nicename' => 'off', // advanced. 'disable_internal_share_counts_api' => 'on', // advanced. 'disable_og_tags' => 'off', // advanced. 'api_key' => '', 'verification_key' => '', 'recommendations_display_on_excerpts' => 'on', 'share_buttons_display_on_excerpts' => 'on', ); } /** * Returns links to add to the plugin options admin page. * * @param array $links * @return array */ public static function admin_plugin_action_links( $links ) { if ( is_array( $links ) ) { $settings_link = '' . __( 'Settings', 'shareaholic' ) . ''; if (self::get_option( 'api_key' )) { $premium_link = '' . __( 'Upgrade', 'shareaholic' ) . ''; } $helpdesk_link = '' . __( 'Support & Documentation', 'shareaholic' ) . ''; array_unshift( $links, $settings_link ); $links[] = $helpdesk_link; if (self::get_option( 'api_key' )) { $links[] = $premium_link; } } return $links; } /** * Extend the admin bar */ public static function admin_bar_extended() { global $wp_admin_bar; $title = '' . '' . __( 'Shareaholic', 'shareaholic' ) . ''; if ( ! current_user_can( 'update_plugins' ) || ! is_admin_bar_showing() || self::get_option( 'disable_admin_bar_menu' ) == 'on' ) { return; } $wp_admin_bar->add_menu( array( 'id' => 'wp_shareaholic_adminbar_menu', 'title' => $title, 'href' => esc_url( admin_url( 'admin.php?page=shareaholic-settings' ) ), ) ); if ( ! is_admin() ) { if ( in_array( self::page_type(), array( 'page', 'post' ) ) ) { $url_link = esc_url( get_permalink() ); } else { global $wp; $url_link = esc_url( trailingslashit( home_url( $wp->request ) ) ); } $wp_admin_bar->add_menu( array( 'parent' => 'wp_shareaholic_adminbar_menu', 'id' => 'wp_shareaholic_adminbar_submenu-sharecounts', 'title' => __( 'Check Share Counts', 'shareaholic' ), 'href' => 'https://www.shareaholic.com/sharecounter?url=' . $url_link, 'meta' => array( 'target' => '_blank' ), ) ); } $wp_admin_bar->add_menu( array( 'parent' => 'wp_shareaholic_adminbar_menu', 'id' => 'wp_shareaholic_adminbar_submenu-settings', 'title' => __( 'Cloud Settings', 'shareaholic' ), 'href' => admin_url( 'admin.php?page=shareaholic-settings' ), ) ); $wp_admin_bar->add_menu( array( 'parent' => 'wp_shareaholic_adminbar_menu', 'id' => 'wp_shareaholic_adminbar_submenu-general', 'title' => __( 'Shareaholic.com', 'shareaholic' ), 'href' => 'https://www.shareaholic.com/publisher_tools/' . self::get_option( 'api_key' ) . '/websites/edit/?verification_key=' . self::get_option( 'verification_key' ), 'meta' => array( 'target' => '_blank' ), ) ); $wp_admin_bar->add_menu( array( 'parent' => 'wp_shareaholic_adminbar_menu', 'id' => 'wp_shareaholic_adminbar_submenu-help', 'title' => __( 'Support & FAQ', 'shareaholic' ), 'href' => 'https://support.shareaholic.com/', 'meta' => array( 'target' => '_blank' ), ) ); } /** * Returns whether the user has accepted our terms of service. * * @return bool */ public static function has_accepted_terms_of_service() { return get_option( 'shareaholic_has_accepted_tos' ); } /** * Accepts the terms of service. */ public static function accept_terms_of_service() { update_option( 'shareaholic_has_accepted_tos', true ); self::log_event( 'AcceptedToS' ); echo '{}'; die(); } /** * Wrapper for WordPress's get_option * * @param string $option * * @return mixed */ public static function get_option( $option ) { $settings = self::get_settings(); return ( isset( $settings[ $option ] ) ? $settings[ $option ] : array() ); } /** * Wrapper for WordPress's update_option * * @param array $array an array of options to update. * @return bool */ public static function update_options( $array ) { $old_settings = self::get_settings(); $new_settings = self::array_merge_recursive_distinct( $old_settings, $array ); update_option( 'shareaholic_settings', $new_settings ); } /** * Return the current version. * * @return string that looks like a number */ public static function get_version() { return self::get_option( 'version' ) ? self::get_option( 'version' ) : get_option( 'SHRSBvNUM' ); } /** * Return host domain of WordPress install * * @return string */ public static function get_host() { $parse = parse_url( get_bloginfo( 'url' ) ); return $parse['host']; } /** * Set the current version, how simple. * * @param string $version the version you want to set. */ public static function set_version( $version ) { self::update_options( array( 'version' => $version ) ); } /** * Determines if the first argument version is less than the second * argument version. A version can be up four levels, e.g. 1.1.1.1. * Any versions not supplied will be zeroed. * * @param string $version * @param string $comparer * @return bool */ public static function version_less_than( $version, $comparer ) { $version_array = explode( '.', $version ); $comparer_array = explode( '.', $comparer ); for ( $i = 0; $i <= 3; $i++ ) { // zero out unset numbers if ( ! isset( $version_array[ $i ] ) ) { $version_array[ $i ] = 0; } if ( ! isset( $comparer_array[ $i ] ) ) { $comparer_array[ $i ] = 0; } if ( $version_array[ $i ] < $comparer_array[ $i ] ) { return true; } } return false; } /** * Determines if the first argument version is less than or equal to the second * argument version. A version can be up four levels, e.g. 1.1.1.1. * Any versions not supplied will be zeroed. * * @param string $version * @param string $comparer * @return bool */ public static function version_less_than_or_equal_to( $version, $comparer ) { $version_array = explode( '.', $version ); $comparer_array = explode( '.', $comparer ); if ( $version == $comparer || self::version_less_than( $version, $comparer ) ) { return true; } return false; } /** * Determines if the first argument version is greater than the second * argument version. A version can be up four levels, e.g. 1.1.1.1. * Any versions not supplied will be zeroed. * * @param string $version * @param string $comparer * @return bool */ public static function version_greater_than( $version, $comparer ) { $version_array = explode( '.', $version ); $comparer_array = explode( '.', $comparer ); for ( $i = 0; $i <= 3; $i++ ) { // zero out unset numbers if ( ! isset( $version_array[ $i ] ) ) { $version_array[ $i ] = 0; } if ( ! isset( $comparer_array[ $i ] ) ) { $comparer_array[ $i ] = 0; } if ( $version_array[ $i ] > $comparer_array[ $i ] ) { return true; } elseif ( $version_array[ $i ] < $comparer_array[ $i ] ) { return false; } } return false; } /** * Determines if the first argument version is greater than or equal to the second * argument version. A version can be up four levels, e.g. 1.1.1.1. * Any versions not supplied will be zeroed. * * @param string $version * @param string $comparer * @return bool */ public static function version_greater_than_or_equal_to( $version, $comparer ) { $version_array = explode( '.', $version ); $comparer_array = explode( '.', $comparer ); if ( $version == $comparer || self::version_greater_than( $version, $comparer ) ) { return true; } return false; } /** * This is the function that will perform the update. */ public static function perform_update() { // Set plugin defaults, if not already set $settings = self::get_settings(); if ( empty( $settings['share_buttons_display_on_excerpts'] ) || ! isset( $settings['share_buttons_display_on_excerpts'] ) ) { self::update_options( array( 'share_buttons_display_on_excerpts' => 'on' ) ); } if ( empty( $settings['recommendations_display_on_excerpts'] ) || ! isset( $settings['recommendations_display_on_excerpts'] ) ) { self::update_options( array( 'recommendations_display_on_excerpts' => 'on' ) ); } if ( ! self::is_locked( 'perform_update' ) ) { self::set_lock( 'perform_update' ); // Upgrade v6! if ( self::get_version() && intval( self::get_version() ) <= 6 ) { ShareaholicSixToSeven::update(); } // Activate Shareaholic Cron job ShareaholicCron::activate(); // Upgrade v8! if ( self::get_version() && intval( self::get_version() ) <= 8 && intval( self::get_version() ) > 7 ) { self::EightToNineUpdate(); } // Clear site cache. self::clear_cache(); // add other things that need to run on version change here. self::unlock( 'perform_update' ); } } /** * Return the type of page we're on as a string * to use for the location in the JS * * @return string */ public static function page_type() { if ( is_front_page() || is_home() ) { return 'index'; } elseif ( is_page() ) { return 'page'; } elseif ( is_single() ) { return 'post'; } elseif ( is_category() || is_author() || is_tag() || is_date() || is_search() ) { return 'category'; } } /** * Returns a base64 URL for the svg for use in the menu * * @param bool $base64 Whether or not to return base64'd output. * @return string */ public static function get_icon_svg( $base64 = true ) { $svg = 'logo'; if ( $base64 ) { return 'data:image/svg+xml;base64,' . base64_encode( $svg ); } return $svg; } /** * Returns the appropriate asset path for environment * * @param string $asset * @return string */ public static function asset_url( $asset = null ) { $env = self::get_env(); if ( $env === 'development' ) { return 'http://spreadaholic.com:8080/' . $asset; } elseif ( $env === 'staging' ) { return '//d2062rwknz205x.cloudfront.net/' . $asset; } else { return '//cdn.shareaholic.net/' . $asset; } } public static function get_env() { if ( preg_match( '/spreadaholic/', Shareaholic::URL ) ) { return 'development'; } elseif ( preg_match( '/stageaholic/', Shareaholic::URL ) ) { return 'staging'; } else { return 'production'; } } /** * Returns the appropriate asset path for environment - admin * * @param string $asset * @return string */ public static function asset_url_admin( $asset = null ) { if ( preg_match( '/spreadaholic/', Shareaholic::URL ) ) { return 'http://spreadaholic.com:8080/' . $asset; } elseif ( preg_match( '/stageaholic/', Shareaholic::URL ) ) { return 'https://d2062rwknz205x.cloudfront.net/' . $asset; } else { return 'https://cdn.shareaholic.net/' . $asset; } } /** * Given a minified path, and a non-minified path, will return * a minified or non-minified file URL based on whether SCRIPT_DEBUG is set true or not. * * @param string $minified_path minified path. * @param string $non_minified_path non-minified path. * @return string The URL to the file. */ public static function get_file_url_for_environment( $minified_path, $non_minified_path ) { $script_debug = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG; if ( true === $script_debug ) { $path = plugins_url( $non_minified_path, SHAREAHOLIC_FILE ); } elseif ( false === $script_debug ) { $path = plugins_url( $minified_path, SHAREAHOLIC_FILE ); } else { // This should work in any case. $path = plugins_url( $non_minified_path, SHAREAHOLIC_FILE ); } return $path; } /** * Checks whether the api key has been verified * using the rails endpoint. Once the key has * been verified, we store that away so that we * don't have to check again. * * @return bool */ public static function api_key_verified() { $settings = self::get_settings(); if ( isset( $settings['api_key_verified'] ) && $settings['api_key_verified'] ) { return true; } $api_key = $settings['api_key']; if ( ! $api_key ) { return false; } $response = ShareaholicCurl::get( Shareaholic::API_URL . '/publisher_tools/' . $api_key . '/verified' ); $result = $response['body']; if ( $result == 'true' ) { self::update_options( array( 'api_key_verified' => true, ) ); } } /** * A wrapper function to specifically update the location name ids * * @todo Determine whether needed anymore * * @param array $array an array of location names to location ids * @return bool */ public static function update_location_name_ids( $array ) { $settings = self::get_settings(); $location_name_ids = ( isset( $settings['location_name_ids'] ) ? $settings['location_name_ids'] : array() ); $merge = array_merge( $location_name_ids, $array ); $settings['location_name_ids'] = $merge; update_option( 'shareaholic_settings', $settings ); } /** * * Loads the locations names and their respective ids for an api key * and sets them in the shareaholic settings. * * @param string $api_key */ public static function get_new_location_name_ids( $api_key ) { $response = ShareaholicCurl::get( Shareaholic::API_URL . "/publisher_tools/{$api_key}.json" ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '404' ) { self::load_template( 'failed_to_create_api_key_modal' ); self::log_bad_response( 'FailedToFetchPubConfig_404', $response ); return; } $publisher_configuration = $response['body']; $result = array(); } if ( $publisher_configuration && is_array( $publisher_configuration ) ) { foreach ( array( 'share_buttons', 'recommendations' ) as $app ) { foreach ( $publisher_configuration['apps'][ $app ]['locations'] as $id => $location ) { $result[ $app ][ $location['name'] ] = $id; } } self::update_location_name_ids( $result ); } else { self::load_template( 'failed_to_create_api_key_modal' ); self::log_bad_response( 'FailedToFetchPubConfig', $response ); } } /** * A general function to underscore a CamelCased string. * * @param string $string * @return string */ public static function underscore( $string ) { return strtolower( preg_replace( '/([a-z])([A-Z])', '$1_$2', $string ) ); } /** * Passed an array of location names mapped to ids per app. * * @param array $array */ public static function turn_on_locations( $array, $turn_off_array = array() ) { if ( is_array( $array ) ) { foreach ( $array as $app => $ids ) { if ( is_array( $ids ) ) { foreach ( $ids as $name => $id ) { self::update_options( array( $app => array( $name => 'on' ), ) ); } } } } if ( is_array( $turn_off_array ) ) { foreach ( $turn_off_array as $app => $ids ) { if ( is_array( $ids ) ) { foreach ( $ids as $name => $id ) { self::update_options( array( $app => array( $name => 'off' ), ) ); } } } } } /** * Give back only the request keys from an array. The first * argument is the array to be sliced, and after that it can * either be a variable-length list of keys or one array of keys. * * @param array $array * @param Mixed ... can be either one array or many keys * @return array */ public static function associative_array_slice( $array ) { $keys = array_slice( func_get_args(), 1 ); if ( func_num_args() == 2 && is_array( $keys[0] ) ) { $keys = $keys[0]; } $result = array(); foreach ( $keys as $key ) { $result[ $key ] = $array[ $key ]; } return $result; } /** * Sets a lock (mutex) * * @param string $name */ public static function set_lock( $name ) { update_option( 'shareaholic_' . $name, true ); } /** * Checks if an action is locked. * * @param string $name * @return bool */ public static function is_locked( $name ) { return get_option( 'shareaholic_' . $name, false ); } /** * Unlocks a mutex * * @param string $name */ public static function unlock( $name ) { delete_option( 'shareaholic_' . $name ); } /** * Clears all mutex */ public static function delete_mutex() { delete_option( 'shareaholic_get_or_create_api_key' ); delete_option( 'shareaholic_perform_update' ); } /** * Returns Active Plugins */ public static function get_active_plugins() { $active_plugins = (array) get_option( 'active_plugins', array() ); if ( is_multisite() ) { $network_plugins = (array) get_site_option( 'active_sitewide_plugins', array() ); $active_plugins = array_merge( $active_plugins, array_keys( $network_plugins ) ); } return ( isset( $active_plugins ) ? array_values( array_unique( $active_plugins ) ) : array() ); } /** * Checks whether a plugin is active * * @param string $name */ public static function check_for_other_plugin() { if ( is_plugin_active( 'shareaholic/shareaholic.php' ) ) { deactivate_plugins( 'sexybookmarks/shareaholic.php' ); } if ( is_plugin_active( 'shareaholic/sexy-bookmarks.php' ) ) { deactivate_plugins( 'sexybookmarks/sexy-bookmarks.php' ); } } /** * Deletes the api key */ public static function delete_api_key() { $payload = array( 'site_id' => self::get_option( 'api_key' ), 'verification_key' => self::get_option( 'verification_key' ), ); $response = ShareaholicCurl::post( Shareaholic::API_URL . '/integrations/plugin/delete', $payload, 'json', true ); } /** * Returns Stats */ public static function get_stats() { global $wpdb; $stats = array( 'posts_total' => $wpdb->get_var( "SELECT count(ID) FROM $wpdb->posts where post_type = 'post' AND post_status = 'publish'" ), 'pages_total' => $wpdb->get_var( "SELECT count(ID) FROM $wpdb->posts where post_type = 'page' AND post_status = 'publish'" ), 'users_total' => $wpdb->get_var( "SELECT count(ID) FROM $wpdb->users" ), ); return ( isset( $stats ) ? $stats : array() ); } /** * Returns Local Share Count Proxy Status */ public static function get_internal_share_counts_api_status() { if ( self::get_option( 'disable_internal_share_counts_api' ) == null || self::get_option( 'disable_internal_share_counts_api' ) == 'off' ) { $server_side_share_count_status = 'on'; } else { $server_side_share_count_status = 'off'; } return $server_side_share_count_status; } /** * Returns the api key or creates a new one. * * It first checks the database. If the key is not * found (or is an empty string or empty array or * anything that evaluates to false) then we will * attempt to make a new one by POSTing to the * anonymous configuration endpoint. That action * is wrapped in a mutex to keep two requests from * trying to create new api keys at the same time. * * Note: this function is called on every pageload. * So please keep it as fast as possible. * * @return string */ public static function get_or_create_api_key() { $api_key = self::get_option( 'api_key' ); // ensure api key set is atleast 30 characters if ( $api_key && ( strlen( $api_key ) > 30 ) ) { return $api_key; } if ( ! self::is_locked( 'get_or_create_api_key' ) ) { self::set_lock( 'get_or_create_api_key' ); $old_settings = self::get_settings(); delete_option( 'shareaholic_settings' ); // restore any old settings that should be preserved between resets if ( isset( $old_settings['share_counts_connect_check'] ) ) { self::update_options( array( 'share_counts_connect_check' => $old_settings['share_counts_connect_check'], ) ); } $verification_key = md5( mt_rand() ); $turned_on_share_buttons_locations = self::get_default_sb_on_locations(); $turned_off_share_buttons_locations = self::get_default_sb_off_locations(); $turned_on_recommendations_locations = self::get_default_rec_on_locations(); $turned_off_recommendations_locations = self::get_default_rec_off_locations(); $share_buttons_attributes = array_merge( $turned_on_share_buttons_locations, $turned_off_share_buttons_locations ); $recommendations_attributes = array_merge( $turned_on_recommendations_locations, $turned_off_recommendations_locations ); $data = array( 'configuration_publisher' => array( 'verification_key' => $verification_key, 'site_name' => self::site_name(), 'domain' => self::site_url(), 'platform_id' => '12', 'language_id' => self::site_language(), 'shortener' => 'shrlc', 'recommendations_attributes' => array( 'locations_attributes' => $recommendations_attributes, ), 'share_buttons_attributes' => array( 'locations_attributes' => $share_buttons_attributes, ), ), ); $response = ShareaholicCurl::post( Shareaholic::API_URL . '/publisher_tools/anonymous', $data, 'json' ); if ( $response && preg_match( '/20*/', $response['response']['code'] ) ) { self::update_options( array( 'api_key' => $response['body']['api_key'], 'verification_key' => $verification_key, 'location_name_ids' => $response['body']['location_name_ids'], ) ); if ( isset( $response['body']['location_name_ids'] ) && is_array( $response['body']['location_name_ids'] ) ) { self::set_default_location_settings( $response['body']['location_name_ids'] ); ShareaholicAdmin::welcome_email(); self::clear_cache(); } else { self::log_bad_response( 'FailedToCreateApiKey', $response ); } } else { // add_action('admin_notices', array('ShareaholicAdmin', 'failed_to_create_api_key')); self::log_bad_response( 'FailedToCreateApiKey', $response ); } self::unlock( 'get_or_create_api_key' ); } else { usleep( 100000 ); self::get_or_create_api_key(); } } /** * Get share buttons locations that should be turned on by default * * @return {Array} */ public static function get_default_sb_on_locations() { return array( array( 'name' => 'post_below_content', 'counter' => 'badge-counter', 'enabled' => true, ), array( 'name' => 'page_below_content', 'counter' => 'badge-counter', 'enabled' => true, ), array( 'name' => 'index_below_content', 'counter' => 'badge-counter', 'enabled' => true, ), array( 'name' => 'category_below_content', 'counter' => 'badge-counter', 'enabled' => true, ), ); } /** * Get share buttons locations that should be turned off by default * * @return {Array} */ public static function get_default_sb_off_locations() { return array( array( 'name' => 'post_above_content', 'counter' => 'badge-counter', 'enabled' => false, ), array( 'name' => 'page_above_content', 'counter' => 'badge-counter', 'enabled' => false, ), array( 'name' => 'index_above_content', 'counter' => 'badge-counter', 'enabled' => false, ), array( 'name' => 'category_above_content', 'counter' => 'badge-counter', 'enabled' => false, ), ); } /** * Get recommendations locations that should be turned on by default * * @return {Array} */ public static function get_default_rec_on_locations() { return array( array( 'name' => 'post_below_content', 'enabled' => true, ), array( 'name' => 'page_below_content', 'enabled' => true, ), ); } /** * Get recommendations locations that should be turned off by default * * @return {Array} */ public static function get_default_rec_off_locations() { return array( array( 'name' => 'index_below_content', 'enabled' => false, ), array( 'name' => 'category_below_content', 'enabled' => false, ), ); } /** * Given an object, set the default on/off locations * for share buttons and recommendations */ public static function set_default_location_settings( $location_name_ids ) { $turned_on_share_buttons_locations = self::get_default_sb_on_locations(); $turned_off_share_buttons_locations = self::get_default_sb_off_locations(); $turned_on_recommendations_locations = self::get_default_rec_on_locations(); $turned_off_recommendations_locations = self::get_default_rec_off_locations(); $turned_on_share_buttons_keys = array(); foreach ( $turned_on_share_buttons_locations as $loc ) { $turned_on_share_buttons_keys[] = $loc['name']; } $turned_on_recommendations_keys = array(); foreach ( $turned_on_recommendations_locations as $loc ) { $turned_on_recommendations_keys[] = $loc['name']; } $turned_off_share_buttons_keys = array(); foreach ( $turned_off_share_buttons_locations as $loc ) { $turned_off_share_buttons_keys[] = $loc['name']; } $turned_off_recommendations_keys = array(); foreach ( $turned_off_recommendations_locations as $loc ) { $turned_off_recommendations_keys[] = $loc['name']; } $turn_on = array( 'share_buttons' => self::associative_array_slice( $location_name_ids['share_buttons'], $turned_on_share_buttons_keys ), 'recommendations' => self::associative_array_slice( $location_name_ids['recommendations'], $turned_on_recommendations_keys ), ); $turn_off = array( 'share_buttons' => self::associative_array_slice( $location_name_ids['share_buttons'], $turned_off_share_buttons_keys ), 'recommendations' => self::associative_array_slice( $location_name_ids['recommendations'], $turned_off_recommendations_keys ), ); self::turn_on_locations( $turn_on, $turn_off ); } /** * Log reasons for a failure of a response. * * Checks if the code is not a 20*, the response body * is not an array, and whether the response object * was false. Sends the appropriate logging message. * * @param string $name the name of the event to log * @param mixed $response the response object */ public static function log_bad_response( $name, $response ) { if ( $response && is_array( $response ) && ! preg_match( '/20*/', $response['response']['code'] ) ) { self::log_event( $name, array( 'reason' => 'the response was a ' . $response['response']['code'] ) ); } elseif ( $response && ! is_array( $response ) ) { $thing = preg_replace( '/\n/', '', var_export( $response, true ) ); self::log_event( $name, array( 'reason' => 'the publisher configuration was not an array, it was this ' . $thing ) ); } } /** * Returns the site's url stripped of protocol. * * @return string */ public static function site_url() { return preg_replace( '/https?:\/\//', '', site_url() ); } /** * Returns the site's name * * @return string */ public static function site_name() { return get_bloginfo( 'name' ) ? get_bloginfo( 'name' ) : site_url(); } /** * Returns the site's primary locale / language * * @return string */ public static function site_language() { $site_language = strtolower( get_bloginfo( 'language' ) ); if ( strpos( $site_language, 'en-' ) !== false ) { $language_id = 9; // English! } elseif ( strpos( $site_language, 'da-' ) !== false ) { $language_id = 7; // Danish! } elseif ( strpos( $site_language, 'de-' ) !== false ) { $language_id = 13; // German! } elseif ( strpos( $site_language, 'es-' ) !== false ) { $language_id = 31; // Spanish! } elseif ( strpos( $site_language, 'fr-' ) !== false ) { $language_id = 12; // French! } elseif ( strpos( $site_language, 'pt-' ) !== false ) { $language_id = 25; // Portuguese! } elseif ( strpos( $site_language, 'it-' ) !== false ) { $language_id = 18; // Italian! } elseif ( strpos( $site_language, 'zh-cn' ) !== false ) { $language_id = 3; // Chinese (Simplified)! } elseif ( strpos( $site_language, 'zh-tw' ) !== false ) { $language_id = 4; // Chinese (Traditional)! } elseif ( strpos( $site_language, 'ja-' ) !== false ) { $language_id = 19; // Japanese! } elseif ( strpos( $site_language, 'ar-' ) !== false ) { $language_id = 1; // Arabic! } elseif ( strpos( $site_language, 'sv-' ) !== false ) { $language_id = 32; // Swedish! } elseif ( strpos( $site_language, 'tr-' ) !== false ) { $language_id = 34; // Turkish! } elseif ( strpos( $site_language, 'el-' ) !== false ) { $language_id = 14; // Greek! } elseif ( strpos( $site_language, 'nl-' ) !== false ) { $language_id = 8; // Dutch! } elseif ( strpos( $site_language, 'pl-' ) !== false ) { $language_id = 24; // Polish! } elseif ( strpos( $site_language, 'ru-' ) !== false ) { $language_id = 27; // Russian! } elseif ( strpos( $site_language, 'cs-' ) !== false ) { $language_id = 6; // Czech! } else { $language_id = null; } return $language_id; } /** * Shockingly the built in PHP array_merge_recursive function is stupid. * this is stolen from the PHP docs and will overwrite existing keys instead * of appending the values. * * http://www.php.net/manual/en/function.array-merge-recursive.php#92195 * * @param array $array1 * @param array $array2 * @return array */ public static function array_merge_recursive_distinct( array &$array1, array &$array2 ) { $merged = $array1; foreach ( $array2 as $key => &$value ) { if ( is_array( $value ) && isset( $merged [ $key ] ) && is_array( $merged [ $key ] ) ) { if ( empty( $value ) ) { $merged[ $key ] = array(); } else { $merged [ $key ] = self::array_merge_recursive_distinct( $merged [ $key ], $value ); } } else { $merged [ $key ] = $value; } } return $merged; } /** * Array casting an object is not recursive, this makes it recursive * * @param object $d * * http://www.if-not-true-then-false.com/2009/php-tip-convert-stdclass-object-to-multidimensional-array-and-convert-multidimensional-array-to-stdclass-object/ */ public static function object_to_array( $d ) { if ( is_object( $d ) ) { // Gets the properties of the given object // with get_object_vars function $d = get_object_vars( $d ); } if ( is_array( $d ) ) { /* * Return array converted to object */ return array_map( array( 'self', 'object_to_array' ), $d ); } else { // Return array return $d; } } /** * Wrapper for the Shareaholic Content Manager Single Page worker API * * @param string $post_id */ public static function notify_content_manager_singlepage( $post = null, $status = null ) { if ( $post == null ) { return; } $api_key = self::get_option( 'api_key' ); if ( self::has_accepted_terms_of_service() && ! empty( $api_key ) ) { if ( $status != null ) { $visiblity = $status; } else { $visiblity = $post->post_status; } if ( in_array( $post->post_status, array( 'draft', 'pending' ) ) ) { // Get the correct permalink for a draft $my_post = clone $post; $my_post->post_status = 'published'; $my_post->post_name = sanitize_title( $my_post->post_name ? $my_post->post_name : $my_post->post_title, $my_post->ID ); $post_permalink = get_permalink( $my_post ); } else { $post_permalink = get_permalink( $post->ID ); } if ( $post_permalink != null && ( strpos( $post_permalink, '__trashed' ) == false ) && ! in_array( $post->post_status, array( 'auto-draft', 'inherit' ) ) ) { $cm_single_page_job_url = Shareaholic::CM_API_URL . '/jobs/uber_single_page'; $payload = array( 'args' => array( $post_permalink, array( 'force' => true, ), ), 'api_key' => self::get_option( 'api_key' ), 'verification_key' => self::get_option( 'verification_key' ), 'admin_ajax_path' => admin_url( 'admin-ajax.php' ), 'wp_version' => Shareaholic::VERSION, 'post_visibility' => $visiblity, ); $response = ShareaholicCurl::post( $cm_single_page_job_url, $payload, 'json' ); } } } /** * Wrapper for the Shareaholic Content Manager Single Domain worker API */ public static function notify_content_manager_singledomain() { $domain = get_bloginfo( 'url' ); if ( $domain != null ) { $cm_single_domain_job_url = Shareaholic::CM_API_URL . '/jobs/single_domain'; $payload = array( 'args' => array( $domain, array( 'force' => true, ), ), 'api_key' => self::get_option( 'api_key' ), 'verification_key' => self::get_option( 'verification_key' ), 'admin_ajax_path' => admin_url( 'admin-ajax.php' ), 'wp_version' => Shareaholic::VERSION, ); $response = ShareaholicCurl::post( $cm_single_domain_job_url, $payload, 'json' ); } } /** * This is a wrapper for the Event API * * @param string $event_name the name of the event * @param array $extra_params any extra data points to be included */ public static function log_event( $event_name = 'Default', $extra_params = false ) { $event_metadata = array( 'plugin_version' => Shareaholic::VERSION, 'api_key' => self::get_option( 'api_key' ), 'domain' => get_bloginfo( 'url' ), 'diagnostics' => array( 'php_version' => phpversion(), 'wp_version' => get_bloginfo( 'version' ), 'theme' => get_option( 'template' ), 'multisite' => is_multisite(), ), 'features' => array( 'share_buttons' => self::get_option( 'share_buttons' ), 'recommendations' => self::get_option( 'recommendations' ), ), ); if ( $extra_params ) { $event_metadata = array_merge( $event_metadata, $extra_params ); } $event_api_url = Shareaholic::API_URL . '/api/events'; $event_params = array( 'name' => 'WordPress:' . $event_name, 'data' => json_encode( $event_metadata ), ); $response = ShareaholicCurl::post( $event_api_url, $event_params, '', true, 2 ); } /** * This is a wrapper for the Heartbeat API */ public static function heartbeat() { $data = array( 'platform' => 'wordpress', 'plugin_name' => 'shareaholic', 'plugin_version' => Shareaholic::VERSION, 'api_key' => self::get_option( 'api_key' ), 'verification_key' => self::get_option( 'verification_key' ), 'domain' => preg_replace( '#^https?://#', '', get_bloginfo( 'url' ) ), 'language' => get_bloginfo( 'language' ), 'stats' => self::get_stats(), 'diagnostics' => array( 'tos_status' => self::has_accepted_terms_of_service(), 'shareaholic_server_reachable' => self::connectivity_check(), 'server_side_share_count_api_reachable' => self::share_counts_api_connectivity_check(), 'php_version' => phpversion(), 'wp_version' => get_bloginfo( 'version' ), 'theme' => get_option( 'template' ), 'multisite' => is_multisite(), 'plugins' => array( 'active' => self::get_active_plugins(), ), ), 'endpoints' => array( 'ajax_url' => admin_url( 'admin-ajax.php' ), ), 'advanced_settings' => array( 'server_side_share_count_api' => self::get_internal_share_counts_api_status(), 'facebook_access_token' => self::fetch_fb_access_token() === false ? 'no' : 'yes', 'facebook_auth_check' => self::facebook_auth_check(), 'enable_user_nicename' => self::get_option( 'enable_user_nicename' ), 'disable_og_tags' => self::get_option( 'disable_og_tags' ), 'disable_admin_bar_menu' => self::get_option( 'disable_admin_bar_menu' ), 'recommendations_display_on_excerpts' => self::get_option( 'recommendations_display_on_excerpts' ), 'share_buttons_display_on_excerpts' => self::get_option( 'share_buttons_display_on_excerpts' ), ), ); $heartbeat_api_url = Shareaholic::API_URL . '/api/plugin_heartbeats'; $response = ShareaholicCurl::post( $heartbeat_api_url, $data, 'json', true, 2 ); } /** * This loads the locales */ public static function localize() { load_plugin_textdomain( 'shareaholic', false, basename( dirname( __FILE__ ) ) . '/languages/' ); } /** * Function to return a list of permalink keywords * * @return list of keywords for the given permalink in an array */ public static function permalink_keywords( $post_id = null ) { global $post; $keywords = ''; if ( $post_id != null ) { $id = $post_id; } else { $id = $post->ID; } // Get post tags $keywords = implode( ', ', wp_get_post_tags( $id, array( 'fields' => 'names' ) ) ); // Support for "All in One SEO Pack" plugin keywords if ( get_post_meta( $id, '_aioseop_keywords' ) != null ) { $keywords .= ', ' . stripslashes( get_post_meta( $id, '_aioseop_keywords', true ) ); } // Support for "WordPress SEO by Yoast" plugin keywords if ( get_post_meta( $id, '_yoast_wpseo_focuskw' ) != null ) { $keywords .= ', ' . stripslashes( get_post_meta( $id, '_yoast_wpseo_focuskw', true ) ); } if ( get_post_meta( $id, '_yoast_wpseo_metakeywords' ) != null ) { $keywords .= ', ' . stripslashes( get_post_meta( $id, '_yoast_wpseo_metakeywords', true ) ); } // Support for "Add Meta Tags" plugin keywords if ( get_post_meta( $id, '_amt_keywords' ) != null ) { $keywords .= ', ' . stripslashes( get_post_meta( $id, '_amt_keywords', true ) ); } if ( get_post_meta( $id, '_amt_news_keywords' ) != null ) { $keywords .= ', ' . stripslashes( get_post_meta( $id, '_amt_news_keywords', true ) ); } // Encode, lowercase & trim appropriately $keywords = self::normalize_keywords( $keywords ); // Unique keywords $keywords_array = array(); $keywords_array = explode( ', ', $keywords ); $keywords_array = array_unique( $keywords_array ); if ( empty( $keywords_array[0] ) ) { return array(); } else { return $keywords_array; } } /** * Normalizes and cleans up a list of comma separated keywords ie. encode, lowercase & trim appropriately * * @param string $keywords * @return string */ public static function normalize_keywords( $keywords ) { return trim( trim( strtolower( trim( htmlspecialchars( htmlspecialchars_decode( $keywords ), ENT_QUOTES ) ) ), ',' ) ); } /** * Function to return a thumbnail for a given permalink * * @return thumbnail URL */ public static function permalink_thumbnail( $post_id = null, $size = 'shareaholic-thumbnail' ) { $thumbnail_src = ''; // Get Featured Image $thumbnail_src = self::post_featured_image( $size ); // Get first image included in the post if ( $thumbnail_src == null ) { $thumbnail_src = self::post_first_image( $post_id ); } if ( $thumbnail_src == null ) { return null; } else { return $thumbnail_src; } } /** * This function returns the URL of the featured image for a given post * * @return returns `false` or a string of the image src */ public static function post_featured_image( $size = 'shareaholic-thumbnail' ) { global $post; $featured_img = ''; if ( $post == null ) { return false; } else { if ( function_exists( 'has_post_thumbnail' ) && has_post_thumbnail( $post->ID ) ) { // note: wp_get_attachment_image_src returns either an array or NULL $thumbnail_shareaholic = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'shareaholic-thumbnail' ); $thumbnail_full = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' ); // Original image resolution (unmodified) if ( ( $size == 'shareaholic-thumbnail' ) && ( ! empty( $thumbnail_shareaholic[0]) && ! empty( $thumbnail_full[0]) ) && ( $thumbnail_shareaholic[0] !== $thumbnail_full[0] ) ) { $featured_img = esc_attr( $thumbnail_shareaholic[0] ); } else { if ( $size == 'shareaholic-thumbnail' ) { $thumbnail_large = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'large' ); // Large resolution (default 1024px x 1024px max) } else { $thumbnail_large = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), $size ); } if ( is_array( $thumbnail_large ) ) { $featured_img = esc_attr( $thumbnail_large[0] ); } } } else { return false; } } return $featured_img; } /** * Return Facebook Access Token */ public static function fetch_fb_access_token() { if ( self::get_option( 'facebook_app_id' ) && self::get_option( 'facebook_app_secret' ) ) { return self::get_option( 'facebook_app_id' ) . '%7C' . self::get_option( 'facebook_app_secret' ); } return false; } /** * This function grabs the URL of the first image in a given post * * @return returns `false` or a string of the image src */ public static function post_first_image() { global $post; $first_img = ''; if ( $post == null ) { return false; } else { $output = preg_match_all( '//i', $post->post_content, $matches ); if ( isset( $matches[1][0] ) ) { // Exclude base64 images; meta tags require full URLs if ( strpos( $matches[1][0], 'data:' ) === false ) { $first_img = $matches[1][0]; } } else { return false; } return $first_img; } } /** * WP Rocket Compatability - Excludes Shareaholic scripts from JS minification, etc * * @param Array $excluded_external An array of JS hosts * @return Array the updated array of hosts */ public static function rocket_exclude_js( $excluded_external ) { if ( defined( 'WP_ROCKET_VERSION' ) ) { $excluded_external[] = 'cdn.shareaholic.net'; $excluded_external[] = 'k4z6w9b5.stackpathcdn.com'; return $excluded_external; } } /* * Clears cache created by caching plugins like W3 Total Cache * */ public static function clear_cache() { // Default WordPress? if ( function_exists( 'wp_cache_flush' ) ) { wp_cache_flush(); } // W3 Total Cache plugin? if ( function_exists( 'w3tc_pgcache_flush' ) ) { w3tc_pgcache_flush(); } // WP Super Cache? if ( function_exists( 'wp_cache_clear_cache' ) ) { if ( is_multisite() ) { $blog_id = get_current_blog_id(); wp_cache_clear_cache( $blog_id ); } else { wp_cache_clear_cache(); } } // Hyper Cache? if ( function_exists( 'hyper_cache_flush_all' ) ) { hyper_cache_flush_all(); } // WP Fastest Cache if ( class_exists( 'WpFastestCache' ) ) { $WpFastestCache = new WpFastestCache(); if ( method_exists( $WpFastestCache, 'deleteCache' ) ) { $WpFastestCache->deleteCache(); } } // WPEngine? if ( class_exists( 'WpeCommon' ) ) { if ( method_exists( 'WpeCommon', 'purge_memcached' ) ) { WpeCommon::purge_memcached(); } if ( method_exists( 'WpeCommon', 'clear_maxcdn_cache' ) ) { WpeCommon::clear_maxcdn_cache(); } if ( method_exists( 'WpeCommon', 'purge_varnish_cache' ) ) { WpeCommon::purge_varnish_cache(); } } // Cachify Cache? if ( has_action( 'cachify_flush_cache' ) ) { do_action( 'cachify_flush_cache' ); } // Quick Cache? if ( function_exists( 'auto_clear_cache' ) ) { auto_clear_cache(); } // Zencache? if ( class_exists( 'zencache' ) ) { zencache::clear(); } // CometCache? if ( class_exists( 'comet_cache' ) ) { comet_cache::clear(); } } /** * List below is from Jetpack, with a few custom additions: * Source: https://github.com/Automattic/jetpack/blob/master/sync/class.jetpack-sync-defaults.php **/ static $blacklisted_post_types = array( 'nav_menu_item', 'attachment', 'ai1ec_event', 'bwg_album', 'bwg_gallery', 'customize_changeset', // WP built-in post type for Customizer changesets 'dn_wp_yt_log', 'http', 'idx_page', 'jetpack_migration', 'postman_sent_mail', 'rssap-feed', 'rssmi_feed_item', 'secupress_log_action', 'sg_optimizer_jobs', 'snitch', 'wpephpcompat_jobs', 'wprss_feed_item', 'wp_automatic', 'jp_sitemap_master', 'jp_sitemap', 'jp_sitemap_index', 'jp_img_sitemap', 'jp_img_sitemap_index', 'jp_vid_sitemap', 'jp_vid_sitemap_index', ); /** * A post just transitioned state. Do something. */ public static function post_transitioned( $new_status, $old_status, $post ) { $post_type = get_post_type( $post ); // exit if blacklisted post type if ( $post_type && in_array( $post_type, self::$blacklisted_post_types ) ) { return; } if ( $new_status == 'publish' ) { // Post was just published self::notify_content_manager_singlepage( $post ); } if ( $old_status == 'publish' && $new_status != 'publish' ) { // Notify CM that the post is no longer public self::notify_content_manager_singlepage( $post ); } } /** * Server Connectivity check */ public static function connectivity_check() { $health_check_url = Shareaholic::API_URL . '/haproxy_health_check'; $response = ShareaholicCurl::get( $health_check_url ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '200' ) { return 'SUCCESS'; } else { return 'FAIL'; } } else { return 'FAIL'; } } /** * Site ID 200 check */ public static function site_id_is200() { $api_key = self::get_option( 'api_key' ); if ( $api_key ) { if (strlen( $api_key ) < 30 ) { return 'invalid_apikey'; } $response = ShareaholicCurl::get( Shareaholic::API_URL . "/publisher_tools/{$api_key}.json" ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '200' ) { return '200'; } else { return 'not_200'; } } else { return 'no_connection'; } } else { return 'no_apikey'; } } /** * Site ID 404 check */ public static function site_id_is404() { $api_key = self::get_option( 'api_key' ); if ( $api_key ) { if (strlen( $api_key ) < 30 ) { return 'invalid_apikey'; } $response = ShareaholicCurl::get( Shareaholic::API_URL . "/publisher_tools/{$api_key}.json" ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '404' ) { return '404'; } else { return 'not_404'; } } else { return 'no_connection'; } } else { return 'no_apikey'; } } /** * Manages V8 => V9 upgrade */ public static function EightToNineUpdate() { $api_key = self::get_option( 'api_key' ); if ( $api_key ) { $response = ShareaholicCurl::get( Shareaholic::API_URL . "/publisher_tools/{$api_key}.json" ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '404' ) { // Site ID is not active in Shareaholic Cloud. return; } } // If Cloud location = off then set Plugin location = off. $publisher_configuration = $response['body']; if ( $publisher_configuration && is_array( $publisher_configuration ) ) { foreach ( array( 'share_buttons', 'recommendations' ) as $app ) { $cloud_result = array(); foreach ( $publisher_configuration['apps'][ $app ]['locations'] as $key => $val ) { if ( array_key_exists( $val['name'], self::get_option( $app ) ) ) { // Update only if location already exists in Plugin settings if ( $val['enabled'] == false ) { self::update_options( array( $app => array( $val['name'] => 'off' ) ) ); } } } } } // Send Plugin settings to Cloud. self::location_sync_to_cloud(); } } /** * Prepare associative array of locations, and their parameters. */ public static function prepareLocationsArray( $locations ) { $formatted_app_locations = array(); foreach ( $locations as $key => $val ) { if ( $val == 'on' ) { $formatted_app_locations[ $key ] = array( 'enabled' => true ); } else { $formatted_app_locations[ $key ] = array( 'enabled' => false ); } } if ( empty( $formatted_app_locations ) ) { // By casting the array into an object, json_encode will always use braces instead of brackets for the value (even when empty) return (object) array(); } else { return $formatted_app_locations; } } /** * Sync In-Page Location Blocks - Shareaholic Cloud => WP Plugin */ public static function location_sync_update_plugin() { $api_key = self::get_option( 'api_key' ); if ( $api_key ) { $response = ShareaholicCurl::get( Shareaholic::API_URL . "/publisher_tools/{$api_key}.json" ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '404' ) { // Site ID is not active in Shareaholic Cloud return; } } $publisher_configuration = $response['body']; if ( $publisher_configuration && is_array( $publisher_configuration ) ) { foreach ( array( 'share_buttons', 'recommendations' ) as $app ) { $cloud_result = array(); foreach ( $publisher_configuration['apps'][ $app ]['locations'] as $key => $val ) { if ( array_key_exists( $val['name'], self::get_option( $app ) ) ) { // Update only if location already exists in Plugin settings if ( $val['enabled'] == true ) { self::update_options( array( $app => array( $val['name'] => 'on' ) ) ); } else { self::update_options( array( $app => array( $val['name'] => 'off' ) ) ); } } } } } } } /** * Sync status of In-Page Location Blocks - WP Plugin <=> Shareaholic Cloud */ public static function location_sync_status() { $api_key = self::get_option( 'api_key' ); if ( $api_key ) { $app_locations = array( 'share_buttons' => self::prepareLocationsArray( self::get_option( 'share_buttons' ) ), 'recommendations' => self::prepareLocationsArray( self::get_option( 'recommendations' ) ), ); $payload = array( 'verification_key' => self::get_option( 'verification_key' ), 'app_locations' => $app_locations, ); $sync_status_url = Shareaholic::API_URL . '/publisher_tools/' . $api_key . '/sync/status'; $response = ShareaholicCurl::post( $sync_status_url, $payload, 'json', true ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '200' ) { return 200; } if ( $response_code == '409' ) { return 409; } if ( $response_code == '404' ) { return 404; } } else { return null; } } } /** * Sync In-Page Location Blocks - WP Plugin => Shareaholic Cloud */ public static function location_sync_to_cloud() { $api_key = self::get_option( 'api_key' ); if ( $api_key ) { $app_locations = array( 'share_buttons' => self::prepareLocationsArray( self::get_option( 'share_buttons' ) ), 'recommendations' => self::prepareLocationsArray( self::get_option( 'recommendations' ) ), ); $payload = array( 'verification_key' => self::get_option( 'verification_key' ), 'app_locations' => $app_locations, ); $sync_url = Shareaholic::API_URL . '/publisher_tools/' . $api_key . '/sync'; $response = ShareaholicCurl::post( $sync_url, $payload, 'json', true ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '200' ) { return true; } } else { return null; } } } /** * Facebook Auth Token check */ public static function facebook_auth_check() { if ( self::fetch_fb_access_token() === false ) { self::update_options( array( 'facebook_auth_check' => 'FAIL' ) ); return 'FAIL'; } $health_check_url = 'https://graph.facebook.com/?id=https://www.google.com/&access_token=' . self::fetch_fb_access_token(); $response = ShareaholicCurl::get( $health_check_url ); if ( is_array( $response ) && array_key_exists( 'body', $response ) ) { $response_code = wp_remote_retrieve_response_code( $response ); if ( $response_code == '200' ) { self::update_options( array( 'facebook_auth_check' => 'SUCCESS' ) ); return 'SUCCESS'; } else { self::update_options( array( 'facebook_auth_check' => 'FAIL' ) ); return 'FAIL'; } } else { return 'FAIL'; } } /** * Share Counts API Connectivity check */ public static function share_counts_api_connectivity_check() { // if we already checked and it is successful, then do not call the API again $share_counts_connect_check = self::get_option( 'share_counts_connect_check' ); if ( isset( $share_counts_connect_check ) && $share_counts_connect_check == 'SUCCESS' ) { return $share_counts_connect_check; } $services_config = ShareaholicSeqShareCount::get_services_config(); $services = array_keys( $services_config ); $param_string = implode( '&services[]=', $services ); $share_counts_api_url = admin_url( 'admin-ajax.php' ) . '?action=shareaholic_share_counts_api&url=https%3A%2F%2Fwww.google.com%2F&services[]=' . $param_string; $cache_key = 'share_counts_api_connectivity_check'; $response = get_transient( $cache_key ); if ( ! $response ) { $response = ShareaholicCurl::get( $share_counts_api_url, array(), '', true ); } $response_status = self::get_share_counts_api_status( $response ); // if this was the first time we are doing this and it failed, disable // the share counts API if ( empty( $share_counts_connect_check ) && $response_status == 'FAIL' ) { self::update_options( array( 'disable_internal_share_counts_api' => 'on' ) ); } if ( $response_status == 'SUCCESS' ) { set_transient( $cache_key, $response, SHARE_COUNTS_CHECK_CACHE_LENGTH ); } self::update_options( array( 'share_counts_connect_check' => $response_status ) ); return $response_status; } /** * Check the share counts API for empty response or missing services */ public static function get_share_counts_api_status( $response ) { if ( ! $response || ! isset( $response['body'] ) || ! is_array( $response['body'] ) || ! isset( $response['body']['data'] ) ) { return 'FAIL'; } // Did it return at least 4 services? $has_majority_services = count( array_keys( $response['body']['data'] ) ) >= 4 ? true : false; $has_important_services = true; // Does it have counts for facebook, pinterest? foreach ( array( 'facebook', 'pinterest' ) as $service ) { if ( ! isset( $response['body']['data'][ $service ] ) || ! is_numeric( $response['body']['data'][ $service ] ) ) { $has_important_services = false; } } if ( ! $has_majority_services || ! $has_important_services ) { return 'FAIL'; } return 'SUCCESS'; } /** * Call the content manager for a post before it is trashed * * We do this because permalink changes on being trashed * and so we tell CM that the old permalink is no longer valid */ public static function before_post_is_trashed( $post_id ) { $post_type = get_post_type( $post_id ); // exit if blacklisted post type if ( $post_type && in_array( $post_type, self::$blacklisted_post_types ) ) { return; } self::notify_content_manager_singlepage( get_post( $post_id ), 'trash' ); } /** * Call the content manager for a post before it is updated * * We do this because a user may change their permalink * and so we tell CM that the old permalink is no longer valid */ public static function before_post_is_updated( $post_id ) { $post_type = get_post_type( $post_id ); // exit if blacklisted post type if ( $post_type && in_array( $post_type, self::$blacklisted_post_types ) ) { return; } self::notify_content_manager_singlepage( get_post( $post_id ) ); } public static function user_info() { $user_info = array(); if ( function_exists( 'wp_get_current_user' ) ) { $current_user = wp_get_current_user(); if ( ! ( $current_user instanceof WP_User ) || ! is_user_logged_in() ) { return array(); } $user_caps = $current_user->get_role_caps(); $caps = array( 'switch_themes', 'edit_themes', 'activate_plugins', 'edit_plugins', 'manage_options', 'unfiltered_html', 'edit_dashboard', 'update_plugins', 'delete_plugins', 'install_plugins', 'update_themes', 'install_themes', 'update_core', 'edit_theme_options', 'delete_themes', 'administrator', ); $user_info = array( 'username' => $current_user->user_login, 'email' => $current_user->user_email, 'roles' => $current_user->roles, 'capabilities' => array(), 'is_super_admin' => is_super_admin(), ); foreach ( $caps as $cap ) { $user_info['capabilities'][ $cap ] = isset( $user_caps[ $cap ] ) ? $user_caps[ $cap ] : ''; } } return $user_info; } /** * Shorten a string to a certain character limit * If the limit is reached, then return the truncated text * * @param {String} $text the text to truncate. * @param {Number} $char_count the max number of characters. * @return {String} the truncated text */ public static function truncate_text( $text, $char_count ) { $words = preg_split( '/\s+/', $text ); $truncated_text = ''; foreach ( $words as $word ) { if ( strlen( $word ) + strlen( $truncated_text ) >= $char_count ) { break; } $truncated_text .= ' ' . $word; } return trim( $truncated_text ); } }