eg-sharebar/eg-sharebar.php

268 lines
11 KiB
PHP

<?php
/*
Plugin Name: EG Sharebar
Description: Barra social personalizzata richiamabile via funzione PHP.
Author: Emanuele Gori
Version: 5.6.1
*/
if (!defined('ABSPATH')) exit;
// FLAG DEBUG: Cambia a true per attivare i log in console
define('EG_SHAREBAR_DEBUG', false);
function eg_sharebar_render() {
$titolo = get_the_title();
$url = get_permalink();
$default_instance = 'mastodon.uno';
// Firma personalizzata per ogni social
$signature_masto = ' via @emanuelegori@emanuelegori.uno';
$signature_x = ' via @40annibuttati';
$signature_bluesky = ' via @emanuelegori@emanuelegori.uno';
$signature_telegram = ' via emanuelegori.uno';
$premessa = 'Mi è piaciuto ';
$share_text_mastodon = $premessa . $titolo . ' ' . $url . $signature_masto;
$share_text_x = $premessa . $titolo . ' ' . $url . $signature_x;
$share_text_bluesky = $premessa . $titolo . ' ' . $url . $signature_bluesky;
$share_text_telegram = $premessa . $titolo . ' ' . $url . $signature_telegram;
$instances = [
'mastodon.uno' => 'mastodon.uno',
'sociale.network' => 'sociale.network',
'mastodon.social' => 'mastodon.social',
'mastodon.art' => 'mastodon.art',
'livellosecreto.it' => 'livellosecreto.it',
];
$icons_url = plugins_url('social-icons/', __FILE__);
ob_start();
?>
<div class="eg-condividi-label" style="font-weight:600; margin-top:32px; margin-bottom:12px; font-size:1.1em; color:#222;">
Ti è piaciuto l'articolo? Condividilo !!
</div>
<div class="eg-sharebar"
data-default-instance="<?php echo esc_attr($default_instance); ?>"
data-share-text="<?php echo esc_attr($share_text_mastodon); ?>"
style="display:flex; gap:14px; flex-wrap:wrap; justify-content:center;">
<div class="eg-masto-col" style="display:flex; flex-direction:column; align-items:center; margin-right:12px;">
<a id="eg-masto-btn" class="share-btn mastodon" href="<?php echo esc_url("https://{$default_instance}/share?text=" . urlencode($share_text_mastodon)); ?>"
target="_blank" rel="noopener" aria-label="Condividi su Mastodon" data-tooltip="Condividi su Mastodon">
<img class="icon" src="<?php echo esc_url($icons_url . 'mastodon.svg'); ?>" alt="Mastodon" />
<span id="eg-masto-label">Mastodon</span>
</a>
<select id="eg-masto-select" class="masto-select" style="margin-top:4px; margin-bottom:4px; background:rgba(99,100,255,0.07); border:1.5px dashed #6364ff77; border-radius:8px; color:#6364ff;" aria-label="Seleziona istanza Mastodon">
<?php foreach ($instances as $urlist => $label): ?>
<option value="<?php echo esc_attr($urlist); ?>"><?php echo esc_html($label); ?></option>
<?php endforeach; ?>
<option value="other">Altra istanza...</option>
</select>
<input id="eg-masto-custom" class="masto-input" type="text" placeholder="esc per uscire"
style="width:100%; display:none; margin-bottom:7px; padding:7px 12px; border-radius:8px; border:1.5px solid #6364ff33; font-size:1.1em; text-align:center;" aria-label="Inserisci istanza personalizzata"/>
</div>
<a class="share-btn x" href="<?php echo esc_url('https://x.com/intent/tweet?text=' . urlencode($share_text_x)); ?>" target="_blank" rel="noopener" aria-label="Condividi su X " data-tooltip="Condividi su X">
<img class="icon" src="<?php echo esc_url($icons_url . 'x.svg'); ?>" alt="X" />
X
</a>
<a class="share-btn bluesky" href="<?php echo esc_url('https://bsky.app/intent/compose?text=' . urlencode($share_text_bluesky)); ?>" target="_blank" rel="noopener" aria-label="Condividi su Bluesky" data-tooltip="Condividi su Bluesky">
<img class="icon" src="<?php echo esc_url($icons_url . 'bluesky.svg'); ?>" alt="Bluesky" />
Bluesky
</a>
<a class="share-btn telegram" href="<?php echo esc_url('https://t.me/share/url?url=' . urlencode($url) . '&text=' . urlencode($titolo . $signature_telegram)); ?>" target="_blank" rel="noopener" aria-label="Condividi su Telegram" data-tooltip="Condividi su Telegram">
<img class="icon" src="<?php echo esc_url($icons_url . 'telegram.svg'); ?>" alt="Telegram" />
Telegram
</a>
<button class="share-btn link" onclick="egCopyLink('<?php echo esc_js($url); ?>')" aria-label="Copia link" data-tooltip="Copia link">
<img class="icon" src="<?php echo esc_url($icons_url . 'link.svg'); ?>" alt="Link" />
Copia Link
</button>
</div>
<?php
return ob_get_clean();
}
function eg_sharebar() { echo eg_sharebar_render(); }
add_shortcode('eg_sharebar', 'eg_sharebar_render');
// Carica CSS
add_action('wp_enqueue_scripts', function() {
if (is_singular()) {
wp_register_style('eg-sharebar-css', false);
wp_enqueue_style('eg-sharebar-css');
$css_file = plugin_dir_path(__FILE__).'sharebar-style.css';
if (file_exists($css_file)) {
wp_add_inline_style('eg-sharebar-css', file_get_contents($css_file));
}
}
});
// Carica JavaScript GLOBALMENTE nel footer
add_action('wp_footer', function() {
if (!is_singular()) return;
$debug = EG_SHAREBAR_DEBUG ? 'true' : 'false';
?>
<script>
window.egInitSharebar = function() {
var DEBUG = <?php echo $debug; ?>;
function log() { if (DEBUG) console.log.apply(console, arguments); }
function warn() { if (DEBUG) console.warn.apply(console, arguments); }
function error() { if (DEBUG) console.error.apply(console, arguments); }
log('🔧 egInitSharebar: inizializzazione');
function egSetInstance(val) {
try {
localStorage.setItem("egMastoInstance", val);
log('💾 localStorage salvato:', val);
} catch(e){ error('❌ Errore localStorage:', e); }
}
function egGetInstance() {
try {
var val = localStorage.getItem("egMastoInstance");
log('📖 localStorage letto:', val);
return val;
} catch(e) {
error('❌ Errore lettura localStorage:', e);
return null;
}
}
const sharebarContainer = document.querySelector('.eg-sharebar');
if (!sharebarContainer) {
warn('⚠️ Container .eg-sharebar non trovato');
return;
}
const mastoSelect = document.getElementById("eg-masto-select");
const mastoCustom = document.getElementById("eg-masto-custom");
const mastoBtn = document.getElementById("eg-masto-btn");
const defaultInstance = sharebarContainer.getAttribute('data-default-instance') || 'mastodon.uno';
const shareTextMasto = sharebarContainer.getAttribute('data-share-text') || '';
if (!mastoSelect || !mastoCustom || !mastoBtn) {
error('❌ EG Sharebar: elementi non trovati!');
return;
}
let currentInstance = egGetInstance() || defaultInstance;
let customOption = null;
function updateMastoBtn() {
var newHref = "https://" + currentInstance + "/share?text=" + encodeURIComponent(shareTextMasto);
mastoBtn.href = newHref;
log('🔗 Href aggiornato:', newHref);
}
function setSelectValue(val) {
let found = false;
for (let i = 0; i < mastoSelect.options.length; i++) {
if (mastoSelect.options[i].value === val) {
mastoSelect.selectedIndex = i;
found = true;
break;
}
}
if (!found) {
addOrUpdateCustomOption(val);
mastoSelect.value = val;
}
}
function addOrUpdateCustomOption(val) {
if (customOption) {
customOption.value = val;
customOption.text = val;
} else {
customOption = document.createElement("option");
customOption.value = val;
customOption.text = val;
let otherOption = mastoSelect.querySelector('option[value="other"]');
mastoSelect.insertBefore(customOption, otherOption);
}
}
mastoSelect.addEventListener('change', function() {
log('🔄 Select cambiato:', this.value);
if (this.value === "other") {
mastoCustom.value = "";
mastoCustom.style.display = "block";
mastoCustom.focus();
mastoSelect.style.display = "none";
} else {
currentInstance = this.value;
egSetInstance(currentInstance);
updateMastoBtn();
}
});
mastoCustom.addEventListener('keydown', function(e) {
if (e.key === "Enter") {
let val = mastoCustom.value.trim();
if (!val.match(/^[a-z0-9.-]+\.[a-z]+$/i)) {
alert("Inserisci un dominio valido (es. mastodon.social)");
return;
}
currentInstance = val;
egSetInstance(val);
updateMastoBtn();
mastoCustom.style.display = "none";
mastoSelect.style.display = "block";
addOrUpdateCustomOption(val);
setSelectValue(val);
} else if (e.key === "Escape") {
mastoCustom.style.display = "none";
mastoSelect.style.display = "block";
setSelectValue(currentInstance);
}
});
mastoCustom.addEventListener('blur', function() {
setTimeout(function() {
if (mastoCustom.style.display === "block") {
mastoCustom.style.display = "none";
mastoSelect.style.display = "block";
setSelectValue(currentInstance);
}
}, 200);
});
setSelectValue(currentInstance);
updateMastoBtn();
// Gestione tooltip
const shareButtons = document.querySelectorAll('.eg-sharebar .share-btn');
shareButtons.forEach(function(btn) {
btn.addEventListener('click', function() { this.blur(); });
btn.addEventListener('touchend', function() { this.blur(); });
});
log('EG Sharebar inizializzata');
};
window.egCopyLink = function(link) {
navigator.clipboard.writeText(link);
alert("Link copiato!");
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function() {
if (document.querySelector('.eg-sharebar')) {
window.egInitSharebar();
}
});
} else {
if (document.querySelector('.eg-sharebar')) {
window.egInitSharebar();
}
}
</script>
<?php
}, 98);