Məzmun MarketinqÖdənişli və Üzvi Axtarış Marketinqi

WordPress: SAVEQUERIES ilə Şablon SQL Sorğunuzun Problemlərinin aradan qaldırılması və optimallaşdırılması

Bir ləngin arxasında ümumi bir günahkar WordPress sayt mütləq sizin ev sahibiniz deyil, sizin CDN, hətta şəkil ölçüləriniz—bu sizin verilənlər bazanızdır. Konkret olaraq, həcmi və səmərəsizliyi SQL mövzu və plaginlər tərəfindən yaradılan sorğular. Hər səhifənin yüklənməsi onlarla və ya zəif optimallaşdırılmış hallarda yüzlərlə verilənlər bazası sorğusunu işə sala bilər. Vidjetlər, qısa kodlar, yan panellər və blok redaktoru elementləri arasında çoxaldıqda, bu sorğular nəzərə alınmayan, lakin yenə də Əsas Veb Vitallarınıza mənfi təsir göstərən ciddi performans darboğazları yarada bilər (CWV) və ümumi istifadəçi təcrübəsi.

Bir çox tərtibatçı performans problemlərini maskalamaq üçün önbelleğe və CDN çatdırılmasına diqqət yetirir, lakin bunlar problemin yalnız bir hissəsini həll edir. Əgər əsas sorğu yükü səmərəsizdirsə, siz əslində pas üzərində rəngləyirsiniz. Həqiqi sürətin optimallaşdırılmasına doğru ilk addım başlıq altında nə baş verdiyini anlamaqdır.

SAHƏLƏR

WordPress daxili sabit təklif edir, SAVEQUERIES, sorğu zamanı yerinə yetirilən hər bir verilənlər bazası sorğusunu, o cümlədən hər sorğunun nə qədər çəkdiyini qeyd edir. Diqqətlə istifadə edildikdə, tema şablonlarınızda, səhifə qurucularınızda və plagin inteqrasiyalarınızda səmərəsizliyi müəyyən etmək üçün əvəzolunmaz diaqnostika vasitəsidir.

Yaxşı optimallaşdırılmış WordPress saytında tipik bir səhifə şablonu 20 ilə 50 arasında sorğu yaratmalıdır. Minimum əsas səhifə və ya yüngül tək yazı düzümü 20-yə yaxın düşə bilər, daha mürəkkəb arxiv və ya WooCommerce məhsul səhifəsi isə taksonomiya axtarışları və metadata səbəbindən təbii olaraq 50-yə qalxa bilər.

Bundan başqa hər şey - xüsusən yüzlərlə sayılır - səmərəsizliyə işarə edir. Hər bir sorğu əlavə yükü təqdim edir və hətta mikrosaniyə yük altında birləşməni tez gecikdirir. Yüksək sorğuların sayı adətən WordPress-in əsas sorğusundan asılı olmayaraq öz verilənlər bazası zənglərini yerinə yetirən lazımsız döngələrə, keşlənməmiş seçimlərə və ya plaginlərə işarə edir. Sayların aşağı səviyyədə saxlanması ixtiyari məhdudiyyətlərlə bağlı deyil - bu, hər sorğunun mövcud olması üçün səbəbin olmasını və şablonlarınızın bütün səhifələrdə proqnozlaşdırıla bilən şəkildə işləməsini təmin etməkdir.

İmkan verir SAVEQUERIES hər hansı bir formada çıxış nəzarəti olmayan bir istehsal yerində böyük ola bilər. HTML-nin aşağı hissəsində minlərlə sorğunun atıldığını görə bilərsiniz ki, bu da yavaşlamalara hansı şablonların və ya komponentlərin cavabdeh olduğunu müəyyən etməyi çətinləşdirir. Həlli girişi avtomatlaşdırmaqdır ki, hər bir şablon növü – ön səhifə, səhifə, tək yazı, arxiv – öz jurnal faylını yaradır. Bu, ən bahalı sorğularınızın harada baş verdiyinin aydın, seqmentləşdirilmiş görünüşünü təmin edir.

