Files
nurinda.co.id---old/wp-content/plugins/mashsharer/includes/template-functions.php
T

1524 lines
48 KiB
PHP

<?php
/**
* Template Functions
*
* @package MASHSB
* @subpackage Functions/Templates
* @copyright Copyright (c) 2014, René Hermenau
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
* @since 2.0.0
*/
// Exit if accessed directly
if (!defined('ABSPATH'))
exit;
/* Load Hooks
* @since 2.0
* return void
*/
add_shortcode('mashshare', 'mashshareShortcodeShow');
add_filter('the_content', 'mashshare_filter_content', getExecutionOrder(), 1);
add_filter('widget_text', 'do_shortcode');
add_action('mashshare', 'mashshare');
add_filter('mash_share_title', 'mashsb_get_title', 10, 2);
/* Get Execution order of injected Share Buttons in $content
*
* @since 2.0.4
* @return int
*/
function getExecutionOrder()
{
global $mashsb_options;
isset($mashsb_options['execution_order']) && is_numeric($mashsb_options['execution_order']) ? $priority = trim($mashsb_options['execution_order']) : $priority = 1000;
return $priority;
}
/*
* Get mashsbShareObject
* depending on MashEngine (or sharedcount.com deprecated) is used
*
* @since 2.0.9
* @return object
* @changed 3.1.8
*/
function mashsbGetShareObj($url)
{
global $mashsb_options;
// Sharedcount.com is default option
$mashengine = isset($mashsb_options['mashsb_sharemethod']) && $mashsb_options['mashsb_sharemethod'] === 'mashengine' ? true : false;
if (!$mashengine) {
require_once(MASHSB_PLUGIN_DIR . 'includes/sharedcount.class.php');
$apikey = isset($mashsb_options['mashsharer_apikey']) ? $mashsb_options['mashsharer_apikey'] : '';
$mashsbSharesObj = new mashsbSharedcount($url, 10, $apikey);
return $mashsbSharesObj;
}
if (!class_exists('RollingCurlX')) {
require_once MASHSB_PLUGIN_DIR . 'includes/libraries/RolingCurlX.php';
}
if (!class_exists('mashengine')) {
require_once(MASHSB_PLUGIN_DIR . 'includes/mashengine.php');
}
MASHSB()->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 = '<a href="javascript:void(0)" class="mashicon-subscribe" id="mash-subscribe-control"><span class="icon"><span class="text">' . __('Subscribe', 'mashsb') . '</span></span></a>';
} 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 = '<div class="mashsb-toggle-container">' . mashsb_cleanShortcode('mashshare', $mashsb_options['subscribe_content']) . '</div>';
} 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 = '<div class="onoffswitch' . $class_size . $class_style . '"></div>';
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 = '<div class="onoffswitch2' . $class_size . $class_style . '" style="display:none;"></div>';
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 .= '<div class="secondary-shares" style="' . $visibility . '">'; // Start secondary-shares
} else {
$onoffswitch = '';
$startsecondaryshares = '';
}
if ($startcounter === (count($enablednetworks))) {
$endsecondaryshares = '</div>';
} 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,}/', '&nbsp;', $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 .= '<a class="mashicon-' . $enablednetworks[$key]['id'] . $class_size . $class_margin . $class_center . $class_style . '" href="#" data-mashsb-url="' . arrNetworks($enablednetworks[$key]['id'], $is_shortcode) . '" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">' . $name . '</span></a>';
} else {
$output .= '<a class="mashicon-' . $enablednetworks[$key]['id'] . $class_size . $class_margin . $class_center . $class_style . '" href="' . arrNetworks($enablednetworks[$key]['id'], $is_shortcode) . '" target="_top" rel="nofollow"><span class="icon"></span><span class="text">' . $name . '</span></a>';
}
$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 .= '<div class="secondary-shares" style="display:none;">'; // Start secondary-shares
} else {
$onoffswitch = '';
$startsecondaryshares = '';
}
if ($startcounter === (count($enablednetworks))) {
$endsecondaryshares = '</div>';
} 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,}/', '&nbsp;', $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 .= '<a class="mashicon-' . $enablednetworks[$key]['id'] . $class_size . $class_margin . $class_center . $class_style . $class_icons . '" href="#" data-mashsb-url="' . arrNetworks($enablednetworks[$key]['id'], $is_shortcode) . '" target="_blank" rel="nofollow"><span class="icon"></span><span class="text">' . $name . '</span></a>';
} else {
$output .= '<a class="mashicon-' . $enablednetworks[$key]['id'] . $class_size . $class_margin . $class_center . $class_style . $class_icons . '" href="' . arrNetworks($enablednetworks[$key]['id'], $is_shortcode) . '" target="_top" rel="nofollow"><span class="icon"></span><span class="text">' . $name . '</span></a>';
}
$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 = '<aside class="mashsb-container mashsb-main ' . $class_stretched . '">'
. mashsb_content_above() .
'<div class="mashsb-box">'
. apply_filters('mashsb_sharecount_filter', mashsb_render_sharecounts()) .
'<div class="mashsb-buttons">'
. mashsb_getNetworks() .
'</div>
</div>
<div style="clear:both;"></div>'
. mashsb_subscribe_content()
. mashsb_content_below() .
'</aside>
<!-- Share buttons by mashshare.net - Version: ' . MASHSB_VERSION . '-->';
$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 = '<div class="mashsb-count' . $class_size . '" ' . esc_attr($style) . '><div class="counts mashsbcount">' . esc_html($sharecount) . '</div><span class="mashsb-sharetext">' . esc_html($sharetitle) . '</span></div>';
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 = '<aside class="mashsb-container mashsb-main ' . $class_stretched . '">'
. mashsb_content_above() .
'<div class="mashsb-box">'
. $sharecount .
'<div class="mashsb-buttons">'
. mashsb_getNetworksShortcode(true, $count_services, $networks, $size, $icons) .
'</div></div>
<div style="clear:both;"></div>'
. mashsb_subscribe_content()
. mashsb_content_below() .
'</aside>
<!-- Share buttons made by mashshare.net - Version: ' . MASHSB_VERSION . '-->';
$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 = '<p>' . $the_excerpt . '</p>';
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']) ? '<div class="mashsb_above_buttons">' . mashsb_cleanShortcode('mashshare', $mashsb_options['content_above']) . '</div>' : '';
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']) ? '<div class="mashsb_below_buttons">' . mashsb_cleanShortcode('mashshare', $mashsb_options['content_below']) . '</div>' : '';
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 &#8220;%s&#8221;'), 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');
}