';
foreach ($group as $bonus) {
$firmName = ucfirst(strtolower(esc_html($bonus['firm_name'])));
$firmSlug = strtolower(normalize_category_name($firmName));
$imgSrc = $cdnimg2 . $firmSlug . '_logo.jpg';
$link = generate_custom_link($firmSlug);
$bonusText= esc_html($bonus['title']['rendered']);
$output .= '
';
$output .= '
$output .= '
' . $bonusText . '
';
$output .= '
$output .= '
';
}
$output .= '
'; // alt-mini-table sonu
}
$output .= '
'; // alt-mini-wrapper sonu
return $output;
}
function alt_bonus_shortcode_turbo($atts) {
global $cdnimg2;
$atts = shortcode_atts([
'category' => 'all',
'number' => 6,
'order' => 'latest',
], $atts);
$bonuses = fetch_data_from_management('posts', 'bonus_data_cache_key');
$bonuses = filter_bonuses_by_category($bonuses, $atts['category']);
if ($atts['order'] === 'latest') {
usort($bonuses, fn($a, $b) => strtotime($b['date']) <=> strtotime($a['date']));
} elseif ($atts['order'] === 'oldest') {
usort($bonuses, fn($a, $b) => strtotime($a['date']) <=> strtotime($b['date']));
} elseif ($atts['order'] === 'random') {
shuffle($bonuses);
}
$bonuses = array_slice($bonuses, 0, $atts['number']);
$categoryFormatted = ucfirst(esc_html($atts['category']));
$headerText = $atts['category'] === 'all' ? 'Alternatif Bonuslar' : $categoryFormatted . ' Alternatif Bonusları';
$output = "
{$headerText} |
";
foreach ($bonuses as $bonus) {
$firmName = ucfirst(strtolower(esc_html($bonus['firm_name'])));
$firmSlug = strtolower(normalize_category_name($firmName));
$imgSrc = $cdnimg2 . 'small/' . $firmSlug . '_logo.jpg';
$link = generate_custom_link($firmSlug);
$bonusText= '' . esc_html($bonus['title']['rendered']) . '';
$output .= "
}
$output .= '
';
return $output;
}
function alt_bonus_shortcode_selector($atts) {
return is_mihdan_turbo_page()
? alt_bonus_shortcode_turbo($atts)
: alt_bonus_shortcode_normal($atts);
}
add_shortcode('alt_bonus_table', 'alt_bonus_shortcode_selector');
function register_footer_menu() {
register_nav_menus( array(
'footer' => __( 'Footer Menu', 'mytheme' ),
) );
}
add_action( 'after_setup_theme', 'register_footer_menu' );
// WordPress Admin Paneline Menü Ekle
add_action('admin_menu', 'ozgunlestirme_menu_ekle');
function ozgunlestirme_menu_ekle() {
add_submenu_page(
'tools.php',
'İçerik Yeniden Yazma Aracı', // Menü başlığı
'İçerik Yeniden Yazma Aracı', // Admin panelde gözükecek isim
'manage_options',
'icerik-ozgunlestir',
'ozgunlestirme_sayfasi'
);
}
// Özgünleştirme Sayfası İçeriği
function ozgunlestirme_sayfasi() {
$pages = get_pages();
?>
.ozgunlestir-container { margin: 20px 0; }
.ozgunlestir-container button { margin-right: 10px; }
.ozgunlestir-log {
margin-top: 20px; padding: 10px; border: 1px solid #ddd; background: #fafafa;
max-height: 300px; overflow-y: auto; font-family: Consolas, monospace; font-size: 13px;
}
.ozgunlestir-log .success { color: green; }
.ozgunlestir-log .error { color: red; }
.ozgunlestir-log .info { color: #333; }
/* Progress bar */
.progress-wrapper {
margin-top: 15px; width: 100%; background-color: #e0e0e0; height: 20px;
position: relative; border-radius: 4px;
}
.progress-bar {
height: 100%; background-color: #0073aa; width: 0%; transition: width 0.3s ease; border-radius: 4px;
}
.progress-text {
position: absolute; left: 50%; top: 0; transform: translateX(-50%);
color: #fff; font-size: 12px; line-height: 20px;
}
.search-filter-container { margin-bottom: 15px; }
.search-filter-container input { margin-right: 10px; width: 250px; }
Menüleri de özgünleştir
Footer'ı da özgünleştir
let stopProcess = false;
const pagesList = document.getElementById("pages-list");
const searchInput = document.getElementById("searchPage");
const searchBtn = document.getElementById("searchBtn");
const resetFilterBtn = document.getElementById("resetFilterBtn");
// Tümünü Seç / Seçimi Kaldır
function selectAll(status) {
document.querySelectorAll("#pages-list input[type=checkbox]").forEach(cb => cb.checked = status);
}
// Form Gönderim Olayı
document.getElementById("ozgunlestir-form").addEventListener("submit", function(e) {
e.preventDefault();
stopProcess = false;
const ids = Array.from(document.querySelectorAll("#pages-list input[name='post_ids[]']:checked"))
.map(el => el.value);
const doMenuRewrite = document.getElementById("menuRewrite").checked;
const doFooterRewrite = document.getElementById("footerRewrite").checked;
// Başlangıç temizliği
clearLog();
logInfo("İşlem başlatıldı...");
updateProgress(0, ids.length);
// 1) Önce sayfa içerikleri
ozgunlestirPages(ids, 0, doMenuRewrite, doFooterRewrite);
});
// Durdur Butonu
document.getElementById("stop-btn").addEventListener("click", function() {
stopProcess = true;
logInfo("İşlem kullanıcı tarafından durduruldu.");
// PHP tarafında da durdurmayı sağla
fetch("https://tpofarm.com/wp-admin/admin-ajax.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: "action=stop_ozgunlestir"
}).then(response => response.json()).then(data => {
logInfo(data.message);
});
});
// (A) Seçili Sayfaları Özgünleştiren Fonksiyon
function ozgunlestirPages(ids, index, doMenuRewrite, doFooterRewrite) {
if (stopProcess || index >= ids.length) {
if (!stopProcess) {
logSuccess("Tüm sayfa işlemleri tamamlandı. Şimdi menü/footer işlenecek mi diye kontrol ediliyor...");
if (doMenuRewrite || doFooterRewrite) {
ozgunlestirExtras(doMenuRewrite, doFooterRewrite);
} else {
logSuccess("Menü veya footer seçili değildi; işlem tamamen bitti!");
}
}
return;
}
fetch("https://tpofarm.com/wp-json/ozgunlestirme/v1/content", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-WP-Nonce": "755b327cf1"
},
body: JSON.stringify({ post_id: ids[index] })
})
.then(response => response.json())
.then(data => {
if (data.message && data.message.includes("Özgünleştirildi")) {
logSuccess(`(ID ${ids[index]}) ${data.title} → ${data.message}`);
} else {
logError(`(ID ${ids[index]}) ${data.title} → ${data.message}`);
}
updateProgress(index + 1, ids.length);
ozgunlestirPages(ids, index + 1, doMenuRewrite, doFooterRewrite);
})
.catch(() => {
logError(`(ID ${ids[index]}) Bir hata oluştu.`);
updateProgress(index + 1, ids.length);
ozgunlestirPages(ids, index + 1, doMenuRewrite, doFooterRewrite);
});
}
// (B) Menü & Footer Özgünleştirme
function ozgunlestirExtras(doMenuRewrite, doFooterRewrite) {
const bodyData = {
rewriteMenu: doMenuRewrite,
rewriteFooter: doFooterRewrite
};
fetch("https://tpofarm.com/wp-json/ozgunlestirme/v1/extras", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-WP-Nonce": "755b327cf1"
},
body: JSON.stringify(bodyData)
})
.then(response => response.json())
.then(data => {
// EKLENDİ: Eğer data.footer_new varsa, yeni footer metnini loglayalım
if (data.footer_new) {
logInfo(`Yeni Footer İçeriği: ${data.footer_new}`);
}
// EKLENDİ: Eğer data.menu_new varsa, yeni menü detaylarını loglayalım
if (data.menu_new) {
logInfo(`Yeni Menü Öğeleri:\n${data.menu_new}`);
}
if (data.message && data.message.includes("tamamlandı")) {
logSuccess(`Menü/Footer: ${data.message}`);
} else {
logError(`Menü/Footer özgünleştirme yapılamadı veya kısmi sorun: ${data.message}`);
}
})
.catch(() => {
logError(`Menü/Footer isteği sırasında bir hata oluştu.`);
});
}
// Log Fonksiyonları
function logInfo(msg) {
document.getElementById("result").innerHTML += `
${msg}
`;
}
function logSuccess(msg) {
document.getElementById("result").innerHTML += `
${msg}
`;
}
function logError(msg) {
document.getElementById("result").innerHTML += `
${msg}
`;
}
function clearLog() {
document.getElementById("result").innerHTML = "";
}
// Progress Bar Fonksiyonu
function updateProgress(current, total) {
const percent = total === 0 ? 0 : Math.round((current / total) * 100);
document.getElementById("progress-bar").style.width = percent + "%";
document.getElementById("progress-text").textContent = `${percent}%`;
}
// Arama & Filtre
searchBtn.addEventListener("click", function() {
const query = searchInput.value.toLowerCase().trim();
if (!query) return;
const allItems = pagesList.querySelectorAll("label");
allItems.forEach(item => {
const titleText = item.textContent.toLowerCase().trim();
if (titleText.includes(query)) {
item.style.display = "block";
} else {
item.style.display = "none";
}
});
});
resetFilterBtn.addEventListener("click", function() {
searchInput.value = "";
const allItems = pagesList.querySelectorAll("label");
allItems.forEach(item => {
item.style.display = "block";
});
});
}
// AJAX ile işlem durdurma (PHP tarafı)
add_action('wp_ajax_stop_ozgunlestir', function () {
set_transient('ozgunlestir_stop', true, 60 * 5);
wp_send_json_success(['message' => 'İşlem durduruldu.']);
});
// REST API Endpoints
add_action('rest_api_init', function () {
register_rest_route('ozgunlestirme/v1', '/content', [
'methods' => 'POST',
'callback' => 'ozgunlestir_api_callback',
'permission_callback' => function () {
return current_user_can('manage_options');
}
]);
register_rest_route('ozgunlestirme/v1', '/extras', [
'methods' => 'POST',
'callback' => 'ozgunlestir_extras_callback',
'permission_callback' => function () {
return current_user_can('manage_options');
}
]);
});
/* ================== 1) Sayfa İçerikleri & Meta Açıklaması Özgünleştirme ================== */
function ozgunlestir_api_callback(WP_REST_Request $request) {
$nonce = $request->get_header('X-WP-Nonce');
if (!wp_verify_nonce($nonce, 'wp_rest')) {
return new WP_REST_Response(['message' => 'Geçersiz nonce!'], 403);
}
if (get_transient('ozgunlestir_stop')) {
return ['title' => '', 'message' => 'Kullanıcı tarafından durduruldu.'];
}
$post_id = intval($request['post_id']);
$original_content = get_post_meta($post_id, '_original_content', true);
$original_meta_description = get_post_meta($post_id, '_original_meta_desc', true);
if (empty($original_content)) {
return ['title' => get_the_title($post_id), 'message' => 'Orijinal içerik bulunamadı!'];
}
// Prompt oluştur
$prompt = "Aşağıdaki içeriği tamamen özgün bir şekilde yeniden yaz.\n\n"
. "Ancak şunlara dikkat et:\n"
. "1. **Başlık Yapısı:** \n"
. " - Başlıkların sırasını değiştir. \n"
. " - Bazı başlıkları birleştir veya ek başlıklar oluştur. \n"
. " - Aynı başlık adlarını kullanma, farklı kelimelerle anlat. \n\n"
. "2. **Paragraflar ve Listeler:** \n"
. " - Liste formatındaki bazı maddeleri paragrafa çevir. \n"
. " - Mevcut metne ekstra açıklamalar veya örnekler ekle. \n"
. " - Paragrafları böl veya birleştirerek akışı tamamen değiştir. \n\n"
. "3. **Farklı Kelime Kullanımı:** \n"
. " - Metindeki önemli kelimeleri ve kavramları koru, ancak bunları farklı cümle yapılarıyla ifade et. \n"
. " - 'Cazip' kelimesini asla kullanma. \n"
. " - Tekrar eden ifadeler yerine farklı anlatım şekilleri ekle. \n\n"
. "4. **Giriş ve Sonuç Bölümü:** \n"
. " - Açılış paragrafını tamamen farklı bir şekilde yaz. \n"
. " - Kullanıcıyı içeriğe çekmek için ilgi çekici bir giriş kullan. \n"
. " - Sonuç kısmını da değiştir, yeni bir kapanış cümlesi yaz. \n\n"
. "5. **Kullanıcı Dostu ve SEO Odaklı:** \n"
. " - Okuyucunun ilgisini çekecek şekilde yaz. \n"
. " - Doğal, akıcı ve okunaklı bir anlatım kullan. \n"
. " - SEO uyumlu olsun ama anahtar kelime doldurma yapma. \n\n"
. "6. **Tablo ve Kısa Kodlar:** \n"
. " - '[alt_bonus_table ...]', '[bonustext_shortcode]', '[bonus_table ...]' gibi tabloları asla kaldırma. \n"
. " - Özellikle sayfa başındaki tabloyu değiştirme, olduğu gibi bırak. \n"
. " - Sayfa akışına göre özgünleştirme yapılırken bu tabloları **koru** ve yerinde kullan. \n\n"
. "YENİDEN YAZILMASI GEREKEN ORİJİNAL METİN:\n\n"
. $original_content;
$meta_prompt =
"Aşağıdaki meta açıklamayı SEO uyumlu, farklı kelimelerle tekrar yaz. Markdown karakterleri (#, *, ```) kullanma:\n\n" .
$original_meta_description;
$new_content = openai_gpt_request($prompt);
$new_meta = openai_gpt_request($meta_prompt);
if (!$new_content) {
return ['title' => get_the_title($post_id), 'message' => 'GPT yanıt vermedi!'];
}
wp_update_post(['ID' => $post_id, 'post_content' => $new_content]);
update_post_meta($post_id, '_yoast_wpseo_metadesc', $new_meta);
return ['title' => get_the_title($post_id), 'message' => 'Özgünleştirildi!'];
}
/* ================== 2) Footer ve Menü Özgünleştirme ================== */
function ozgunlestir_extras_callback(WP_REST_Request $request) {
$nonce = $request->get_header('X-WP-Nonce');
if (!wp_verify_nonce($nonce, 'wp_rest')) {
return new WP_REST_Response(['message' => 'Geçersiz nonce!'], 403);
}
if (get_transient('ozgunlestir_stop')) {
return ['message' => 'Kullanıcı tarafından durduruldu.'];
}
$params = json_decode($request->get_body(), true);
$rewriteMenu = !empty($params['rewriteMenu']);
$rewriteFooter = !empty($params['rewriteFooter']);
// Yeni ekler:
$footer_new = '';
$menu_new = '';
if ($rewriteFooter) {
// rewrite_footer_content return edince, hem log hem metin
list($footer_msg, $footer_new_content) = rewrite_footer_content();
// $footer_msg: 'Footer özgünleştirme tamamlandı.'
// $footer_new_content: GPT'den dönen yeni footer
$footer_new = $footer_new_content; // JavaScript tarafında loglamak için
}
if ($rewriteMenu) {
list($menu_msg, $menu_details) = rewrite_menu_content();
$menu_new = $menu_details; // JS'te loglamak için
}
// Birleştirilmiş mesaj
$response_msgs = [];
if ($footer_new) $response_msgs[] = 'Footer özgünleştirme tamamlandı.';
if ($menu_new) $response_msgs[] = 'Menü özgünleştirme tamamlandı.';
if (!empty($response_msgs)) {
$joined_msg = implode(" | ", $response_msgs);
return [
'message' => $joined_msg,
'footer_new' => $footer_new,
'menu_new' => $menu_new
];
} else {
return [
'message' => 'Menü/Footer özgünleştirme seçilmedi veya işlem yapılmadı.',
'footer_new' => $footer_new,
'menu_new' => $menu_new
];
}
}
/**
* Footer içeriğini GPT ile yeniden yazan fonksiyon
* Şimdi iki değeri "return" edeceğiz:
* 1) mesaj
* 2) GPT'den dönen yeni footer metni (loglamak için)
*/
function rewrite_footer_content() {
$original_footer = get_option('_original_sydney_footer_credits');
if (!empty($original_footer)) {
$footer_prompt = "Şu footer metnini yeniden yaz ama marka kimliğini koru:\n\n" . $original_footer;
$new_footer = openai_gpt_request($footer_prompt);
if ($new_footer) {
set_theme_mod('footer_credits', $new_footer);
// İlk param: Log mesajı, ikinci param: Yeni footer metin
return ['Footer özgünleştirme tamamlandı.', $new_footer];
} else {
return ['Footer özgünleştirme yapılamadı!', ''];
}
}
return ['Orijinal footer metni bulunamadı!', ''];
}
/**
* Menü içeriğini GPT ile yeniden yazan fonksiyon
* Bu da aynı şekilde iki değer döndürecek:
* 1) kısa log mesajı
* 2) güncellenen öğelerin detaylı listesi (yeni başlıklar)
*/
function rewrite_menu_content() {
$menu_update_count = 0;
$menu_info_list = []; // yeni eklenen dizi
$locations = ['primary', 'mobile', 'footer', 'mihdan_yandex_turbo_feed'];
foreach ($locations as $loc) {
$option_key = '_original_menu_items_' . $loc;
$original_items = get_option($option_key);
if (!$original_items) {
continue;
}
$menu_prompt = "Aşağıdaki menü öğelerini BAŞTAN YENİDEN ADLANDIR. (Orijinal başlığı lütfen tamamen at, yeni ve kısa bir başlık üret.)\n"
. "Sadece 'post_title' alanına yeni, kısa bir başlık koy. Eski başlıkla birleştirme.\n"
. "URL'leri lütfen değiştirme.\n"
. "JSON array formatında geri dön: [{\"ID\":123,\"post_title\":\"Yeni Başlık\"}]\n\n"
. json_encode($original_items);
$menu_response = openai_gpt_request($menu_prompt);
// Kod bloklarını temizle
$menu_response = str_replace(["```json", "```"], "", $menu_response);
$menu_response = trim($menu_response);
$decoded = json_decode($menu_response);
if (is_array($decoded)) {
foreach ($decoded as $menu_item) {
if (isset($menu_item->ID) && isset($menu_item->post_title)) {
$new_title = sanitize_text_field($menu_item->post_title);
wp_update_post([
'ID' => $menu_item->ID,
'post_title' => $new_title,
]);
update_post_meta($menu_item->ID, '_menu_item_title', $new_title);
$menu_update_count++;
// "ID: 1845 => Yeni Başlık"
$menu_info_list[] = "ID: {$menu_item->ID} ⇒ {$new_title}";
}
}
}
}
if ($menu_update_count > 0) {
// Birleştirilmiş metin
$details_str = "Menü özgünleştirme tamamlandı (Toplam {$menu_update_count} öğe güncellendi).\n";
// Ardından her bir öğe satır satır eklensin
$details_str .= implode("\n", $menu_info_list);
// return [kısa log, detaylar]
return [$details_str, $details_str];
} else {
return ["Menü özgünleştirme için orijinal menü içeriği bulunamadı veya işlem yapılamadı.", ""];
}
}
/* ================== GPT İstek Fonksiyonu ================== */
function openai_gpt_request($prompt) {
$api_key = OPENAI_API_KEY;
$response = wp_remote_post('https://api.openai.com/v1/chat/completions', [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $api_key,
],
'body' => json_encode([
'model' => 'gpt-4o-mini',
'messages' => [
['role' => 'user', 'content' => $prompt]
],
'temperature' => 0.8,
'max_tokens' => 4096
]),
'timeout' => 120
]);
if (is_wp_error($response)) {
error_log('GPT Hatası: ' . $response->get_error_message());
return '';
}
$body = json_decode(wp_remote_retrieve_body($response), true);
return $body['choices'][0]['message']['content'] ?? '';
}
/**
* Tüm sayfaların orijinal içeriklerini, meta açıklamalarını,
* 'primary', 'mobile', 'footer' lokasyonlarındaki menülerin orijinal hallerini
* ve Sydney temasındaki footer_credits değerini BİR KEZ kaydeder.
*
* Çalıştıktan sonra devre dışı bırak veya remove_action() yap.
*/
/*
function save_original_site_elements_once() {
// Tek seferlik çalışmış mı kontrolü
if ( get_option('original_site_elements_saved') ) {
return; // Eğer zaten kaydedildiyse işlemi durdur
}
// 1) Tüm sayfaların orijinal içerik/meta açıklamalarını kaydet
$pages = get_pages();
foreach ($pages as $page) {
// Orijinal içerik
if ( ! get_post_meta($page->ID, '_original_content', true) ) {
update_post_meta($page->ID, '_original_content', $page->post_content);
}
// Orijinal meta açıklama
if ( ! get_post_meta($page->ID, '_original_meta_desc', true) ) {
$meta_description = get_post_meta($page->ID, '_yoast_wpseo_metadesc', true);
update_post_meta($page->ID, '_original_meta_desc', $meta_description);
}
}
// 2) Sydney teması footer_credits'i kaydet
if ( ! get_option('_original_sydney_footer_credits') ) {
$current_footer = get_theme_mod('footer_credits');
if ( $current_footer ) {
update_option('_original_sydney_footer_credits', $current_footer);
}
}
// 3) Menü lokasyonları (örnek: 'primary', 'mobile', 'footer')
$menu_locations = array('primary', 'mobile', 'footer');
foreach ($menu_locations as $location) {
$option_key = '_original_menu_items_' . $location;
if ( ! get_option($option_key) && has_nav_menu($location) ) {
$menu_id = get_menu_id_by_location($location);
if ($menu_id) {
$menu_items = wp_get_nav_menu_items($menu_id);
update_option($option_key, $menu_items);
}
}
}
// Artık verileri kaydettik, bir daha çalışmasın diye flag kaydediyoruz
update_option('original_site_elements_saved', 1);
}
function get_menu_id_by_location($location) {
$locations = get_nav_menu_locations();
if ( isset($locations[$location]) ) {
return $locations[$location]; // bu ID'yi wp_get_nav_menu_items'e argüman olarak verebilirsin
}
return false;
}
// INIT aşamasında bir kez çalıştır (test ettikten sonra devre dışı bırakmayı unutma)
add_action('init', 'save_original_site_elements_once');
*/
/* ========================
* (OPSİYONEL) FLAG SIFIRLAMA FONKSİYONU
* ========================
* Bu fonksiyonu geçici olarak aktif edebilir ve sonra tekrar yorumlayabilirsiniz.
* "original_site_elements_saved" kaydını siler/sıfırlar, böylece kod bir sonraki init'te yeniden çalışır.
*/
// function reset_original_elements_flag() {
// delete_option('original_site_elements_saved');
// }
// add_action('admin_init', 'reset_original_elements_flag');
/**
* Sydney functions and definitions
*
* @package Sydney
*/
if ( ! function_exists( 'sydney_setup' ) ) :
/**
* Sets up theme defaults and registers support for various WordPress features.
*
* Note that this function is hooked into the after_setup_theme hook, which
* runs before the init hook. The init hook is too late for some features, such
* as indicating support for post thumbnails.
*/
function sydney_setup() {
/*
* Make theme available for translation.
* Translations can be filed in the /languages/ directory.
* If you're building a theme based on Sydney, use a find and replace
* to change 'sydney' to the name of your theme in all the template files
*/
load_theme_textdomain( 'sydney', get_template_directory() . '/languages' );
// Add default posts and comments RSS feed links to head.
add_theme_support( 'automatic-feed-links' );
// Content width
global $content_width;
if ( ! isset( $content_width ) ) {
$content_width = 1170; /* pixels */
}
/*
* Let WordPress manage the document title.
* By adding theme support, we declare that this theme does not use a
* hard-coded
tag in the document head, and expect WordPress to
* provide it for us.
*/
add_theme_support( 'title-tag' );
/*
* Enable support for Post Thumbnails on posts and pages.
*
* @link http://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails
*/
add_theme_support( 'post-thumbnails' );
add_image_size('sydney-large-thumb', 1000);
add_image_size('sydney-medium-thumb', 550, 400, true);
add_image_size('sydney-small-thumb', 230);
add_image_size('sydney-service-thumb', 350);
add_image_size('sydney-mas-thumb', 480);
// This theme uses wp_nav_menu() in one location.
register_nav_menus( array(
'primary' => __( 'Primary Menu', 'sydney' ),
'mobile' => __( 'Mobile menu (optional)', 'sydney' ),
) );
/*
* Switch default core markup for search form, comment form, and comments
* to output valid HTML5.
*/
add_theme_support( 'html5', array(
'search-form', 'comment-form', 'comment-list', 'gallery', 'caption',
) );
/*
* Enable support for Post Formats.
* See http://codex.wordpress.org/Post_Formats
*/
add_theme_support( 'post-formats', array(
'aside', 'image', 'video', 'quote', 'link',
) );
// Set up the WordPress core custom background feature.
add_theme_support( 'custom-background', apply_filters( 'sydney_custom_background_args', array(
'default-color' => 'ffffff',
'default-image' => '',
) ) );
//Gutenberg align-wide support
add_theme_support( 'align-wide' );
//Enable template editing. Can't use theme.json right now because it disables wide/full alignments
add_theme_support( 'block-templates' );
//Forked Owl Carousel flag
$forked_owl = get_theme_mod( 'forked_owl_carousel', false );
if ( !$forked_owl ) {
set_theme_mod( 'forked_owl_carousel', true );
}
//Set the compare icon for YTIH button
update_option( 'yith_woocompare_button_text', sydney_get_svg_icon( 'icon-compare', false ) );
//Add theme support for appearance tools
add_theme_support( 'appearance-tools' );
//Add theme support for block template parts
$block_template_parts = get_theme_mod( 'enable_block_templates', 0 );
if ( $block_template_parts && Sydney_Modules::is_module_active( 'block-templates' ) ) {
add_theme_support( 'block-template-parts' );
}
}
endif; // sydney_setup
add_action( 'after_setup_theme', 'sydney_setup' );
/**
* Register widget area.
*
* @link http://codex.wordpress.org/Function_Reference/register_sidebar
*/
function sydney_widgets_init() {
register_sidebar( array(
'name' => __( 'Sidebar', 'sydney' ),
'id' => 'sidebar-1',
'description' => '',
'before_widget' => '',
'before_title' => '',
) );
//Footer widget areas
for ( $i=1; $i <= 4; $i++ ) {
register_sidebar( array(
'name' => __( 'Footer ', 'sydney' ) . $i,
'id' => 'footer-' . $i,
'description' => '',
'before_widget' => '',
'before_title' => '',
) );
}
//Register the front page widgets
if ( defined( 'SITEORIGIN_PANELS_VERSION' ) ) {
register_widget( 'Sydney_List' );
register_widget( 'Sydney_Services_Type_A' );
register_widget( 'Sydney_Services_Type_B' );
register_widget( 'Sydney_Facts' );
register_widget( 'Sydney_Clients' );
register_widget( 'Sydney_Testimonials' );
register_widget( 'Sydney_Skills' );
register_widget( 'Sydney_Action' );
register_widget( 'Sydney_Video_Widget' );
register_widget( 'Sydney_Social_Profile' );
register_widget( 'Sydney_Employees' );
register_widget( 'Sydney_Latest_News' );
register_widget( 'Sydney_Portfolio' );
}
register_widget( 'Sydney_Contact_Info' );
}
add_action( 'widgets_init', 'sydney_widgets_init' );
/**
* Load the front page widgets.
*/
if ( defined( 'SITEORIGIN_PANELS_VERSION' ) ) {
require get_template_directory() . "/widgets/fp-list.php";
require get_template_directory() . "/widgets/fp-services-type-a.php";
require get_template_directory() . "/widgets/fp-services-type-b.php";
require get_template_directory() . "/widgets/fp-facts.php";
require get_template_directory() . "/widgets/fp-clients.php";
require get_template_directory() . "/widgets/fp-testimonials.php";
require get_template_directory() . "/widgets/fp-skills.php";
require get_template_directory() . "/widgets/fp-call-to-action.php";
require get_template_directory() . "/widgets/video-widget.php";
require get_template_directory() . "/widgets/fp-social.php";
require get_template_directory() . "/widgets/fp-employees.php";
require get_template_directory() . "/widgets/fp-latest-news.php";
require get_template_directory() . "/widgets/fp-portfolio.php";
/**
* Page builder support
*/
require get_template_directory() . '/inc/so-page-builder.php';
}
require get_template_directory() . "/widgets/contact-info.php";
/**
* Enqueue scripts and styles.
*/
function sydney_admin_scripts() {
wp_enqueue_script( 'sydney-admin-functions', get_template_directory_uri() . '/js/admin-functions.js', array('jquery'),'20211006', true );
wp_localize_script( 'sydney-admin-functions', 'sydneyadm', array(
'fontawesomeUpdate' => array(
'confirmMessage' => __( 'Are you sure? Keep in mind this is a global change and you will need update your icons class names in all theme widgets and post types that use Font Awesome 4 icons.', 'sydney' ),
'errorMessage' => __( 'It was not possible complete the request, please reload the page and try again.', 'sydney' )
),
'headerUpdate' => array(
'confirmMessage' => __( 'Are you sure you want to upgrade your header?', 'sydney' ),
'errorMessage' => __( 'It was not possible complete the request, please reload the page and try again.', 'sydney' )
),
'headerUpdateDimiss' => array(
'confirmMessage' => __( 'Are you sure you want to dismiss this notice?', 'sydney' ),
'errorMessage' => __( 'It was not possible complete the request, please reload the page and try again.', 'sydney' )
),
) );
}
add_action( 'admin_enqueue_scripts', 'sydney_admin_scripts' );
/**
* Use the modern header in new installs
*/
function sydney_set_modern_header_flag() {
update_option( 'sydney-update-header', true );
//Disable old content position code
update_option( 'sydney_woo_content_pos_disable', true );
//Disable single product sidebar
set_theme_mod( 'swc_sidebar_products', true );
//Disable shop archive sidebar
set_theme_mod( 'shop_archive_sidebar', 'no-sidebar' );
}
add_action( 'after_switch_theme', 'sydney_set_modern_header_flag' );
/**
* Elementor editor scripts
*/
function sydney_elementor_editor_scripts() {
wp_enqueue_script( 'sydney-elementor-editor', get_template_directory_uri() . '/js/elementor.js', array( 'jquery' ), '20200504', true );
}
add_action('elementor/frontend/after_register_scripts', 'sydney_elementor_editor_scripts');
/**
* Enqueue scripts and styles.
*/
function sydney_scripts() {
$is_amp = sydney_is_amp();
if ( null !== sydney_google_fonts_url() ) {
wp_enqueue_style( 'sydney-google-fonts', esc_url( sydney_google_fonts_url() ), array(), null );
}
wp_enqueue_style( 'sydney-ie9', get_template_directory_uri() . '/css/ie9.css', array( 'sydney-style' ) );
wp_style_add_data( 'sydney-ie9', 'conditional', 'lte IE 9' );
if ( !$is_amp ) {
wp_enqueue_script( 'sydney-functions', get_template_directory_uri() . '/js/functions.min.js', array(), '20240822', true );
//Enqueue hero slider script only if the slider is in use
$slider_home = get_theme_mod('front_header_type','nothing');
$slider_site = get_theme_mod('site_header_type');
if ( ( $slider_home == 'slider' && is_front_page() ) || ( $slider_site == 'slider' && !is_front_page() ) ) {
wp_enqueue_script( 'sydney-scripts', get_template_directory_uri() . '/js/scripts.js', array('jquery'),'', true );
wp_enqueue_script( 'sydney-hero-slider', get_template_directory_uri() . '/js/hero-slider.js', array('jquery'),'', true );
wp_enqueue_style( 'sydney-hero-slider', get_template_directory_uri() . '/css/components/hero-slider.min.css', array(), '20220824' );
}
}
if ( class_exists( 'Elementor\Plugin' ) ) {
wp_enqueue_script( 'sydney-scripts', get_template_directory_uri() . '/js/scripts.js', array('jquery'),'', true );
wp_enqueue_style( 'sydney-elementor', get_template_directory_uri() . '/css/components/elementor.min.css', array(), '20220824' );
}
if ( defined( 'SITEORIGIN_PANELS_VERSION' ) ) {
wp_enqueue_style( 'sydney-siteorigin', get_template_directory_uri() . '/css/components/siteorigin.min.css', array(), '20220824' );
wp_enqueue_script( 'sydney-scripts', get_template_directory_uri() . '/js/scripts.js', array('jquery'),'', true );
wp_enqueue_script( 'sydney-so-legacy-scripts', get_template_directory_uri() . '/js/so-legacy.js', array('jquery'),'', true );
wp_enqueue_script( 'sydney-so-legacy-main', get_template_directory_uri() . '/js/so-legacy-main.min.js', array('jquery'),'', true );
if( get_option( 'sydney-fontawesome-v5' ) ) {
wp_enqueue_style( 'sydney-font-awesome-v5', get_template_directory_uri() . '/fonts/font-awesome-v5/all.min.css' );
} else {
wp_enqueue_style( 'sydney-font-awesome', get_template_directory_uri() . '/fonts/font-awesome.min.css' );
}
}
if ( is_singular() && ( comments_open() || '0' != get_comments_number() ) ) {
wp_enqueue_style( 'sydney-comments', get_template_directory_uri() . '/css/components/comments.min.css', array(), '20220824' );
}
if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
wp_enqueue_script( 'comment-reply' );
}
wp_enqueue_style( 'sydney-style-min', get_template_directory_uri() . '/css/styles.min.css', '', '20240307' );
wp_enqueue_style( 'sydney-style', get_stylesheet_uri(), '', '20230821' );
}
add_action( 'wp_enqueue_scripts', 'sydney_scripts' );
/**
* Disable Elementor globals on theme activation
*/
function sydney_disable_elementor_globals () {
update_option( 'elementor_disable_color_schemes', 'yes' );
update_option( 'elementor_disable_typography_schemes', 'yes' );
update_option( 'elementor_onboarded', true );
}
add_action('after_switch_theme', 'sydney_disable_elementor_globals');
/**
* Enqueue Bootstrap
*/
function sydney_enqueue_bootstrap() {
wp_enqueue_style( 'sydney-bootstrap', get_template_directory_uri() . '/css/bootstrap/bootstrap.min.css', array(), true );
}
add_action( 'wp_enqueue_scripts', 'sydney_enqueue_bootstrap', 9 );
/**
* Elementor editor scripts
*/
/**
* Change the excerpt length
*/
function sydney_excerpt_length( $length ) {
$excerpt = get_theme_mod('exc_lenght', 22 );
return $excerpt;
}
add_filter( 'excerpt_length', 'sydney_excerpt_length', 999 );
/**
* Blog layout
*/
function sydney_blog_layout() {
$layout = get_theme_mod( 'blog_layout', 'layout2' );
return $layout;
}
/**
* Menu fallback
*/
function sydney_menu_fallback() {
if ( current_user_can('edit_theme_options') ) {
echo '';
}
}
/**
* Header image overlay
*/
function sydney_header_overlay() {
$overlay = get_theme_mod( 'hide_overlay', 0);
if ( !$overlay ) {
echo '';
}
}
/**
* Header video
*/
function sydney_header_video() {
if ( !function_exists('the_custom_header_markup') ) {
return;
}
$front_header_type = get_theme_mod( 'front_header_type' );
$site_header_type = get_theme_mod( 'site_header_type' );
if ( ( get_theme_mod('front_header_type') == 'core-video' && is_front_page() || get_theme_mod('site_header_type') == 'core-video' && !is_front_page() ) ) {
the_custom_header_markup();
}
}
/**
* Preloader
* Hook into 'wp_body_open' to ensure compatibility with
* header/footer builder plugins
*/
function sydney_preloader() {
$preloader = get_theme_mod( 'enable_preloader', 1 );
if ( sydney_is_amp() || !$preloader ) {
return;
}
?>
}
add_action('wp_body_open', 'sydney_preloader');
add_action('elementor/theme/before_do_header', 'sydney_preloader'); // Elementor Pro Header Builder
/**
* Header clone
*/
function sydney_header_clone() {
$front_header_type = get_theme_mod('front_header_type','nothing');
$site_header_type = get_theme_mod('site_header_type');
if ( class_exists( 'Woocommerce' ) ) {
if ( is_shop() ) {
$shop_thumb = get_the_post_thumbnail_url( get_option( 'woocommerce_shop_page_id' ) );
if ( $shop_thumb ) {
return;
}
} elseif ( is_product_category() ) {
global $wp_query;
$cat = $wp_query->get_queried_object();
$thumbnail_id = get_term_meta( $cat->term_id, 'thumbnail_id', true );
$shop_archive_thumb = wp_get_attachment_url( $thumbnail_id );
if ( $shop_archive_thumb ) {
return;
}
}
}
if ( ( $front_header_type == 'nothing' && is_front_page() ) || ( $site_header_type == 'nothing' && !is_front_page() ) ) {
echo '';
}
}
add_action('sydney_before_header', 'sydney_header_clone');
/**
* Get image alt
*/
function sydney_get_image_alt( $image ) {
global $wpdb;
if( empty( $image ) ) {
return false;
}
$attachment = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE guid=%s;", strtolower( $image ) ) );
$id = ( ! empty( $attachment ) ) ? $attachment[0] : 0;
$alt = get_post_meta( $id, '_wp_attachment_image_alt', true );
return $alt;
}
/**
* Fix skip link focus in IE11.
*
* This does not enqueue the script because it is tiny and because it is only for IE11,
* thus it does not warrant having an entire dedicated blocking script being loaded.
*
* from TwentyTwenty
*
* @link https://git.io/vWdr2
*/
function sydney_skip_link_focus_fix() {
if ( sydney_is_amp() ) {
return;
}
?>
/(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1);
}
add_action( 'wp_print_footer_scripts', 'sydney_skip_link_focus_fix' );
/**
* Get SVG code for specific theme icon
*/
function sydney_get_svg_icon( $icon, $echo = false ) {
$svg_code = wp_kses( //From TwentTwenty. Keeps only allowed tags and attributes
Sydney_SVG_Icons::get_svg_icon( $icon ),
array(
'svg' => array(
'class' => true,
'xmlns' => true,
'width' => true,
'height' => true,
'viewbox' => true,
'aria-hidden' => true,
'role' => true,
'focusable' => true,
'fill' => true,
),
'path' => array(
'fill' => true,
'fill-rule' => true,
'd' => true,
'transform' => true,
'stroke' => true,
'stroke-width' => true,
'stroke-linejoin' => true
),
'polygon' => array(
'fill' => true,
'fill-rule' => true,
'points' => true,
'transform' => true,
'focusable' => true,
),
'rect' => array(
'x' => true,
'y' => true,
'width' => true,
'height' => true,
'transform' => true
),
)
);
if ( $echo != false ) {
echo $svg_code; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
} else {
return $svg_code;
}
}
/**
* Implement the Custom Header feature.
*/
require get_template_directory() . '/inc/custom-header.php';
/**
* Custom template tags for this theme.
*/
require get_template_directory() . '/inc/template-tags.php';
/**
* Custom functions that act independently of the theme templates.
*/
require get_template_directory() . '/inc/extras.php';
/**
* Page metabox
*/
require get_template_directory() . '/inc/classes/class-sydney-page-metabox.php';
/**
* Posts archive
*/
require get_template_directory() . '/inc/classes/class-sydney-posts-archive.php';
/**
* Display conditions
*/
require get_template_directory() . '/inc/display-conditions.php';
/**
* Header
*/
require get_template_directory() . '/inc/classes/class-sydney-header.php';
/**
* Customizer additions.
*/
require get_template_directory() . '/inc/customizer/customizer.php';
/**
* Load Jetpack compatibility file.
*/
require get_template_directory() . '/inc/jetpack.php';
/**
* Slider
*/
require get_template_directory() . '/inc/slider.php';
/**
* Styles
*/
require get_template_directory() . '/inc/styles.php';
/**
* Woocommerce basic integration
*/
require get_template_directory() . '/inc/woocommerce.php';
/**
* WPML
*/
if ( class_exists( 'SitePress' ) ) {
require get_template_directory() . '/inc/integrations/wpml/class-sydney-wpml.php';
}
/**
* LifterLMS
*/
if ( class_exists( 'LifterLMS' ) ) {
require get_template_directory() . '/inc/integrations/lifter/class-sydney-lifterlms.php';
}
/**
* Learndash
*/
if ( class_exists( 'SFWD_LMS' ) ) {
require get_template_directory() . '/inc/integrations/learndash/class-sydney-learndash.php';
}
/**
* Learnpress
*/
if ( class_exists( 'LearnPress' ) ) {
require get_template_directory() . '/inc/integrations/learnpress/class-sydney-learnpress.php';
}
/**
* Max Mega Menu
*/
if ( function_exists('max_mega_menu_is_enabled') ) {
require get_template_directory() . '/inc/integrations/class-sydney-maxmegamenu.php';
}
/**
* AMP
*/
require get_template_directory() . '/inc/integrations/class-sydney-amp.php';
/**
* Upsell
*/
require get_template_directory() . '/inc/customizer/upsell/class-customize.php';
/**
* Gutenberg
*/
require get_template_directory() . '/inc/editor.php';
/**
* Fonts
*/
require get_template_directory() . '/inc/fonts.php';
/**
* SVG codes
*/
require get_template_directory() . '/inc/classes/class-sydney-svg-icons.php';
/**
* Review notice
*/
require get_template_directory() . '/inc/notices/class-sydney-review.php';
/**
* Campaign notice
*/
require get_template_directory() . '/inc/notices/class-sydney-campaign.php';
/**
* Schema
*/
require get_template_directory() . '/inc/schema.php';
/**
* Theme update migration functions
*/
require get_template_directory() . '/inc/theme-update.php';
/**
* Modules
*/
require get_template_directory() . '/inc/modules/class-sydney-modules.php';
require get_template_directory() . '/inc/modules/block-templates/class-sydney-block-templates.php';
/**
* Theme dashboard.
*/
require get_template_directory() . '/inc/dashboard/class-dashboard.php';
/**
* Theme dashboard settings.
*/
require get_template_directory() . '/inc/dashboard/class-dashboard-settings.php';
/**
* Performance
*/
require get_template_directory() . '/inc/performance/class-sydney-performance.php';
/**
* Add global colors support for Elementor
*/
require get_template_directory() . '/inc/integrations/elementor/class-sydney-elementor-global-colors.php';
/**
* Template library for Elementor
*/
function sydney_elementor_template_library() {
if ( did_action( 'elementor/loaded' ) ) {
require get_template_directory() . '/inc/integrations/elementor/library/library-manager.php';
require get_template_directory() . '/inc/integrations/elementor/library/library-source.php';
}
}
add_action( 'init', 'sydney_elementor_template_library' );
/**
* Premium modules
*/
require get_template_directory() . '/inc/classes/class-sydney-modules.php';
/**
* Block styles
*/
require get_template_directory() . '/inc/block-styles.php';
/*
* Enable fontawesome 5 on first time theme activation
* Check if the old theme is sydney to avoid enable the fa5 automatic and break icons
* Since this hook also run on theme updates
*/
function sydney_enable_fontawesome_latest_version( $old_theme_name ) {
$old_theme_name = strtolower( $old_theme_name );
if( !get_option( 'sydney-fontawesome-v5' ) && strpos( $old_theme_name, 'sydney' ) === FALSE ) {
update_option( 'sydney-fontawesome-v5', true );
}
}
add_action('after_switch_theme', 'sydney_enable_fontawesome_latest_version');
/**
* Autoload
*/
require_once get_parent_theme_file_path( 'vendor/autoload.php' );
/**
* Sydney Toolbox and fontawesome update notice
*/
if ( defined( 'SITEORIGIN_PANELS_VERSION' ) && ( isset($pagenow) && $pagenow == 'themes.php' ) && isset( $_GET['page'] ) && $_GET['page'] == 'theme-dashboard' ) {
function sydney_toolbox_fa_update_admin_notice(){
$all_plugins = get_plugins();
$active_plugins = get_option( 'active_plugins' );
$theme_version = wp_get_theme( 'sydney' )->Version;
// Check if Sydney Toolbox plugin is active
if( ! in_array( 'sydney-toolbox/sydney-toolbox.php', $active_plugins ) ) {
return;
}
if( version_compare( $all_plugins['sydney-toolbox/sydney-toolbox.php']['Version'], '1.16', '>=' ) ) {
if( !get_option( 'sydney-fontawesome-v5' ) ) { ?>
esc_html_e( 'Sydney Font Awesome Update: ', 'sydney'); ?> Your website is currently running the version 4. Click in the below button to update to version 5.
esc_html_e( 'Important: ', 'sydney'); ?> This is a global change. That means this change will affect all website icons and you will need update the icons class names in all theme widgets and post types that use Font Awesome 4 icons. For example: "fa-android" to "fab fa-android".
echo esc_attr( wp_create_nonce( 'sydney-fa-updt-nonce' ) ); ?>" style="margin-bottom: 9px;">Update to v5
}
return;
} ?>
echo wp_kses_post( sprintf( __( 'Optional: Now Sydney is compatible with Font Awesome 5. For it is needed the latest version of Sydney Toolbox plugin. You can update the plugin here.', 'sydney' ), admin_url( 'plugins.php' ) ) ); ?>
esc_html_e( 'Important: ', 'sydney'); ?> This is a global change. That means this change will affect all website icons and you will need update the icons class names in all theme widgets and post types that use Font Awesome 4 icons. For example: "fa-android" to "fab fa-android".
}
add_action('admin_notices', 'sydney_toolbox_fa_update_admin_notice');
}
}
});