ما در یک پروژه نیاز داشتیم برای کاربران ای دی کارت صادر کنیم.
با arform ثبت نام کاربران رو انجام دادیم ولی عکس ها در خروجی arform نمایش داده نمیشد که با کد زیر که در فانکشن گذاشتیم و در رپیتور یک باکس متنی خالی قرار دادیم برای ورود url مشکل برطرف شد.
با arform ثبت نام کاربران رو انجام دادیم ولی عکس ها در خروجی arform نمایش داده نمیشد که با کد زیر که در فانکشن گذاشتیم و در رپیتور یک باکس متنی خالی قرار دادیم برای ورود url مشکل برطرف شد.
// arform
/**
* ARForms 5.98 – Fill PhotoURL (field 152) with the real file URL per repeater row
* Runs VERY EARLY so ARForms sees the values when saving.
*/
define('ARF_FORM_ID', 102);
define('ARF_REPEAT_PARENT', 144);
define('ARF_FILE_FIELD', 151); // stores attachment IDs
define('ARF_PHOTOURL_FIELD', 152); // your Text/Hidden field inside repeater
function _arf_fill_photourls_early() {
// فقط وقتی همین فرم ارسال شده
if (empty($_POST['is_submit_form_'.ARF_FORM_ID])) {
return;
}
// آرایه آیدی های پیوست در هر ردیف ریپیتر (همون hidden که ARForms میسازه)
$files_by_row = isset($_POST['item_meta'][ARF_REPEAT_PARENT][ARF_FILE_FIELD])
? (array) $_POST['item_meta'][ARF_REPEAT_PARENT][ARF_FILE_FIELD] : [];
if (!$files_by_row) {
return;
}
foreach ($files_by_row as $i => $attach_id) {
$attach_id = intval($attach_id);
if ($attach_id <= 0) { continue; }
// URL فایل از روی attachment ID
$url = wp_get_attachment_url($attach_id);
if (!$url) { continue; }
// مقدار را قبل از ذخیره در POST تزریق میکنیم تا ARForms همان را ذخیره کند
$_POST['item_meta'][ARF_REPEAT_PARENT][ARF_PHOTOURL_FIELD][$i] = esc_url_raw($url);
}
}
/* خیلی زود اجرا شود تا قبل از پردازش ARForms باشد */
add_action('plugins_loaded', '_arf_fill_photourls_early', 1);
/* پشتیبان در صورت لود ترتیب متفاوت */
add_action('wp', '_arf_fill_photourls_early', 1);
❤1
اگر در سایت تون از اسکیما ی رنک مث استفاده میکنید و قیمت محصولات به تومان هست میتونید از مشکل عدم نمایش صحیح قیمت در سرپ با کد زیر جلوگیری نمایید.
کد خطا : Invalid ISO 4217 currency code (optional)
#schema #rankmath
#snippet
کد خطا : Invalid ISO 4217 currency code (optional)
#schema #rankmath
#snippet
/* --- جلوگیری از نمایش تومان در اسنیپت گوگل --- */
add_filter( 'woocommerce_get_price_html', function( $price_html ) {
// فقط تومانِ نمایشی را از اسنیپت گوگل پنهان میکنیم
$price_html = str_replace(
'<span class="woocommerce-Price-currencySymbol">',
'<span class="woocommerce-Price-currencySymbol" data-nosnippet>',
$price_html
);
return $price_html;
});
یکی از مشکلات دیجیتس اینه که کاربر وقتی لاگین میکنه با موبایل برنمیگرده همون صفحه ای که در اون لاگین کرده . با کد زیر این مشکل برطرف میشه :
#digits #login #my-account #redirect
#digits #login #my-account #redirect
// برگشت به صفحه ای که بوده در دیجیتس
/**
* Return user to the same page after Digits/WC login by webinew
* Priority: cookie(last page) > request redirect_to (if not my-account) > fallback - Ehsan Ghasimi
*/
/* Save last seen page for guests (avoid login/account pages) */
add_action('init', function () {
if (is_user_logged_in() || is_admin()) return;
$scheme = is_ssl() ? 'https' : 'http';
$url = $scheme . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if (strpos($url, 'wp-login.php') !== false || preg_match('#/my-account/?($|\?)#', $url)) return;
setcookie('dg_return_to', $url, time() + 1800, '/', '', is_ssl(), false);
}, 5);
/* Helper: pick the correct return url */
function _dg_pick_return_url($current = '') {
$fallback = function_exists('wc_get_page_permalink') ? wc_get_page_permalink('myaccount') : home_url('/');
// 1) If request redirect_to exists and is NOT my-account, honor it
if (!empty($_REQUEST['redirect_to'])) {
$req = esc_url_raw($_REQUEST['redirect_to']);
$path = wp_parse_url($req, PHP_URL_PATH);
if ($path && strpos($path, '/my-account') === false && strpos($path, 'wp-login.php') === false) {
return wp_validate_redirect($req, $fallback);
}
}
// 2) If cookie exists, use it
if (!empty($_COOKIE['dg_return_to'])) {
$ret = esc_url_raw($_COOKIE['dg_return_to']);
if ($ret && strpos($ret, '/my-account') === false && strpos($ret, 'wp-login.php') === false) {
return wp_validate_redirect($ret, $fallback);
}
}
// 3) Else, if current candidate is valid, use it
if ($current && strpos($current, '/my-account') === false && strpos($current, 'wp-login.php') === false) {
return wp_validate_redirect($current, $fallback);
}
return $fallback;
}
/* Fix early when theme/plugin sends ?login=true&redirect_to=/my-account/ */
add_action('init', function () {
if (!is_user_logged_in()
&& isset($_GET['login'])
&& isset($_GET['redirect_to'])
&& preg_match('#/my-account/?$#', (string) $_GET['redirect_to'])
) {
$ref = !empty($_COOKIE['dg_return_to']) ? $_COOKIE['dg_return_to'] : wp_get_raw_referer();
if ($ref && strpos($ref, '/my-account') === false && strpos($ref, 'wp-login.php') === false) {
$_GET['redirect_to'] = $ref;
$_REQUEST['redirect_to'] = $ref;
}
}
}, 6);
/* Enforce destination in Digits hooks */
add_filter('digits_login_redirect', function ($url) {
return _dg_pick_return_url($url);
}, 999);
add_filter('digits_login_user_redirect', function ($url, $user_id) {
return _dg_pick_return_url($url);
}, 999, 2);
/* Enforce destination in WooCommerce login too */
add_filter('woocommerce_login_redirect', function ($redirect, $user) {
return _dg_pick_return_url($redirect);
}, 9999, 2);
/* Neutralize Digits' own WC redirect (if present) */
add_action('init', function () {
if (has_filter('woocommerce_login_redirect', 'digits_wc_login_redirect')) {
remove_filter('woocommerce_login_redirect', 'digits_wc_login_redirect', 10);
}
}, 20);
/* After login, if we land on /?redirect_to=/my-account/, jump to cookie page (your current end-state) */
add_action('template_redirect', function () {
if (is_user_logged_in()
&& isset($_GET['redirect_to'])
&& preg_match('#/my-account/?$#', (string) $_GET['redirect_to'])
&& !empty($_COOKIE['dg_return_to'])
) {
$ret = esc_url_raw($_COOKIE['dg_return_to']);
if ($ret && strpos($ret, '/my-account') === false && strpos($ret, 'wp-login.php') === false) {
// clear cookie to avoid loops, then redirect
setcookie('dg_return_to', '', time() - 3600, '/', '', is_ssl(), false);
wp_safe_redirect( wp_validate_redirect($ret, home_url('/')) );
exit;
}
}
}, 1);
// بازنویسی لینکهای /my-account تا قبل از کلیک، مقصد را "همین صفحه" کند
add_action('wp_footer', function () {
if (is_user_logged_in() || is_admin()) return; ?>
<script>
(function(){
var here = location.href.split('#')[0];
// لینکهای رایج به صفحه ورود/اکانت (منو، دکمه، …)
var sels = 'a[href$="/my-account"],a[href$="/my-account/"],a[href*="/my-account?"],a[href*="/my-account/?"]';
document.querySelectorAll(sels).forEach(function(a){
try{
var u = new URL(a.getAttribute('href'), location.origin);
u.searchParams.set('login','true'); // برای باز شدن فرم لاگین
u.searchParams.set('redirect_to', here); // مقصد: همین صفحه
a.setAttribute('href', u.toString());
}catch(e){}
});
})();
</script>
<?php }, 99);
image_2025-10-12_14-15-43.png
95.1 KB
این کد را بهصورت فایل زیر بساز:
wp-content/mu-plugins/shgs-perf-logger.php
(اگر پوشه mu-plugins نبود، بساز)
فایل wp-content/shayesteh-perf.log را ببین.
اگر زمان اجرای صفحات product/category گاهی بالای 1500–2000ms شد، باید سراغ بهینهسازی Queryها/کش برویم (Object Cache، کاهش ویجتهای سنگین Elementor، کمکردن کوئریهای Related Products،…).
یکی از راه های مهم و معمول برای کاهش درخواست ها بررسی کران جاب هست و کنترل اون از طریق سی پنل که در پست بعدی آموزش داده خواهد شد.
wp-content/mu-plugins/shgs-perf-logger.php
(اگر پوشه mu-plugins نبود، بساز)
<?php
/**
* Plugin Name: SHGS Perf Logger (MU)
* Description: لاگکردن زمان اجرای PHP برای صفحات مهم + هدر دیباگ
* Author: Webinew
* Version: 1.0.0
*/
if ( ! defined('ABSPATH') ) exit;
define( 'SHGS_PERF_LOG', WP_CONTENT_DIR . '/webinew-perf.log' );
$GLOBALS['shgs_perf_start'] = microtime(true);
// نگهداری نهایتا 5MB
function shgs_perf_maybe_rotate_log() {
$file = SHGS_PERF_LOG;
if ( file_exists($file) && filesize($file) > 5 * 1024 * 1024 ) {
@rename($file, $file . '.' . date('Ymd_His'));
}
}
shgs_perf_maybe_rotate_log();
add_action('shutdown', function () {
$duration = microtime(true) - ( $GLOBALS['shgs_perf_start'] ?? microtime(true) );
$duration_ms = round($duration * 1000, 2);
// نوع صفحه
$type = 'other';
if ( function_exists('is_product') && is_product() ) $type = 'product';
elseif ( function_exists('is_product_category') && is_product_category() ) $type = 'product_cat';
elseif ( is_home() || is_front_page() ) $type = 'home';
elseif ( is_page() ) $type = 'page';
elseif ( is_single() ) $type = 'single';
elseif ( is_archive() ) $type = 'archive';
elseif ( is_search() ) $type = 'search';
// کاربر/بات
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$is_bot = ( stripos($ua, 'googlebot') !== false ) ? 'googlebot' : ( stripos($ua, 'bot') !== false ? 'bot' : 'human' );
// وضعیت پاسخ (اگر در دسترس)
$status = http_response_code();
$line = sprintf(
"[%s]\t%s\t%s\t%s\t%s\t%sms\tstatus:%s\n",
date('Y-m-d H:i:s'),
$_SERVER['REQUEST_METHOD'] ?? '-',
( $_SERVER['REQUEST_URI'] ?? '-' ),
$type,
$is_bot,
$duration_ms,
$status
);
error_log($line, 3, SHGS_PERF_LOG);
// برای دیباگ لحظهای در مرورگر
if ( !headers_sent() ) {
header('X-Exec-Time: ' . $duration_ms . 'ms');
header('X-Exec-Type: ' . $type);
}
});
فایل wp-content/shayesteh-perf.log را ببین.
اگر زمان اجرای صفحات product/category گاهی بالای 1500–2000ms شد، باید سراغ بهینهسازی Queryها/کش برویم (Object Cache، کاهش ویجتهای سنگین Elementor، کمکردن کوئریهای Related Products،…).
یکی از راه های مهم و معمول برای کاهش درخواست ها بررسی کران جاب هست و کنترل اون از طریق سی پنل که در پست بعدی آموزش داده خواهد شد.
برطرف کردن خطای فونت در pagespeed
باعث میشه font-display: swap; در font-face ها اضافه شود.
#webinew #speed #elementortips
/**
* Force font-display: swap for Elementor Custom Fonts
*/
add_filter( 'elementor_pro/custom_fonts/font_display', function( $current_value, $font_family, $data ) {
return 'swap';
}, 10, 3 );
باعث میشه font-display: swap; در font-face ها اضافه شود.
#webinew #speed #elementortips
digits-8.4.6.zip
12.3 MB
افزونه دیجیتس
8.4.6
تست شده با php 8.3
فقط درگاه ملی پیامک
8.4.6
تست شده با php 8.3
فقط درگاه ملی پیامک
// رفع lcp ویدئو ابتدای سایت
function add_lcp_video_preload() {
?>
<link rel="preload" as="video" href="https://webinew.com/wp-content/uploads/2025/05/A-Cinematic-Highresolution-202505271556x264Q06-03-1404.mp4" fetchpriority="high" type="video/mp4">
<?php
}
add_action('wp_head', 'add_lcp_video_preload');
function add_lcp_video_preload() {
?>
<link rel="preload" as="video" href="https://webinew.com/wp-content/uploads/2025/05/A-Cinematic-Highresolution-202505271556x264Q06-03-1404.mp4" fetchpriority="high" type="video/mp4">
<?php
}
add_action('wp_head', 'add_lcp_video_preload');
بعد از 340 ساعت خاموشی مطلق، با اندکی دسترسی به اینترنت بینالملل سلام.
امیدوارم در این روزهای سخت، توان ادامه دادن داشته باشید. ❤️🩹
گزارشی کوتاه از وضعیت سئو سایتها در این مدت بحرانی:
۱. سایتهای روی سرور ایران (هاست داخلی)
در این مدت گوگل تقریباً هیچ دسترسی به این وبسایتها نداشته است. بهخصوص در روزهای اوج اختلالات، گزارشهای کنسول جستجو (Server Connectivity) بیش از ۹۷٪ خطای Crawl failed را نشان میدهند.
تبعات: حذف تایتلها و دیسکریپشنها از نتایج جستجو و ریزش شدید رتبهها.
نو ایندکس صفحات چون گوگل فکر میکنه این سایت پاک شده و نیست دیگه.
راهکار: فعلاً هیچ اقدام فنی مؤثری نمیتوان انجام داد؛ باید منتظر ماند.
۲. سایتهای روی سرور خارج
گوگل به این سایتها دسترسی کامل دارد و این در ظاهر خوب است، اما مشکل اصلی جای دیگریست.
مزیت: رتبهها فعلاً حفظ شدهاند چون رباتهای گوگل سایت را میبینند.
معایب: به دلیل عدم دسترسی کاربران داخل کشور و افت شدید ترافیک، نرخ کلیک و تعامل به صفر نزدیک شده است. این موضوع به زودی منجر به ریزش سنگین رتبهها خواهد شد.
راهکار: کمی صبر کنید؛ اگر وضعیت اینترنت در هفته آتی به همین منوال باقی بماند، برای بقای بیزینس احتمالاً مجبور به انتقال موقت به هاست داخلی خواهید بود.
چالش بزرگ انتقال
در حال حاضر بسیاری از هاستینگهای داخلی به دلیل محدودیتهای شبکه، امکان دریافت بکآپ مستقیم از سرورهای خارجی را ندارند که این موضوع فرآیند جابهجایی را با ریسک و دشواری زیادی همراه کرده است.
به امید بازگشت روزهای روشن و اینترنت آزاد برای ایران عزیزمان. 🕊
@webinewcom
امیدوارم در این روزهای سخت، توان ادامه دادن داشته باشید. ❤️🩹
گزارشی کوتاه از وضعیت سئو سایتها در این مدت بحرانی:
۱. سایتهای روی سرور ایران (هاست داخلی)
در این مدت گوگل تقریباً هیچ دسترسی به این وبسایتها نداشته است. بهخصوص در روزهای اوج اختلالات، گزارشهای کنسول جستجو (Server Connectivity) بیش از ۹۷٪ خطای Crawl failed را نشان میدهند.
تبعات: حذف تایتلها و دیسکریپشنها از نتایج جستجو و ریزش شدید رتبهها.
نو ایندکس صفحات چون گوگل فکر میکنه این سایت پاک شده و نیست دیگه.
راهکار: فعلاً هیچ اقدام فنی مؤثری نمیتوان انجام داد؛ باید منتظر ماند.
۲. سایتهای روی سرور خارج
گوگل به این سایتها دسترسی کامل دارد و این در ظاهر خوب است، اما مشکل اصلی جای دیگریست.
مزیت: رتبهها فعلاً حفظ شدهاند چون رباتهای گوگل سایت را میبینند.
معایب: به دلیل عدم دسترسی کاربران داخل کشور و افت شدید ترافیک، نرخ کلیک و تعامل به صفر نزدیک شده است. این موضوع به زودی منجر به ریزش سنگین رتبهها خواهد شد.
راهکار: کمی صبر کنید؛ اگر وضعیت اینترنت در هفته آتی به همین منوال باقی بماند، برای بقای بیزینس احتمالاً مجبور به انتقال موقت به هاست داخلی خواهید بود.
چالش بزرگ انتقال
در حال حاضر بسیاری از هاستینگهای داخلی به دلیل محدودیتهای شبکه، امکان دریافت بکآپ مستقیم از سرورهای خارجی را ندارند که این موضوع فرآیند جابهجایی را با ریسک و دشواری زیادی همراه کرده است.
به امید بازگشت روزهای روشن و اینترنت آزاد برای ایران عزیزمان. 🕊
@webinewcom
❤3
من امروز هاست سایت رو بعد از ۲۰ روز از هاست ایران بردم آلمان ،بعد از ۲ ساعت ایندکس شد و رتبه هم برگشت( قبلا ۵ بودم الان اومد ۴)،پس زیاد نگران نباشید اگر اصولی سئو شده باشه رتبه ها معمولا برمیگرده.
روی ۶ تا از مانی پیج هام این اتفاق افتاده.
( صفحات سایت اکثرا نوایندکس شده بودند)
روی ۶ تا از مانی پیج هام این اتفاق افتاده.
( صفحات سایت اکثرا نوایندکس شده بودند)
👍2❤1
🚨 زنگ خطر گوگل برای فروشگاههای اینترنتی: بودجه خزش شما در خطر است!
طبق گزارش جدید تیم فنی گوگل، بسیاری از سایتهای وردپرسی و ووکامرسی به دلیل یک اشتباه فنی، بودجه خزش (Crawl Budget) خود را هدر میدهند. اما داستان چیست؟
🔍 مشکل از کجاست؟
تیم خزش گوگل متوجه شده که پارامترهای اکشن (مثل ?add_to_cart=true) باعث ایجاد بینهایت URL تکراری میشوند. وقتی گوگلبات به جای خزیدن در صفحات محصولات اصلی، وقتش را تلفِ این لینکهای بیارزش میکند، صفحات جدید شما دیرتر ایندکس میشوند یا کلاً از نتایج جا میمانند!
✅ ووکامرس دست به کار شد
گوگل مستقیماً با تیم WooCommerce وارد مذاکره شد و خوشبختانه ووکامرس در آپدیتهای اخیر این باگ را برطرف کرده است. اما طبق گزارش گوگل، هنوز بسیاری از افزونههای جانبی (مثل افزونههای تقویم یا لیست علاقهمندیها) این مشکل را دارند و به درخواستهای گوگل پاسخ ندادهاند.
🛠 چه باید کرد؟
اگر صاحب سایت فروشگاهی هستید یا مدیریت سئو سایتهای وردپرسی را بر عهده دارید، این ۲ اقدام ضروری است:
1️⃣ آپدیت ووکامرس: حتماً هسته ووکامرس را به آخرین نسخه بروزرسانی کنید تا اصلاحات مربوط به پارامترهای سبد خرید اعمال شود.
2️⃣ بهینهسازی Robots.txt: منتظر افزونهها نمانید! با اضافه کردن دستورات زیر در فایل robots.txt، دسترسی رباتها به پارامترهای اضافه را ببندید: Disallow: /*add-to-cart=*
پینوشت: گوگل اعلام کرده که حدود ۲۵٪ از مشکلات خزش سایتها فقط مربوط به همین پارامترهای ساده است. با یک حرکت کوچک، سرعت ایندکس سایتتان را چند برابر کنید.
@webinewcom
webinew.com
طبق گزارش جدید تیم فنی گوگل، بسیاری از سایتهای وردپرسی و ووکامرسی به دلیل یک اشتباه فنی، بودجه خزش (Crawl Budget) خود را هدر میدهند. اما داستان چیست؟
🔍 مشکل از کجاست؟
تیم خزش گوگل متوجه شده که پارامترهای اکشن (مثل ?add_to_cart=true) باعث ایجاد بینهایت URL تکراری میشوند. وقتی گوگلبات به جای خزیدن در صفحات محصولات اصلی، وقتش را تلفِ این لینکهای بیارزش میکند، صفحات جدید شما دیرتر ایندکس میشوند یا کلاً از نتایج جا میمانند!
✅ ووکامرس دست به کار شد
گوگل مستقیماً با تیم WooCommerce وارد مذاکره شد و خوشبختانه ووکامرس در آپدیتهای اخیر این باگ را برطرف کرده است. اما طبق گزارش گوگل، هنوز بسیاری از افزونههای جانبی (مثل افزونههای تقویم یا لیست علاقهمندیها) این مشکل را دارند و به درخواستهای گوگل پاسخ ندادهاند.
🛠 چه باید کرد؟
اگر صاحب سایت فروشگاهی هستید یا مدیریت سئو سایتهای وردپرسی را بر عهده دارید، این ۲ اقدام ضروری است:
1️⃣ آپدیت ووکامرس: حتماً هسته ووکامرس را به آخرین نسخه بروزرسانی کنید تا اصلاحات مربوط به پارامترهای سبد خرید اعمال شود.
2️⃣ بهینهسازی Robots.txt: منتظر افزونهها نمانید! با اضافه کردن دستورات زیر در فایل robots.txt، دسترسی رباتها به پارامترهای اضافه را ببندید: Disallow: /*add-to-cart=*
پینوشت: گوگل اعلام کرده که حدود ۲۵٪ از مشکلات خزش سایتها فقط مربوط به همین پارامترهای ساده است. با یک حرکت کوچک، سرعت ایندکس سایتتان را چند برابر کنید.
@webinewcom
webinew.com
❤3