logger->info('mashsbGetShareObj() url: ' . $url); $mashsbSharesObj = new mashengine($url); return $mashsbSharesObj; } /* * Use the correct share method depending on mashshare networks enabled or not * * @since 2.0.9 * @returns int share count */ function mashsbGetShareMethod($mashsbSharesObj) { if (class_exists('MashshareNetworks')) { $mashsbShareCounts = $mashsbSharesObj->getAllCounts(); return $mashsbShareCounts; } $mashsbShareCounts = $mashsbSharesObj->getFBTWCounts(); return $mashsbShareCounts; } /** * Get share count for all non singular pages where $post is empty or a custom url is used E.g. category or blog list pages or for shortcodes * Uses transients * * @param string $url * * @returns integer $shares */ function mashsbGetNonPostShares($url) { global $mashsb_debug; /* * Deactivate share count on: * - 404 pages * - search page * - empty url * - disabled permalinks * - disabled share count setting * - rate limit exceeded * - deprecated: admin pages (we need to remove this for themes which are using a bad infinite scroll implementation where is_admin() is always true) */ if (is_404() || is_search() || empty($url) || !mashsb_is_enabled_permalinks() || isset($mashsb_options['disable_sharecount']) || mashsb_rate_limit_exceeded()) { $mashsb_debug[] = 'MashShare: Share count (temporary) disabled'; return apply_filters('filter_get_sharedcount', 0); } // Expiration $expiration = mashsb_get_expiration(); // Remove variables, parameters and trailingslash $url_clean = mashsb_sanitize_url($url); // Get any existing copy of our transient data and fill the cache if (mashsb_force_cache_refresh()) { // Regenerate the data and save the transient // Get the share Object $mashsbSharesObj = mashsbGetShareObj($url_clean); // Get the share counts object $mashsbShareCounts = mashsbGetShareMethod($mashsbSharesObj); // Set the transient and return shares set_transient('mashcount_' . md5($url_clean), $mashsbShareCounts->total, $expiration); MASHSB()->logger->info('mashsbGetNonPostShares set_transient - shares:' . $mashsbShareCounts->total . ' url: ' . $url_clean); return $mashsbShareCounts->total + getFakecount(); } else { mashsbGetShareCountFromTransient($url_clean); } } /** * get share count from transient * @param string * @return int */ function mashsbGetShareCountFromTransient($url) { $shares = get_transient('mashcount_' . md5($url)); if (isset($shares) && is_numeric($shares)) { MASHSB()->logger->info('mashsbGetNonPostShares() get shares from get_transient. URL: ' . $url . ' SHARES: ' . $shares); return $shares + getFakecount(); } else { return 0 + getFakecount(); // we need a result } } /** * Allow or disable share counts for particular posts types to lower the api requests to sharedcount.com * @return boolean */ function mashsbIsPostTypeAllowed() { $postType = get_post_type(); $allowedPostTypes = apply_filters('mashsb_allowed_post_types', array()); // If $allowedPostTypes is not defined all post types are allowed if (empty($allowedPostTypes)) { return true; } // If filter is used check if current post type is in array of allowed ones if (in_array($postType, $allowedPostTypes)) { return true; } return false; } /* * Return the share count * * @param string url of the page the share count is collected for * @returns int */ function getSharedcount($url) { global $mashsb_options, $post, $mashsb_sharecount, $mashsb_debug; // todo test a global share count var if it reduces the amount of requests /* * Deactivate share count on: * - preview pages * - 404 pages * - search page * - empty url * - disabled permalinks * - disabled share count setting * - rate limit exceeded * - deprecated: admin pages (we need to remove this for themes which are using a bad infinite scroll implementation where is_admin() is always true) */ if (is_preview()) { return 0; } if (is_404() || is_search() || empty($url) || !mashsb_is_enabled_permalinks() || isset($mashsb_options['disable_sharecount']) || isset($_GET['preview_id'])) { $mashsb_debug[] = 'MashShare: Share count (temporary) disabled'; return apply_filters('filter_get_sharedcount', 0); } $mashsb_debug[] = 'Trying to get share count!'; // Return global share count variable to prevent multiple execution if (is_array($mashsb_sharecount) && array_key_exists($url, $mashsb_sharecount) && !empty($mashsb_sharecount[$url]) && !mashsb_is_cache_refresh()) { return $mashsb_sharecount[$url] + getFakecount(); } // Remove mashsb-refresh query parameter $url = mashsb_sanitize_url($url); /* * Return share count on non singular pages when url is defined Possible: Category, blog list pages, non singular() pages. This store the shares in transients with mashsbGetNonPostShares(); */ if (!empty($url) && is_null($post)) { $mashsb_debug[] = '$url or $post is empty. Return share count with mashsbGetNonPostShares'; return apply_filters('filter_get_sharedcount', mashsbGetNonPostShares($url)); } /* * Refresh Cache */ if (mashsb_force_cache_refresh() && is_singular()) { $mashsb_debug[] = 'Force Cache Refresh for page type singular()'; // free some memory unset ($mashsb_sharecount[$url]); // Write timestamp (Use this on top of this condition. If this is not on top following return statements will be skipped and ignored - possible bug?) update_post_meta($post->ID, 'mashsb_timestamp', time()); MASHSB()->logger->info('Refresh Cache: Update Timestamp: ' . time()); $mashsb_debug[] = 'Refresh Cache: Update Timestamp: ' . time(); // Get the share Object $mashsbSharesObj = mashsbGetShareObj($url); // Get the share count Method $mashsbShareCounts = mashsbGetShareMethod($mashsbSharesObj); // Get stored share count $mashsbStoredShareCount = get_post_meta($post->ID, 'mashsb_shares', true); // Create global sharecount $mashsb_sharecount = array($url => $mashsbShareCounts->total); $mashsb_debug[] = 'Get Share count for URL: ' . $url . ' Shares: ' . $mashsbShareCounts->total; MASHSB()->logger->info('Get Share count for URL: ' . $url . ' Shares: ' . $mashsbShareCounts->total); /* * Update post_meta only when API is requested and * API share count is greater than real fresh requested share count -> */ if (is_numeric($mashsbShareCounts->total) && $mashsbShareCounts->total >= $mashsbStoredShareCount) { update_post_meta($post->ID, 'mashsb_shares', $mashsbShareCounts->total); update_post_meta($post->ID, 'mashsb_jsonshares', json_encode($mashsbShareCounts)); MASHSB()->logger->info("Refresh Cache: Update database with share count: " . $mashsbShareCounts->total); /* return counts from getAllCounts() after DB update */ return apply_filters('filter_get_sharedcount', $mashsbShareCounts->total + getFakecount()); } /* return previous counts from DB Cache | this happens when API has a hiccup and does not return any results as expected */ return apply_filters('filter_get_sharedcount', $mashsbStoredShareCount + getFakecount()); } else { // Return cached results $cachedCountsMeta = is_numeric($var = get_post_meta($post->ID, 'mashsb_shares', true)) ? (int)$var : 0; $cachedCounts = $cachedCountsMeta + getFakecount(); $mashsb_debug[] = 'Cached Results: ' . $cachedCounts . ' url:' . $url; MASHSB()->logger->info('Cached Results: ' . $cachedCounts . ' url:' . $url); return apply_filters('filter_get_sharedcount', $cachedCounts); } } function mashsb_subscribe_button() { global $mashsb_options; if ($mashsb_options['networks'][2]) { $subscribebutton = '' . __('Subscribe', 'mashsb') . ''; } else { $subscribebutton = ''; } return apply_filters('mashsb_filter_subscribe_button', $subscribebutton); } /* Put the Subscribe container under the share buttons * @since 2.0.0. * @return string */ function mashsb_subscribe_content() { global $mashsb_options; if (isset($mashsb_options['networks'][2]) && isset($mashsb_options['subscribe_behavior']) && $mashsb_options['subscribe_behavior'] === 'content') { //Subscribe content enabled $container = '
' . mashsb_cleanShortcode('mashshare', $mashsb_options['subscribe_content']) . '
'; } else { $container = ''; } return apply_filters('mashsb_toggle_container', $container); } /* Check if [mashshare] shortcode is used in subscribe field and deletes it * Prevents infinte loop * * @since 2.0.9 * @return string / shortcodes parsed */ function mashsb_cleanShortcode($code, $content) { global $shortcode_tags; $stack = $shortcode_tags; $shortcode_tags = array($code => 1); $content = strip_shortcodes(wp_kses_post($content)); $shortcode_tags = $stack; return do_shortcode($content); } /* Round the totalshares * * @since 1.0 * @param $totalshares int * @return string */ function roundshares($totalshares) { if (!is_numeric($totalshares)){ return '0'; } if ($totalshares > 1000000) { $totalshares = round($totalshares / 1000000, 1) . 'M'; } elseif ($totalshares > 1000) { $totalshares = round($totalshares / 1000, 1) . 'k'; } return apply_filters('get_rounded_shares', $totalshares); } /* Return the more networks button * @since 2.0 * @return string */ function onOffSwitch($size = false) { global $mashsb_options; // Get class names for buttons size $class_size = isset($mashsb_options['buttons_size']) ? ' ' . $mashsb_options['buttons_size'] : ''; // Override size with shortcode argument $class_size = $size ? ' mash-' . $size : $class_size; // Get class names for button style $class_style = isset($mashsb_options['mash_style']) && $mashsb_options['mash_style'] === 'shadow' ? ' mashsb-shadow' : ' mashsb-noshadow'; $output = '
'; return apply_filters('mashsh_onoffswitch', $output); } /* Return the second more networks button after * last hidden additional service. initial status: hidden * Become visible with click on plus icon * * @since 2.0 * @return string */ function onOffSwitch2($size = false) { global $mashsb_options; // Get class names for buttons size $class_size = isset($mashsb_options['buttons_size']) ? ' ' . esc_attr($mashsb_options['buttons_size']) : ''; // Override size with shortcode argument $class_size = $size ? ' mash-' . $size : $class_size; // Get class names for button style $class_style = isset($mashsb_options['mash_style']) && $mashsb_options['mash_style'] === 'shadow' ? ' mashsb-shadow' : ' mashsb-noshadow'; $output = ''; return apply_filters('mashsh_onoffswitch2', $output); } /* * Delete all services from array which are not enabled * @since 2.0.0 * @return callback */ function isStatus($var) { return (!empty($var["status"])); } /* * Array of all available network share urls * * @param string $name id of the network * @param bool $is_shortcode true when function is used in shortcode [mashshare] * * @since 2.1.3 * @return string */ function arrNetworks($name, $is_shortcode) { global $mashsb_custom_url, $mashsb_custom_text, $mashsb_twitter_url; if ($is_shortcode) { $url = !empty($mashsb_custom_url) ? urlencode($mashsb_custom_url) : urlencode(mashsb_get_url()); $title = !empty($mashsb_custom_text) ? $mashsb_custom_text : mashsb_get_title(); $twitter_title = !empty($mashsb_custom_text) ? $mashsb_custom_text : mashsb_get_twitter_title(); } if (!$is_shortcode) { $url = urlencode(mashsb_get_url()); $title = mashsb_get_title(); $twitter_title = mashsb_get_twitter_title(); } $via = mashsb_get_twitter_username() ? '&via=' . mashsb_get_twitter_username() : ''; $networks_arr = array( 'facebook' => 'https://www.facebook.com/sharer.php?u=' . mashsb_append_tracking_param($url, 'facebook'), 'twitter' => 'https://twitter.com/intent/tweet?text=' . $twitter_title . '&url=' . $mashsb_twitter_url . $via, 'subscribe' => '#', 'url' => mashsb_append_tracking_param($url), 'title' => $title ); // Delete custom text unset ($mashsb_custom_text); // Delete custom url unset ($mashsb_custom_url); $networks = apply_filters('mashsb_array_networks', $networks_arr); return isset($networks[$name]) ? $networks[$name] : ''; } /* Returns all available networks * * @since 2.0 * @param bool true when used from shortcode [mashshare] * @param int number of visible networks (used for shortcodes) * @param array activated networks (used for shortcodes) * @param string button size (used for shortcodes) * @return string html */ function mashsb_getNetworks($is_shortcode = false, $services = 0) { global $mashsb_options, $mashsb_custom_url, $enablednetworks, $mashsb_twitter_url; // define globals if ($is_shortcode) { $mashsb_twitter_url = !empty($mashsb_custom_url) ? mashsb_get_shorturl($mashsb_custom_url) : mashsb_get_twitter_url(); } else { $mashsb_twitter_url = mashsb_get_twitter_url(); } // Get class names for buttons size $class_size = isset($mashsb_options['buttons_size']) ? ' ' . esc_attr($mashsb_options['buttons_size']) : ''; // Get class names for buttons margin $class_margin = isset($mashsb_options['button_margin']) ? '' : ' mash-nomargin'; // Get class names for center align $class_center = isset($mashsb_options['text_align_center']) ? ' mash-center' : ''; // Get class names for button style $class_style = isset($mashsb_options['mash_style']) && $mashsb_options['mash_style'] === 'shadow' ? ' mashsb-shadow' : ' mashsb-noshadow'; $output = ''; $startsecondaryshares = ''; $endsecondaryshares = ''; /* content of 'more services' button */ $onoffswitch = ''; /* counter for 'Visible Services' */ $startcounter = 1; $maxcounter = isset($mashsb_options['visible_services']) ? $mashsb_options['visible_services'] : 0; $maxcounter = ($maxcounter === 'all') ? 'all' : ($maxcounter + 1); // plus 1 to get networks correct counted (array's starting counting from zero) $maxcounter = apply_filters('mashsb_visible_services', $maxcounter); /* Overwrite maxcounter with shortcode attribute */ $maxcounter = ($services === 0) ? $maxcounter : $services; /* * Our list of available services, includes the disabled ones! * We have to clean this array first! */ $getnetworks = isset($mashsb_options['networks']) ? apply_filters('mashsb_filter_networks', $mashsb_options['networks']) : apply_filters('mashsb_filter_networks', ''); /* Delete disabled services from array. Use callback function here. Do this only once because array_filter is slow! * Use the newly created array and bypass the callback function */ if (is_array($getnetworks)) { if (!is_array($enablednetworks)) { $enablednetworks = array_filter($getnetworks, 'isStatus'); } else { $enablednetworks = $enablednetworks; } } else { $enablednetworks = $getnetworks; } // Start Primary Buttons if (!empty($enablednetworks)) { foreach ($enablednetworks as $key => $network): if ($maxcounter !== 'all' && $maxcounter < count($enablednetworks)) { // $maxcounter + 1 for correct comparision with count() if ($startcounter == $maxcounter) { $onoffswitch = onOffSwitch(); // Start More Button $visibility = mashsb_is_amp_page() ? '' : 'display:none;'; $startsecondaryshares .= '
'; // Start secondary-shares } else { $onoffswitch = ''; $startsecondaryshares = ''; } if ($startcounter === (count($enablednetworks))) { $endsecondaryshares = '
'; } else { $endsecondaryshares = ''; } } if (isset($enablednetworks[$key]['name']) && !empty($enablednetworks[$key]['name'])) { /* replace all spaces with $nbsp; This prevents error in css style content: text-intend */ $name = preg_replace('/\040{1,}/', ' ', $enablednetworks[$key]['name']); // The custom share label } else { $name = ucfirst($enablednetworks[$key]['id']); // Use the id as share label. Capitalize it! } $enablednetworks[$key]['id'] == 'whatsapp' && !mashsb_is_amp_page() ? $display = 'style="display:none;"' : $display = ''; // Whatsapp button is made visible via js when opened on mobile devices // Lets use the data attribute to prevent that pininit.js is overwriting our pinterest button - PR: https://secure.helpscout.net/conversation/257066283/954/?folderId=924740 if ('pinterest' === $enablednetworks[$key]['id'] && !mashsb_is_amp_page()) { $output .= '' . $name . ''; } else { $output .= '' . $name . ''; } $output .= $onoffswitch; $output .= $startsecondaryshares; $startcounter++; endforeach; $output .= onOffSwitch2(); $output .= $endsecondaryshares; } return apply_filters('return_networks', $output); } /* * Return all available networks for Shortcode generated buttons * * @since 2.0 * @param bool true when used from shortcode [mashshare] * @param int number of visible networks (used for shortcodes) * @param array activated networks (used for shortcodes) * @param string button size (used for shortcodes) * @return string html */ function mashsb_getNetworksShortcode($is_shortcode = false, $services = 0, $networks = false, $size = false, $icons = false) { global $mashsb_options, $mashsb_custom_url, $mashsb_twitter_url; // define globals if ($is_shortcode) { $mashsb_twitter_url = !empty($mashsb_custom_url) ? mashsb_get_shorturl($mashsb_custom_url) : mashsb_get_twitter_url(); } else { $mashsb_twitter_url = mashsb_get_twitter_url(); } // Get class names for buttons size $class_size = isset($mashsb_options['buttons_size']) ? ' ' . esc_attr($mashsb_options['buttons_size']) : ''; // Override size with shortcode argument $class_size = $size ? ' mash-' . $size : $class_size; // Get class names for buttons margin $class_margin = isset($mashsb_options['button_margin']) ? '' : ' mash-nomargin'; // Get class names for center align $class_center = isset($mashsb_options['text_align_center']) ? ' mash-center' : ''; // Get class names for button style $class_style = isset($mashsb_options['mash_style']) && $mashsb_options['mash_style'] === 'shadow' ? ' mashsb-shadow' : ' mashsb-noshadow'; $class_icons = $icons ? ' mashsb-pure-icons' : ''; $output = ''; $startsecondaryshares = ''; $endsecondaryshares = ''; /* content of 'more services' button */ $onoffswitch = ''; /* counter for 'Visible Services' */ $startcounter = 1; $maxcounter = isset($mashsb_options['visible_services']) ? $mashsb_options['visible_services'] : 0; $maxcounter = ($maxcounter === 'all') ? 'all' : ($maxcounter + 1); // plus 1 to get networks correct counted (array's starting counting from zero) $maxcounter = apply_filters('mashsb_visible_services', $maxcounter); /* Overwrite maxcounter with shortcode attribute */ $maxcounter = ($services === 0) ? $maxcounter : $services; /* * Our list of available services, includes the disabled ones! * We have to clean this array first! */ $getnetworks = isset($mashsb_options['networks']) ? apply_filters('mashsb_filter_networks', $mashsb_options['networks']) : apply_filters('mashsb_filter_networks', ''); /* * Delete disabled services from array. Use callback function here. Do this only once because array_filter is slow! * Use the newly created array and bypass the callback function */ if (is_array($getnetworks)) { if (!isset($enablednetworks) || !is_array($enablednetworks)) { $enablednetworks = array_filter($getnetworks, 'isStatus'); } else { $enablednetworks = $enablednetworks; } } else { $enablednetworks = $getnetworks; } // Use custom networks if available and override default networks $enablednetworks = $networks ? $networks : $enablednetworks; // Start Primary Buttons if (!empty($enablednetworks)) { foreach ($enablednetworks as $key => $network): if ($maxcounter !== 'all' && $maxcounter < count($enablednetworks)) { // $maxcounter + 1 for correct comparision with count() if ($startcounter == $maxcounter) { $onoffswitch = onOffSwitch($size); // Start More Button $startsecondaryshares .= ''; } else { $endsecondaryshares = ''; } } if (isset($enablednetworks[$key]['name']) && !empty($enablednetworks[$key]['name'])) { /* replace all spaces with $nbsp; This prevents error in css style content: text-intend */ $name = !$icons ? preg_replace('/\040{1,}/', ' ', $enablednetworks[$key]['name']) : ''; // The custom share label } else { $name = !$icons ? ucfirst($enablednetworks[$key]['id']) : ''; // Use the id as share label. Capitalize it! } // Lets use the data attribute to prevent that pininit.js is overwriting our pinterest button - PR: https://secure.helpscout.net/conversation/257066283/954/?folderId=924740 if ('pinterest' === $enablednetworks[$key]['id'] && !mashsb_is_amp_page()) { $output .= '' . $name . ''; } else { $output .= '' . $name . ''; } $output .= $onoffswitch; $output .= $startsecondaryshares; $startcounter++; endforeach; $output .= onOffSwitch2($size); $output .= $endsecondaryshares; } return apply_filters('return_networks', $output); } /* * Render template * Returns share buttons and share count * * @since 1.0 * @returns string html */ function mashshareShow() { global $mashsb_options; $class_stretched = isset($mashsb_options['responsive_buttons']) ? 'mashsb-stretched' : ''; $return = ' '; $allowedElements = [ 'aside' => [ 'class' => [], 'style' => [], ], 'a' => [ 'class' => [], 'href' => [], 'title' => [], 'rel' => [], 'target' => [], 'style' => [], 'data-mashsb-url' => [], ], 'div' => [ 'class' => [], 'style' => [], ], 'span' => [ 'class' => [], 'style' => [], ], ]; // Allow the style property `display in html output. add_filter( 'safe_style_css', function( $styles ) { $styles[] = 'display'; return $styles; } ); return apply_filters('mashsb_output_buttons', wp_kses($return, $allowedElements)); } /** * Render the sharecount template * * @param string $customurl default empty * @param string alignment default left * @return string html */ function mashsb_render_sharecounts($customurl = '', $align = 'left', $size = false) { global $mashsb_options; // Share count disabled if (false === mashsbIsPostTypeAllowed()) { return ''; } if (isset($mashsb_options['disable_sharecount']) || !mashsb_curl_installed() || !mashsb_is_enabled_permalinks()) { return ''; } $url = empty($customurl) ? mashsb_get_url() : $customurl; $sharetitle = isset($mashsb_options['sharecount_title']) ? wp_kses_post($mashsb_options['sharecount_title']) : __('SHARES', 'mashsb'); $shares = getSharedcount($url); $sharecount = isset($mashsb_options['mashsharer_round']) ? roundshares($shares) : $shares; // do not show shares after x shares if (mashsb_hide_shares($shares)) { return; } // Get class names for buttons size $class_size = isset($mashsb_options['buttons_size']) ? ' ' . esc_attr($mashsb_options['buttons_size']) : ''; // Override size with shortcode argument $class_size = $size ? ' mash-' . esc_attr($size) : $class_size; // No inline style if it's amp $style = !mashsb_is_amp_page() ? 'style="float:' . $align . ';"' : ''; $html = '
' . esc_html($sharecount) . '
' . esc_html($sharetitle) . '
'; return apply_filters('mashsb_share_count', $html); } /* * Shortcode function * Select Share count from database and returns share buttons and share counts * * @since 1.0 * @returns string */ function mashshareShortcodeShow($args) { global $mashsb_options, $mashsb_custom_url, $mashsb_custom_text; $sharecount = ''; //Filter shortcode args to add an option for developers to change (add) some args apply_filters('mashsb_shortcode_atts', $args); extract(shortcode_atts(array( 'cache' => '3600', 'shares' => 'true', 'buttons' => 'true', 'services' => '0', //default is by admin option - plus 1 because array starts counting from zero 'align' => 'left', 'text' => '', // $text 'url' => '', // $url 'networks' => '', // List of networks separated by comma 'size' => '', // small, medium, large button size 'icons' => '0' // 1 ), $args)); // Visible services $count_services = !empty($services) ? $services : 0; // Enable specific networks $networks = !empty($networks) ? explode(",", $networks) : false; // Convert into appropriate array structure if ($networks) { $new = array(); foreach ($networks as $key => $value) { $new[$key]['id'] = $value; $new[$key]['status'] = '1'; $new[$key]['name'] = $value; } $networks = $new; } // The global available custom url to share $mashsb_custom_url = !empty($url) ? $url : ''; // local url $mashsb_url = empty($url) ? mashsb_get_url() : $url; // Define custom text to share $mashsb_custom_text = !empty($text) ? $text : false; if ($shares != 'false') { $sharecount = mashsb_render_sharecounts($mashsb_url, $align, $size); // shortcode [mashshare shares="true" buttons="false"] if ($shares === "true" && $buttons === 'false') { return $sharecount; } } $class_stretched = isset($mashsb_options['responsive_buttons']) ? 'mashsb-stretched' : ''; $return = ' '; $allowedElements = [ 'aside' => [ 'class' => [], 'style' => [], ], 'a' => [ 'class' => [], 'href' => [], 'title' => [], 'rel' => [], 'target' => [], 'style' => [], 'data-mashsb-url' => [], ], 'div' => [ 'class' => [], 'style' => [], ], 'span' => [ 'class' => [], 'style' => [], ], ]; // Allow the style property `display in html output. add_filter( 'safe_style_css', function( $styles ) { $styles[] = 'display'; return $styles; } ); return apply_filters('mashsb_output_buttons', wp_kses($return, $allowedElements)); } /* Returns active status of Mashshare. * Used for scripts.php $hook * @since 2.0.3 * @return bool True if MASHSB is enabled on specific page or post. * @TODO: Check if shortcode [mashshare] is used in widget */ function mashsbGetActiveStatus() { global $mashsb_options, $post; $frontpage = isset($mashsb_options['frontpage']) ? true : false; $current_post_type = get_post_type(); $enabled_post_types = isset($mashsb_options['post_types']) ? $mashsb_options['post_types'] : array(); $singular = isset($mashsb_options['singular']) ? true : false; $loadall = isset($mashsb_options['loadall']) ? $loadall = true : $loadall = false; if (mashsb_is_excluded()) { mashdebug()->info("mashsb_is_excluded()"); return apply_filters('mashsb_active', false); } if ($loadall) { mashdebug()->info("load all mashsb scripts"); return apply_filters('mashsb_active', true); } // Load on frontpage if ($frontpage === true && is_front_page()) { mashdebug()->info("allow frontpage and is frontpage"); return apply_filters('mashsb_active', true); } // Load scripts when shortcode is used /* Check if shortcode is used */ if (function_exists('has_shortcode') && is_object($post) && has_shortcode($post->post_content, 'mashshare')) { mashdebug()->info("has_shortcode"); return apply_filters('mashsb_active', true); } // No scripts on non singular page if (!is_singular() && !$singular) { mashdebug()->info("No scripts on non singular page"); return apply_filters('mashsb_active', false); } // Load scripts when post_type is defined (for automatic embeding) if (in_array($current_post_type, $enabled_post_types)) { mashdebug()->info("automatic post_type enabled"); return apply_filters('mashsb_active', true); } mashdebug()->info("mashsbGetActiveStatus false"); return apply_filters('mashsb_active', false); } /** * Get the post meta value of position * * @return mixed string|bool false * @global int $post */ function mashsb_get_post_meta_position() { global $post; if (isset($post->ID) && !empty($post->ID)) { $check_position_meta_post = get_post_meta($post->ID, 'mashsb_position', true); if (!empty($check_position_meta_post)) { return $check_position_meta_post; } else { return false; } } return false; } /* Returns Share buttons on specific positions * Uses the_content filter * @since 1.0 * @return string */ function mashshare_filter_content($content) { global $mashsb_options, $wp_current_filter; // Default position $position = !empty($mashsb_options['mashsharer_position']) ? $mashsb_options['mashsharer_position'] : ''; // Check if we have a post meta setting which overrides the global position than we use that one instead if (true == ($position_meta = mashsb_get_post_meta_position())) { $position = $position_meta; } $enabled_post_types = isset($mashsb_options['post_types']) ? $mashsb_options['post_types'] : null; $current_post_type = get_post_type(); $frontpage = isset($mashsb_options['frontpage']) ? true : false; $excluded = isset($mashsb_options['excluded_from']) ? $mashsb_options['excluded_from'] : null; $singular = isset($mashsb_options['singular']) ? $singular = true : $singular = false; if (isset($mashsb_options['is_main_query']) && !is_main_query()) { return $content; } if (mashsb_is_excluded()) { return $content; } if (is_feed()) { return $content; } if ($frontpage == false && is_front_page()) { return $content; } if (!is_singular() == 1 && $singular !== true) { return $content; } if ($enabled_post_types == null or !in_array($current_post_type, $enabled_post_types)) { return $content; } if (in_array('get_the_excerpt', $wp_current_filter)) { return $content; } // Get one instance (prevents multiple similar calls) $mashsb_instance = apply_filters('mashsb_the_content', mashshareShow()); switch ($position) { case 'manual': break; case 'both': $content = $mashsb_instance . $content . $mashsb_instance; break; case 'before': $content = $mashsb_instance . $content; break; case 'after': $content .= $mashsb_instance; break; case 'disable': break; } return $content; } /* Template function mashshare() * @since 2.0.0 * @return string */ function mashshare() { echo mashshareShow(); } /* Deprecated: Template function mashsharer() * @since 1.0 * @return string */ function mashsharer() { echo mashshareShow(); } /** * Get Thumbnail featured image if existed * * @param int $postID * @return string * @since 1.0 */ function mashsb_get_image($postID) { global $post; if (!isset($post)) { return ''; } if (has_post_thumbnail($post->ID)) { $image = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'single-post-thumbnail'); return isset($image[0]) ? $image[0] : ''; } } add_action('mashsb_get_image', 'mashsb_get_image'); /** * Get the excerpt * * @param int $postID * @changed 3.0.0 * @return string * @since 1.0 */ function mashsb_get_excerpt_by_id($post_id) { // Check if the post has an excerpt if (has_excerpt()) { return get_the_excerpt(); } if (!isset($post_id)) { return ""; } $the_post = get_post($post_id); //Gets post ID /* * If post_content isn't set */ if (!isset($the_post->post_content)) { return ""; } $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt // Strip all shortcodes $excerpt_length = 35; //Sets excerpt length by word count $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images $words = explode(' ', $the_excerpt, $excerpt_length + 1); if (count($words) > $excerpt_length) : array_pop($words); array_push($words, '…'); $the_excerpt = implode(' ', $words); endif; $the_excerpt = '