WordPress Şablon Sorğularınızı Necə Daxil Etmək olar

Budur WordPress sorğularını səmərəli şəkildə qeyd etmək üçün sadə, lakin güclü bir yanaşma. Aşağıdakı kodu mövzunuzun functions.php və ya fərdi plaqinə yerləşdirməklə siz idarəçi kimi daxil olduğunuz zaman sorğu qeydlərini avtomatik əldə edə və saxlaya bilərsiniz. SAVEQUERIES effektivdir.

// If SAVEQUERIES is enabled, print the queries in the footer in an HTML tag
function log_queries_to_file() {
    global $wpdb;

    // Check conditions: SAVEQUERIES enabled and logged-in admin
    if (defined('SAVEQUERIES') && SAVEQUERIES && is_user_logged_in() && current_user_can('manage_options')) {
        // Define the log directory (site root/queries/)
        $log_dir = ABSPATH . 'queries/';
        
        // Create the directory if it doesn't exist (with recursive creation and proper permissions)
        if (!file_exists($log_dir)) {
            mkdir($log_dir, 0755, true);
        }
        
        // Skip if directory isn't writable
        if (!is_writable($log_dir)) {
            return; // Or add error logging if desired
        }
        
        // Determine the filename based on page type
        $filename = '';
        
        if (is_front_page()) {
            $filename = 'queries-frontpage.log';
        } elseif (is_page()) {
            $template_slug = get_page_template_slug(get_the_ID());
            if (empty($template_slug)) {
                $template_slug = 'default';
            } else {
                // Sanitize template slug: basename without .php
                $template_slug = basename($template_slug, '.php');
            }
            $filename = 'queries-page-' . sanitize_title($template_slug) . '.log';
        } elseif (is_archive()) {
            $post_type = 'post'; // Default for standard archives
            if (is_post_type_archive()) {
                $post_type = get_query_var('post_type');
                if (is_array($post_type)) {
                    $post_type = reset($post_type); // Handle multi-type, take first
                }
            } elseif (is_category() || is_tag() || is_tax()) {
                // For taxonomies, get the post type from queried object if custom
                $queried = get_queried_object();
                if ($queried && isset($queried->taxonomy)) {
                    $tax = get_taxonomy($queried->taxonomy);
                    $post_type = is_array($tax->object_type) ? reset($tax->object_type) : $tax->object_type;
                }
            } elseif (is_author() || is_date()) {
                $post_type = 'post';
            }
            $filename = 'queries-archive-' . sanitize_title($post_type) . '.log';
        } elseif (is_singular()) { // Covers single posts, pages, CPTs
            $post_type = get_post_type(get_the_ID());
            $filename = 'queries-single-' . sanitize_title($post_type) . '.log';
        }
        
        // If no matching type, skip or use a fallback like 'queries-other.log'
        if (empty($filename)) {
            return;
        }
        
        // Full file path
        $file_path = $log_dir . $filename;
        
        // Prepare log content (queries list with optional header)
        $log_content = "\n\n=== Queries for " . esc_url_raw(home_url(add_query_arg(array(), $GLOBALS['wp']->request))) . " on " . current_time('mysql') . " ===\n";
        $log_content .= print_r($wpdb->queries, true);
        
        // Append to file (creates if not exists)
        file_put_contents($file_path, $log_content, FILE_APPEND | LOCK_EX);
    }
}
add_action('shutdown', 'log_queries_to_file');

Aktivləşdirildikdən sonra bir tapacaqsınız /queries/ queries-frontpage.log və ya queries-single-post.log kimi log fayllarını ehtiva edən WordPress kökünüzdəki kataloq. İdarəçi kimi daxil oldum, sorğuları və onların performansını qeyd etmək üçün şablonlarımdan birini özündə birləşdirən hər bir URL-i ziyarət etdim.

SAVEQUERIES məlumatlarınızı necə oxumaq olar

Hər bir giriş sorğu mətnini, icra müddətini və onu işə salan funksiya çağırış yığınını göstərəcək. Vaxt keçdikcə bu, sizə hansı şablonların və funksiyaların ən çox yük yaradacağına dair profil verir.

