Bazı 404'lerde döngü neden boş değil?


10

Garip bir sorunla karşılaştım.

Üç veya daha fazla düzeyden oluşan rastgele bir URL'ye eriştiğinizi varsayalım:

http://example.com/a/b/c
http://example.com/a/b/c/d
...

Sonra is_404()ise true. Çok uzak çok iyi. Ancak bazı nedenlerden dolayı son gönderiler sorgulanır.

$wp_query->request

dır-dir

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
    FROM wp_posts 
    WHERE 1=1 
        AND wp_posts.post_type = 'post' 
        AND (
            wp_posts.post_status    = 'publish' 
            OR wp_posts.post_status = 'private'
            ) 
    ORDER BY wp_posts.post_date DESC 
    LIMIT 0, 5

Hangi tabii ki have_posts()dönüş yapar truevb. Birisi bunu açıklayabilir mi?

Şimdiye kadar ne buldum:

Sadece üç veya daha fazla seviyede derinlemesine çalışmasının nedeni, WP'nin bir şekilde başka bir davranışla sonuçlanan gönderileri ve ekleri aramasıdır.

WP, talebi bir noktada 404 olarak kabul etmesine rağmen, en son yayınları getiriyor. Yardımıyla @kaiser ve @GM I'den bir yere bu aşağı izledik /wp-includes/class-wp.php:608


Sayfanın kodunu eklemezseniz size yardımcı olmak zor olacaktır
Tomás Cot

3
Bu benim koduma özgü değil. Tüm varsayılan temalarla da yepyeni bir kurulumda böyle davranır.
kraftner

En az bir temayı adlandırabilir misiniz, özel temam çalışmıyor? belirli parametreler mi kullanıyorsunuz? sümüklü böcek değiştirdin mi hangi WP sürümünü kullanıyorsunuz?
Tomás Cot

Gerçekten. Ama isterseniz Twenty Eleven'ı deneyin.
kraftner

Tüm soru için özür dilerim, gönderilerin gösterildiğini düşündüm.
Tomás Cot

Yanıtlar:


9

Şaşırmış olabilirsiniz, ama orada garip bir şey yok.

Her şeyden önce, bir ön uç URL'sini ziyaret ettiğinizde WordPress'te bir sorguyu tetiklediğinizi açıklığa kavuşturalım. Her zaman.

Bu sorgu sadece bir standarttır WP_Query, tıpkı üzerinden geçenler gibi:

$query = new WP_Query( $args );

Tek bir fark vardır: $argsdeğişkenler WP::parse_request()yöntem kullanılarak WordPress tarafından oluşturulur . Bu yöntemin yaptığı, URL'ye ve yeniden yazma kurallarına bakmak ve URL'yi bir dizi bağımsız değişkene dönüştürmektir.

Ancak, URL geçersiz olduğu için bu yöntem bunu yapamazsa ne olur? Sorgu argümanları sadece şöyle bir dizidir:

array( 'error' => '404' );

( Burada ve burada kaynak ).

Böylece bu diziye geçilir WP_Query.

Şimdi yapmaya çalışın:

$query = new WP_Query( array( 'error' => '404' ) );
var_dump( $query->request );

Sorgunun OP'de tam olarak sorulduğuna şaşırdınız mı? Değilim.

Yani,

  1. parse_request() hata anahtarlı bir dizi oluşturur
  2. Bu dizi geçirilir WP_Querysadece çalışır,
  3. handle_404()sorgudan sonra çalışan , 'error'parametreye bakar ve is_404()true olarak ayarlanır

Yani, have_post()ve is_404()ilişkili değil. Sorun, WP_Querybir şey yanlış gittiğinde sorguyu kısa devre yapmak için hiçbir sisteme sahip olmadığı için, nesne oluşturulduktan sonra, ona bazı argümanlar iletin ve sorgu çalışacak ...

Düzenle:

Bu sorunun üstesinden gelmenin 2 yolu vardır:

  • 404.phpŞablon oluşturma ; WordPress bunu 404 URL'ye yükleyecek ve orada kontrol etmeniz gerekmeyecekhave_posts()
  • $wp_query404'te boş kalmaya zorlayın , şuna benzer:

    add_action( 'wp', function() {
        global $wp_query;
        if ( $wp_query->is_404() ) {
            $wp_query->init();
            $wp_query->is_404 = true; // init() reset 404 too
        }
    } );

4
Bu tipik olmamasının nedeni 404 genellikle sorgu sonucu olmasıdır . Ancak bu durumda benzersiz yeniden yazma kuralının ( $wp->matched_rule) sonucudur , ancak sorgu yine de hareketlerden geçmektedir, çünkü buna dikkat etmemektedir.
Rarst

+1. Evet, sorgu buna dikkat etmez ve geçerli kodla dikkat edemez , çünkü onu durdurmanın bir yolu yoktur. Örneğin, geçerli olmayan bir sınıflandırma sorgulandığında WHERE 1=0durdurulamadığı için WordPress'i sorguladığı zaman hiçbir şey döndürmeyen bir sorguyu zorlayın ... @Rarst
gmazzap

Tamam şimdi anladım. Geriye kalan asıl soru, neden WP_Query'nin sadece hiçbir şey döndürmediği zaman makul bir argüman iletilmediğinde mesaj almanın varsayılan bir sorgusu olduğunu varsayması daha mantıklı mı?
kraftner

2
@kraftner, WordPress'in sorgu çalışmalarından kaçınamaması ve resonable bağımsız değişken olmadığında 2 seçenek vardır: hiçbir şey döndürmeyen bir sorgu çalıştırın (geçerli olmayan bir sınıflandırma sorgulandığında, yukarıdaki yoruma bakın) veya varsayılan sorguyu çalıştırın . Neden bu durumda WP ikincisi çekirdek devs sorulması gereken bir Q seçin :)
gmazzap

@ TomásCot Tabii ama başarısız olursa, gerçekten başarısız olmasını ve tamamen ilgisiz bir şey döndürmemesini isterdim. Her neyse, işler şimdi temizlendi ve ek bir is_404()kontrol yapmam gerekiyor .
kraftner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.