' . $the_excerpt . '

'; return wp_strip_all_tags($the_excerpt); } add_action('mashsb_get_excerpt_by_id', 'mashsb_get_excerpt_by_id'); /** * Create a factor for calculating individual fake counts * based on the number of word within a page title * * @return int * @since 2.0 */ function mashsb_get_fake_factor() { // str_word_count is not working for hebraic and arabic languages $wordcount = count(explode(' ', the_title_attribute('echo=0'))); $factor = $wordcount / 10; return apply_filters('mashsb_fake_factor', $factor); } /* * Sharecount fake number * * @since 2.0.9 * @return int * */ function getFakecount() { global $mashsb_options; $fakecount = isset($mashsb_options['fake_count']) && is_numeric($mashsb_options['fake_count']) ? round($mashsb_options['fake_count'] * mashsb_get_fake_factor(), 0) : 0; return (int)$fakecount; } /* * Hide sharecount until number of shares exceed * * @since 2.0.7 * * @param int number of shares * @return bool true when shares are hidden * */ function mashsb_hide_shares($sharecount) { global $mashsb_options, $post; if (empty($mashsb_options['hide_sharecount'])) { return false; } $url = get_permalink(isset($post->ID)); $sharelimit = isset($mashsb_options['hide_sharecount']) ? $mashsb_options['hide_sharecount'] : 0; if ($sharecount >= $sharelimit) { return false; } // Hide share count per default when it is not a valid number return true; } /* Additional content above share buttons * * @return string $html * @scince 2.3.2 */ function mashsb_content_above() { global $mashsb_options; $html = !empty($mashsb_options['content_above']) ? '
' . mashsb_cleanShortcode('mashshare', $mashsb_options['content_above']) . '
' : ''; return apply_filters('mashsb_above_buttons', $html); } /* Additional content above share buttons * * @return string $html * @scince 2.3.2 */ function mashsb_content_below() { global $mashsb_options; $html = !empty($mashsb_options['content_below']) ? '
' . mashsb_cleanShortcode('mashshare', $mashsb_options['content_below']) . '
' : ''; return apply_filters('mashsb_below_buttons', $html); } /** * Check if buttons are excluded from a specific post id * * @return true if post is excluded */ function mashsb_is_excluded() { global $post, $mashsb_options; if (!isset($post)) { return false; } $excluded = isset($mashsb_options['excluded_from']) ? $mashsb_options['excluded_from'] : null; // Load scripts when page is not excluded if (strpos($excluded, ',') !== false) { $excluded = explode(',', $excluded); if (in_array($post->ID, $excluded)) { mashdebug()->info("is excluded"); return true; } } if ($post->ID == $excluded) { mashdebug()->info("is single excluded"); return true; } return false; } /** * Return general post title * * @param string $title default post title * @return string the default post title, shortcode title or custom twitter title * @global obj $mashsb_meta_tags * */ function mashsb_get_title() { global $post, $mashsb_meta_tags; if (is_singular() && !empty($mashsb_meta_tags) && method_exists($mashsb_meta_tags, 'get_og_title')) { $title = $mashsb_meta_tags->get_og_title(); $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); $title = urlencode($title); $title = str_replace('#', '%23', $title); $title = esc_html($title); } else { $title = mashsb_get_document_title(); $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); $title = urlencode($title); $title = str_replace('#', '%23', $title); $title = esc_html($title); } return apply_filters('mashsb_get_title', $title); } /** * Return twitter custom title * * @return string the custom twitter title * @global object $mashsb_meta_tags * @changed 3.0.0 * */ function mashsb_get_twitter_title() { global $mashsb_meta_tags; // $mashsb_meta_tags is only available on singular pages if (is_singular() && !empty($mashsb_meta_tags) && method_exists($mashsb_meta_tags, 'get_twitter_title')) { $title = $mashsb_meta_tags->get_twitter_title(); $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); $title = urlencode($title); $title = str_replace('#', '%23', $title); $title = str_replace('+', '%20', $title); $title = str_replace('|', '', $title); $title = esc_html($title); } else { // title for non singular pages $title = mashsb_get_title(); $title = str_replace('+', '%20', $title); $title = str_replace('|', '', $title); } return apply_filters('mashsb_twitter_title', $title); } /* * Get URL to share * * @return url $string * @scince 2.2.8 */ function mashsb_get_url() { global $post; if (isset($post->ID)) { // The permalink for singular pages! // Do not check here for is_singular() (like e.g. the sharebar addon does.) // Need to check for post id because on category and archiv pages // we want the pageID within the loop instead the first appearing one. $url = mashsb_sanitize_url(get_permalink($post->ID)); } else { // The main URL $url = mashsb_get_main_url(); } return apply_filters('mashsb_get_url', $url); } /* * Get twitter URL to share * * @return url $string * @scince 2.2.8 */ function mashsb_get_twitter_url() { if (function_exists('mashsb_get_shorturl_singular')) { $url = mashsb_get_shorturl_singular(mashsb_get_url()); } else if (function_exists('mashsuGetShortURL')) { // compatibility mode for MashShare earlier than 3.0 $get_url = mashsb_get_url(); $url = mashsuGetShortURL($get_url); } else { $url = mashsb_get_url(); } return apply_filters('mashsb_get_twitter_url', $url); } /** * Wrapper for mashsb_get_shorturl_singular() * * @param string $url * @return string */ function mashsb_get_shorturl($url) { if (!empty($url)) { $url = mashsb_get_shorturl_singular($url); } else { $url = ""; } return $url; } /** * Get sanitized twitter handle * * @return mixed string | bool false * @global array $mashsb_options */ function mashsb_get_twitter_username() { global $mashsb_options; if (empty($mashsb_options['mashsharer_hashtag'])) { return; } // If plugin is not running on mashshare.net or dev environment replace @mashshare if (empty($_SERVER['HTTP_HOST']) || ($_SERVER['HTTP_HOST'] !== 'www.mashshare.net' && $_SERVER['HTTP_HOST'] !== 'src.wordpress-develop.dev')) { //Sanitize it $replace_first = str_ireplace('mashshare', '', $mashsb_options['mashsharer_hashtag']); $replace_second = str_ireplace('@', '', $replace_first); return $replace_second; } else { return $mashsb_options['mashsharer_hashtag']; } } /** * Returns document title for the current page. * * @return string Tag with the document title. * @global int $post Page number of a list of posts. * * @since 3.0 * */ function mashsb_get_document_title() { /** * Filter the document title before it is generated. * * Passing a non-empty value will short-circuit wp_get_document_title(), * returning that value instead. * * @param string $title The document title. Default empty string. * @since 4.4.0 * */ $title = ''; // If it's a 404 page, use a "Page not found" title. if (is_404()) { $title = __('Page not found'); // If it's a search, use a dynamic search results title. } elseif (is_search()) { /* translators: %s: search phrase */ $title = sprintf(__('Search Results for “%s”'), get_search_query()); // If on a post type archive, use the post type archive title. } elseif (is_post_type_archive()) { $title = post_type_archive_title('', false); // If on a taxonomy archive, use the term title. } elseif (is_tax()) { $title = single_term_title('', false); /* * If we're on the blog page that is not the homepage or * a single post of any post type, use the post title. */ //} elseif( !is_home() || is_singular() ) { } elseif (is_singular()) { $title = the_title_attribute('echo=0'); // If on the front page, use the site title. } elseif (is_front_page()) { $title = get_bloginfo('name', 'display'); // If on a category or tag archive, use the term title. } elseif (is_category() || is_tag()) { $title = single_term_title('', false); // If on an author archive, use the author's display name. } elseif (is_author() && $author = get_queried_object()) { $title = $author->display_name; // If it's a date archive, use the date as the title. } elseif (is_year()) { $title = get_the_date(_x('Y', 'yearly archives date format')); } elseif (is_month()) { $title = get_the_date(_x('F Y', 'monthly archives date format')); } elseif (is_day()) { $title = get_the_date(); } $title = html_entity_decode($title, ENT_QUOTES, 'UTF-8'); return $title; } /** * Append tracking parameter to shared url * * @param string $url * @return string */ function mashsb_append_tracking_param($url, $network = 'mashshare') { global $mashsb_options; if (!isset($mashsb_options['tracking_params'])) { return $url; } return $url . urlencode('?utm_source=sharebuttons&utm_medium=' . $network . '&utm_campaign=mashshare'); }