[20] => Array
        (
            [0] => SELECT wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1  AND ( wp_term_relationships.term_taxonomy_id IN (32489)
) AND wp_posts.post_type = 'nav_menu_item' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order ASC		 
            [1] => 0.00042486190795898
            [2] => require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/jannah/page.php'), get_header, locate_template, load_template, require_once('/themes/mtz-23/header.php'), TIELABS_HELPER::get_template_part, include('/themes/jannah/templates/header/load.php'), TIELABS_HELPER::get_template_part, include('/themes/jannah/templates/header/nav-top.php'), wp_nav_menu, wp_get_nav_menu_items, get_posts, WP_Query->query, WP_Query->get_posts
            [3] => 1762916659.7638
            [4] => Array
                (
           )
)

SAVEQUERIES çıxışından olan bu giriş WordPress tərəfindən icra edilən tək SQL sorğusunu, onun harada və niyə işlədiyini izləməyə imkan verən vaxt və kontekst təfərrüatlarını təmsil edir. Hər nömrələnmiş massiv elementi sorğuya uyğundur və struktur beş əsas məlumatı təmin edir:

  1. Sorğunun özü — [0] indeksindəki dəyər WordPress-in verilənlər bazasına göndərdiyi xam SQL ifadəsidir. Bu halda:
SELECT wp_posts.ID 
FROM wp_posts  
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1  
  AND (wp_term_relationships.term_taxonomy_id IN (32489))
  AND wp_posts.post_type = 'nav_menu_item' 
  AND ((wp_posts.post_status = 'publish')) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.menu_order ASC
  1. Bu sorğu xüsusi menyu termininə (term_taxonomy_id = 32489) aid olan bütün dərc edilmiş naviqasiya menyu elementlərini (post_type = 'nav_menu_item') əldə edir. LEFT JOIN hər bir menyu elementini onun taksonomiya əlaqələri ilə əlaqələndirir və GROUP BY və ORDER BY bəndləri menyu elementlərinin müəyyən edilmiş qaydada qaytarılmasını təmin edir. Bu, WordPress mövzusu wp_nav_menu() vasitəsilə naviqasiya menyusunu təqdim edərkən yaranan tipik sorğudur.
  2. Sorğunun icra müddəti — [1] indeksindəki dəyər (0.00042486190795898) sorğunun yerinə yetirilməsinə sərf etdiyi vaxtı saniyələrlə ifadə edir. Bu halda, o, yarım millisaniyədən az müddətdə tamamlandı, bu əladır. Qeydləri nəzərdən keçirərkən, ardıcıl olaraq 0.02-0.05 saniyədən çox olan sorğular potensial optimallaşdırma namizədləridir.
  3. Zəng yığını — [2] indeksindəki dəyər bu sorğuya səbəb olan tam PHP zəng zəncirinin siyahısını verir. Onu soldan sağa oxumaq, naviqasiya menyusunu göstərərkən sorğunun mövzunun başlıq şablonundan yarandığını göstərir. Xüsusilə, get_posts çağırışına səbəb olan wp_get_nav_menu_items adlanan wp_nav_menu funksiyası sonda WP_Query->get_posts metodu ilə yerinə yetirilir. Bu zəng izi sorğunun hansı şablon və ya funksiyanın başladığını dəqiq müəyyən etmək üçün vacibdir.
  4. Damgası — [3] indeksindəki dəyər (1762916659.7638) sorğu zamanı sorğunun yerinə yetirildiyi zaman Unix vaxt damğasıdır. Bu, sorğuları xronoloji qaydada sifariş etməyə və ya onları xüsusi yükləmə ardıcıllığı ilə əlaqələndirməyə kömək edir.
  5. Arqumentlər — [4]-dəki son massiv bu nümunədə boşdur, lakin sorğuda yertutanlardan istifadə edilərsə, o, hər hansı bağlı parametrləri ehtiva edər.

