دوستانی که اکانت gemini pro رو تو طرح دانشجویی گرفتند میتونن با این ترفند تمدید ش کنن و تا یکسال از این اشتراک استفاده کنند.
https://youtu.be/Awsk-1qfXz4?si=tEWWrX5cq-lFdF1v
https://youtu.be/Awsk-1qfXz4?si=tEWWrX5cq-lFdF1v
یک مطالب مفید از شهرام رهبری عزیز :
کرال باجت؛ جایی که خیلیها اشتباه میکنن
▫️بارها توی مشاورههام به پروژههایی برخوردم که کارفرما یا حتی متخصص سئو به بُنبست میرسن.
چرا؟ چون میبینن کلمات اصلی سایت افت کرده ولی در آمار کلی، تغییر محسوسی وجود نداره.
▫️اینجا گوگل میاد یهسری از کلمات اصلی رو میندازه پایین و در عوض یهسری کلمات جدید (که ورودی کمتری دارن) رو بالا میاره.
چرا؟ چون صفحههای اصلی معمولاً ورودی یکتای بالایی دارن و وقتی کرال باجت به حد نصاب میرسه، گوگل اونها رو پایین میاره و جاش رو به صفحههایی میده که ورودی کمتری دارن.
▫️این نشونه میتونه بگه: حد نصاب کرال باجت سایت پر شده و گوگل نمیتونه بیشتر از اون براتون ورودی ایجاد کنه.
▫️ اینجاست که خیلیها اشتباه میکنن:
سایت رو میدن دست یکی برای مشاوره، هزار تا ایراد میگیره، بعد شروع میکنن به تغییر تایتل، کموزیاد کردن محتوا، یا دستکاری صفحههای اصلی.
🚫 نتیجه؟ هیچ رتبهای برنمیگرده!
▫️حتی اگر در مسیر درست باشید و مشکل رو کرال باجت تشخیص بدید، باز هم چندین ماه طول میکشه تا دوباره کلمات اصلی به جایگاه قبلی برسن.
▫️ وقتی بحث کرال باجت و بهینهسازی نرخ کرال باشه، سه نکتهی حیاتی وجود داره:
1. بهینهسازی درخواستها به سرور
2. جلوگیری از کرالهای پرتکرار بیفایده، مثلاً صفحاتی که اهمیت ندارن یا عکسهایی که گوگل چندبار در روز بیدلیل میخزه
3. کمپینهای اصولی در شبکههای اجتماعی؛ مقالات رو یکدفعه منفجر نکنید، بلکه حداقل یک ماه بهصورت پیوسته منتشر و بازنشر کنید
🛠 راهحلها
▫️رپورتاژ: امنترین و اصولیترین روش هست. دیرتر جواب میده، اما میدونید که در نهایت مؤثر خواهد بود.
▫️لینک سایدبار: خیلی زودبازدهه، ولی ریسک بالای جریمه داره و من توصیه نمیکنم مگر دقیقاً بدونید دارید چیکار میکنید.
⚠️ توصیه مهم
▫️اگر متخصص با تجربه نیستید، تنها چیزی که واقعاً میتونم توصیه کنم رپورتاژ هست.
چون بقیه راهها اگر درست اجرا نشن میتونن ضربه سنگینی به سایت بزنن و حتی کل دامنه رو در خطر بندازن.
▫️و در نهایت اگر تصمیم گرفتید مشاوره بگیرید، سراغ کسی برید که سایتهای پربازدید واقعی توی رزومهش داشته باشه، نه صرفاً تئوری.
▫️ تجربهی من میگه: خیلی وقتها مشکل از محتوای شما یا تایتل و دیسکریپشن نیست، بلکه از Crawl Budget هست که مثل نفس کشیدن گوگل برای سایت شماست
Channel: @ShahramRahbari
حالا چجوری این دو مورد رو چک کنید در ادامه کامل میکنم در تکمیل فرمایشات ایشون :
کرال باجت؛ جایی که خیلیها اشتباه میکنن
▫️بارها توی مشاورههام به پروژههایی برخوردم که کارفرما یا حتی متخصص سئو به بُنبست میرسن.
چرا؟ چون میبینن کلمات اصلی سایت افت کرده ولی در آمار کلی، تغییر محسوسی وجود نداره.
▫️اینجا گوگل میاد یهسری از کلمات اصلی رو میندازه پایین و در عوض یهسری کلمات جدید (که ورودی کمتری دارن) رو بالا میاره.
چرا؟ چون صفحههای اصلی معمولاً ورودی یکتای بالایی دارن و وقتی کرال باجت به حد نصاب میرسه، گوگل اونها رو پایین میاره و جاش رو به صفحههایی میده که ورودی کمتری دارن.
▫️این نشونه میتونه بگه: حد نصاب کرال باجت سایت پر شده و گوگل نمیتونه بیشتر از اون براتون ورودی ایجاد کنه.
▫️ اینجاست که خیلیها اشتباه میکنن:
سایت رو میدن دست یکی برای مشاوره، هزار تا ایراد میگیره، بعد شروع میکنن به تغییر تایتل، کموزیاد کردن محتوا، یا دستکاری صفحههای اصلی.
🚫 نتیجه؟ هیچ رتبهای برنمیگرده!
▫️حتی اگر در مسیر درست باشید و مشکل رو کرال باجت تشخیص بدید، باز هم چندین ماه طول میکشه تا دوباره کلمات اصلی به جایگاه قبلی برسن.
▫️ وقتی بحث کرال باجت و بهینهسازی نرخ کرال باشه، سه نکتهی حیاتی وجود داره:
1. بهینهسازی درخواستها به سرور
2. جلوگیری از کرالهای پرتکرار بیفایده، مثلاً صفحاتی که اهمیت ندارن یا عکسهایی که گوگل چندبار در روز بیدلیل میخزه
3. کمپینهای اصولی در شبکههای اجتماعی؛ مقالات رو یکدفعه منفجر نکنید، بلکه حداقل یک ماه بهصورت پیوسته منتشر و بازنشر کنید
🛠 راهحلها
▫️رپورتاژ: امنترین و اصولیترین روش هست. دیرتر جواب میده، اما میدونید که در نهایت مؤثر خواهد بود.
▫️لینک سایدبار: خیلی زودبازدهه، ولی ریسک بالای جریمه داره و من توصیه نمیکنم مگر دقیقاً بدونید دارید چیکار میکنید.
⚠️ توصیه مهم
▫️اگر متخصص با تجربه نیستید، تنها چیزی که واقعاً میتونم توصیه کنم رپورتاژ هست.
چون بقیه راهها اگر درست اجرا نشن میتونن ضربه سنگینی به سایت بزنن و حتی کل دامنه رو در خطر بندازن.
▫️و در نهایت اگر تصمیم گرفتید مشاوره بگیرید، سراغ کسی برید که سایتهای پربازدید واقعی توی رزومهش داشته باشه، نه صرفاً تئوری.
▫️ تجربهی من میگه: خیلی وقتها مشکل از محتوای شما یا تایتل و دیسکریپشن نیست، بلکه از Crawl Budget هست که مثل نفس کشیدن گوگل برای سایت شماست
Channel: @ShahramRahbari
حالا چجوری این دو مورد رو چک کنید در ادامه کامل میکنم در تکمیل فرمایشات ایشون :
دو عامل اصلی که گوگل میگه روی کرال باجت تأثیر دارن:
Crawl Rate Limit → محدودیت ظرفیت سرور (گوگل نمیخواد سرور شما از کار بیفته).
Crawl Demand → میزان ارزش محتوای شما برای ایندکس شدن (میزان محبوبیت و تازگی محتوا).
حالا چجوری تست کنیم ؟
Crawl Rate Limit → محدودیت ظرفیت سرور (گوگل نمیخواد سرور شما از کار بیفته).
Crawl Demand → میزان ارزش محتوای شما برای ایندکس شدن (میزان محبوبیت و تازگی محتوا).
حالا چجوری تست کنیم ؟
image_2025-09-20_17-01-40.png
94.1 KB
در تصویر میبینید که اون زمان که نمودار نارنجی بالا رفته هاست من نتونسته جواب بده و روی کروال بادجتم تاثیر منفی میذاره
روش بررسی:
Google Search Console → Crawl Stats
مسیر: GSC > Settings > Crawl Stats Report
اونجا میتونی ببینی گوگل چه تعداد درخواست در روز/هفته میزنه.
سه تا نمودار مهم داره:
Total Crawl Requests (تعداد درخواستها)
Average Response Time (زمان پاسخ سرور)
Host Status (مشکلات سرور)
اگر نمودار Response Time بالا باشه یا Spike (اوج) بزنه → یعنی سرور داره کند جواب میده و کرال باجت محدود میشه.
لاگ سرور (Access Log)
با دسترسی هاست یا cPanel میتونی فایل لاگ رو دانلود کنی.
درخواستهای Googlebot رو فیلتر کن (User-Agent: Googlebot).
اگر میبینی توی ساعتهای خاص حجم زیادی درخواست میاد و Response Code ها 5xx یا 429 هستن → نشونه محدودیت ظرفیت سروره.
روش بررسی:
Google Search Console → Crawl Stats
مسیر: GSC > Settings > Crawl Stats Report
اونجا میتونی ببینی گوگل چه تعداد درخواست در روز/هفته میزنه.
سه تا نمودار مهم داره:
Total Crawl Requests (تعداد درخواستها)
Average Response Time (زمان پاسخ سرور)
Host Status (مشکلات سرور)
اگر نمودار Response Time بالا باشه یا Spike (اوج) بزنه → یعنی سرور داره کند جواب میده و کرال باجت محدود میشه.
لاگ سرور (Access Log)
با دسترسی هاست یا cPanel میتونی فایل لاگ رو دانلود کنی.
درخواستهای Googlebot رو فیلتر کن (User-Agent: Googlebot).
اگر میبینی توی ساعتهای خاص حجم زیادی درخواست میاد و Response Code ها 5xx یا 429 هستن → نشونه محدودیت ظرفیت سروره.
copy_zip.php
641 B
برای انتقال یک فایل زیپ از یک سرور به سرور دیگه کافیه کد زیر رو داخل سرور مقصد بذارید و در مرورگر اجراش کنید.
@webinewcom
ادرس مبدا و ادرس مقصد رو در کد قرار بدید.
اگر ادرس ها رو نمیدونید فایل test_path رو در محل مورد نظر اجرا کنید.
#انتقال #فایل #زیپ #ZIP #بکاپ #هاست
@webinewcom
ادرس مبدا و ادرس مقصد رو در کد قرار بدید.
اگر ادرس ها رو نمیدونید فایل test_path رو در محل مورد نظر اجرا کنید.
#انتقال #فایل #زیپ #ZIP #بکاپ #هاست
❤1
ما در یک پروژه نیاز داشتیم برای کاربران ای دی کارت صادر کنیم.
با 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');