Xülasə, bu jurnal qeydi mövzunun saytın başlığında nümayiş etdirmək üçün naviqasiya menyusu elementlərini əldə etmək üçün standart sorğu yaratdığını göstərir. Sorğunun özü səmərəli olsa da, bu, hər bir menyu yerinin və ya dinamik bölmənin əlavə sorğulara səbəb ola biləcəyini xatırladır. Çox menyu və ya vidcetləşdirilmiş başlıqları olan mürəkkəb səhifələrdə bu kiçik, təkrar axtarışlar əlavə edə bilər - güclü optimallaşdırma strategiyası kimi menyuların və digər statik sayt elementlərinin keşləşdirilməsinin əhəmiyyətini gücləndirir.

Şablonlarınızı və Sorğularınızı necə optimallaşdırmaq olar

Hansı şablonların və komponentlərin ən çox sorğu yaratdığını müəyyən etdikdən sonra növbəti addım onları təkmilləşdirməkdir. WordPress-də sorğuların optimallaşdırılması təkcə sürətlə bağlı deyil, sabitlik və genişlənmə qabiliyyəti ilə bağlıdır. Bir neçə məqsədyönlü düzəliş sorğu yükünüzü kəskin şəkildə azalda bilər, hətta trafik dalğaları zamanı səhifələrinizi cavabdeh saxlaya bilər.

  1. Lazımsız sorğuları aradan qaldırın. Bir çox WordPress mövzuları və plaginləri əslində istifadə etmədikləri məlumatları sorğulayır. Məsələn, bəziləri yalnız bir sahəyə ehtiyac duyduqda bütün post metadatasını əldə edəcək və ya əsas sorğuya etibar etmək əvəzinə get_posts() funksiyasını döngələr daxilində çağıracaqlar. Şablon fayllarınızı nəzərdən keçirin və lazımsız verilənlər bazası zənglərini, xüsusən də döngələr daxilində və ya başlıqlar və altbilgilər kimi təkrarlanan komponentlərdə silin. Mümkün olduqda verilənlər bazası ilə idarə olunan dinamik məzmunu statik şablon teqləri və ya əvvəlcədən hesablanmış dəyərlərlə əvəz edin.
  2. Keşləmə ilə sorğu həcmini azaldın. Səmərəliliyi artırmağın ən təsirli yollarından biri tez-tez əldə edilən və nadir hallarda dəyişən məlumatları keş etməkdir. Məsələn, menyular, vidcet sahələri və ya sayt seçimləri hər səhifə yüklənməsində təkrar axtarışların qarşısını almaq üçün keçidlərdə və ya obyekt keşində yaddaşda saxlanıla bilər. Məsələn, sayt menyusu yalnız menyunun özü dəyişdikdə yenilənən keçiddə götürülə və saxlanıla bilər. Bu yanaşma təkrarlanan sorğuları yükləyir və təravətdən ödün vermədən verilənlər bazası yükünü kəskin şəkildə azaldır.
  3. Verilənlər bazasını düzgün indeksləşdirmə ilə optimallaşdırın. Zaman keçdikcə WordPress verilənlər bazaları, xüsusən də geniş postmeta və ya şərh meta cədvəlləri olan saytlarda böyük və parçalanır. Meta_key və meta_value kimi tez-tez sorğulanan sütunlara müvafiq indekslərin əlavə edilməsi böyük fərq yarada bilər. Query Monitor və WP-Optimize daxil olmaqla bir çox plaginlər yavaş sorğuları vurğulaya və indeksləşdirmə təkmilləşdirmələrini təklif edə bilər. Cədvəllərinizi vaxtaşırı optimallaşdırmaq və artıq məlumatların təmizlənməsi də MySQL sorğularını daha səmərəli şəkildə emal etməyə kömək edir.
  4. Verilənlər bazası keşləmə alətlərindən istifadə edin. Sorğularınız mümkün qədər səmərəli olduqda, onların nəticələrinin keşləşdirilməsi böyük performans artımı təmin edə bilər. Redis və ya Memcached kimi obyekt keşləmə sistemləri sorğu nəticələrini və PHP obyektlərini yaddaşda saxlayır, beləliklə WordPress onları verilənlər bazasına dəfələrlə vurmadan əldə edə bilər. Bu, yüksək trafikli saytlar və ya eyni postmeta və ya taksonomiya axtarışlarının çoxsaylı sorğularda baş verdiyi mürəkkəb sorğu nümunələri olan saytlar üçün xüsusilə təsirlidir. Davamlı obyektin keşləşdirilməsi məlumatların götürüldükdən sonra açıq şəkildə etibarsız sayılana qədər tez əlçatan qalmasını təmin edir - MySQL yükünü əhəmiyyətli dərəcədə azaldır və cavab müddətini yaxşılaşdırır. Bir çox müasir hostlar Redis və ya Memcached inteqrasiyasını təklif edir və WordPress onları obyekt-cache.php kimi açılan keşləmə plaginləri vasitəsilə yerli olaraq dəstəkləyir.
  5. Səhifə keşləmə və CDN alətlərindən istifadə edin. Verilənlər bazası səviyyəsində təkmilləşdirmələrdən başqa, tam səhifəli keşləmə həlləri bir çox səhifələrin heç vaxt WordPress və ya MySQL-i işə salmasının qarşısını alır. WP Rocket, W3 Total Cache və LiteSpeed ​​Cache kimi plaginlər səhifələrinizin statik versiyalarını yarada və saxlaya, onları dərhal ziyarətçilərə təqdim edə bilər. Server qatında Nginx FastCGI cache və ya Varnish eyni effekti daha da aşağı yüklə həyata keçirir. Cloudflare və ya BunnyCDN kimi Məzmun Çatdırılma Şəbəkəsinin (CDN) əlavə edilməsi həmin statik aktivləri qlobal miqyasda keşləmə və paylamaqla, yerlərindən asılı olmayaraq istifadəçilər üçün gecikməni minimuma endirməklə bunu daha da genişləndirir. CDN-lər həmçinin anonim ziyarətçilər üçün tam HTML snapshotlarını keşləyə bilər, yəni mənşə serveriniz dinamik sorğuları nadir hallarda emal edir. Bu keşləmə təbəqələri birlikdə kaskad iyerarxiyasını - verilənlər bazası önbelleği, obyekt keşi, səhifə keşi və CDN keşi təşkil edir ki, bu da WordPress-in sorğuları və server işini kəskin şəkildə azaldarkən səhifələri mümkün qədər tez çatdırmasını təmin edir.

Nəticə

Verilənlər bazası performansı WordPress optimallaşdırmasının ən diqqətdən kənarda qalan aspektlərindən biridir. Pluginlər, skriptlər və şəkillər tez-tez yavaş yükləmə müddətində günahkar olsa da, həddindən artıq və səmərəsiz sorğular çox vaxt əsl günahkardır. SAVEQUERIES-i işə salmaqla, sorğu məlumatlarını şablon üzrə daxil etməklə və problemli sahələri sistematik şəkildə həll etməklə siz əksər tərtibatçıların heç vaxt görmədiyi səmərəsizliyi aşkar edə bilərsiniz.

Lazımsız sorğuları aradan qaldırmaq, ağıllı şəkildə keşləmə, cədvəllərinizi optimallaşdırmaq və çox qatlı keşləmə həllərini tətbiq etmək WordPress-i ağır sorğulardan çevirə bilər. CMS sürətli, genişlənən nəşriyyat platformasına. Əsl sürət səmərəsizliyi təkcə keşləmə vasitəsilə gizlətməklə əldə edilmir - bu, səmərəsizliyin əsas səbəbini anlamaq və aradan qaldırmaqla başlayır: saytınızın verilənlər bazası ilə necə danışması.

Başa dön düyməsini basın
yaxın

Adblock Aşkarlandı

Biz saxlamaq üçün reklamlara və sponsorluqlara etibar edirik Martech Zone pulsuz. Lütfən, reklam blokerinizi deaktiv edin və ya sərfəli, reklamsız illik üzvlüklə (10 ABŞ dolları) bizə dəstək olun:

İllik Üzvlük üçün Qeydiyyatdan Keçin