Umutsuz kategori php. dreamweaver8'de çevrimiçi mağaza oluşturma örneği. #3 Bir gönderinin geçerli veya iç içe kategoriye ait olup olmadığını kontrol etme

  • 20.06.2020

Geçerli (veya belirtilen) gönderinin belirtilen kategoriye ait olup olmadığını kontrol eder (birden çok kategori belirtilebilir). Koşullu etiket.

Gönderinin doğrudan kategoriye ait olup olmadığı kontrol edilir, yani. belirtilen kategorinin geçerli/belirtilen gönderiyi içerip içermediği. Örneğin, bir gönderi bir üst kategoriye veya belirtilen kategorinin alt kategorisine aitse, işlev false döndürür.

Bir gönderinin kategori ağacıyla ilişkisini kontrol etmek için post_is_in_descendant_category() kendi kendine yazılan işlevini kullanın (aşağıdaki örneğe bakın).

in_category(), WordPress Döngüsü içinde veya WordPress Döngüsü dışında, ancak ayrı bir gönderi sayfasında (single.php) kullanılabilir. Veya hangi gönderiyi kontrol etmek istediğinizi belirtirseniz herhangi bir yerde kullanabilirsiniz.

✈ 1 kez = 0.003672s = Çok yavaş| 50000 kez = 1.00s = çok hızlı| PHP 7.1.5, WP 4.8.1

Kanca yok.

İadeler

koşul karşılanıyorsa true , aksi takdirde false .

kullanım

if(in_category($kategori, $post))( // ... ) $kategori (dize/dizi/sayı) (gerekli)

Bir gönderiye ait olup olmadığını kontrol etmek için kategorinin kimliği, adı veya slug'u.

Bir dizide birkaç parametreyi karıştırarak belirtebilirsiniz.
Varsayılan: hayır

$yazı (sayı/nesne) Kimlik veya nesne gönderin. Varsayılan olarak, mevcut gönderi, WordPress Döngüsü içinde veya gönderi sayfasında otomatik olarak algılanır.
Varsayılan: hayır

Örnekler

#1 WordPress Döngüsü içindeki mevcut gönderiyi kontrol etme.

in_category, bir gönderinin belirtilen kategoriye ait olup olmadığını kontrol etmek için genellikle bir Döngü içinde kullanılır, evet ise, o zaman bir işlem yapın:

If (in_category("pachyderms")) ( // gönderi "pachyderms" kategorisine aitse eylemler ) elseif (in_category(array("Tropical Birds", "small-mammals"))) ( // gönderi ise eylemler "Tropik Kuşlar", "küçük-memeliler" kategorilerinden birine aittir) başka ( // önceki koşullardan hiçbiri karşılanmıyorsa.)

not Adları değil, çekler için kategorinin kimliğini belirtmek daha iyidir.

#2 Mevcut gönderiyi Döngünün dışında kontrol etme.

Bir gönderi sayfasında (genellikle bir single.php şablon dosyası), doğrulama Döngü dışında yapılabilir:

If (in_category("meyve")) ("single-fruit.php" içerir; ) elseif (in_category("sebzeler")) ("single-vegetables.php" içerir; ) else ( // WordPress Döngüsü burada başlar if ( have_posts()) : while (have_posts()) : the_post(); // ... )

#3 Bir gönderinin geçerli veya iç içe kategoriye ait olup olmadığını kontrol etme

Bir gönderinin bir kategori ağacına ait olup olmadığını kontrol etmeniz gereken zamanlar vardır. Örneğin, çekte kategori kimliği 60'ı belirtiriz ve gönderi, kategori 60'ın alt öğesi olan kategori 70'e aittir. Ancak in_category() bu durumda false döndürür ve bazen true döndürmesi gerekir.

Kategori ağacına ait olup olmadığını kontrol etmek için dizideki tüm kategori adlarını sırayla belirtebilirsiniz:

If(in_category(array("Ahududu", "Elma", "Muz", "Armut", "Erik"))) ( // Koşul karşılanırsa eylem )

Bu doğrulama yaklaşımı tamamen esnek değildir, çünkü "Meyveler" kategorisine yeni bir alt kategori eklersek, doğrulama için onu diziye de eklememiz gerekir.

Bu tür zorluklardan kaçınmak için aşağıdaki kontrolü kullanabilirsiniz:

// Gönderinin "Meyve" kategorisine veya bu kategoride yuvalanmış herhangi bir kategoriye ait olup olmadığını kontrol edin. if (in_category(11) || post_is_in_descendant_category(11)) ( // Tüm "meyveler" burada)

Ayrıca, daha az arzu edilir, ancak bir seçenek isimleri belirtmektir:

Post_is_in_descendant_category(get_term_by("ad", "meyve", "kategori"))

Ve işte post_is_in_descendant_category() işlevinin kendisi:

işlev post_is_in_descendant_category($cats, $_post = null)( foreach ((dizi) $cats as $cat) ( // get_term_children() yalnızca tamsayı kimliğini kabul eder $descendants = get_term_children((int) $cat, "category"); if ($descendants && in_category($descendants, $_post)) return true; ) false döndür; )

#4 Bir terime ait olmanın ağaç benzeri kontrolü

Gönderinin keyfi bir sınıflandırma terimine dahil olup olmadığını kontrol edelim (belirtilen terimin alt terimlerini de kontrol edeceğiz):

If(has_term(11, "taksonomi", $post->ID) || post_is_in_descendant_term(11, "taksonomi", $post->ID))( // 11. terimdeki mevcut giriş veya alt terimi )

post_is_in_descendant_term() işlevi:

function post_is_in_descendant_term($term_ids, $taksonomi = "category", $post = null)( foreach((dizi) $term_ids as $term_id)( $descendants = get_term_children((int) $term_id, $taxonomy); if ($descendants && has_term($descendants, $taxonomy , $post)) return true; ) false döndür; )

Makale, kod yorumlama hataları (E_ERROR, E_PARSE, E_WARNING, vb.) dahil olmak üzere her tür hatayı işlemek için PHP'de (5.3.x ile ilgili) bulunan işlevselliği açıklar. Bu işlem, bu tür sorunlar olması durumunda sayfanın görüntülenmesini yönetmenize yardımcı olacaktır. Makale, yazılım ürününüzde hemen kullanabilmeniz için birçok açıklama ve çalışma örneği (mimari) içermektedir. Sonuçta siteyi biraz bozmuşlar, peki, beyaz bir ekrana (veya daha kötüsü, kutsal bilgi içeren bir ekrana) dönmek yerine, arama motorunu bu konuda 4xx veya 5xx başlığıyla bilgilendirmek ve kullanıcıyı eğlendirmek gerekiyor , bilgisayar korsanları için) 200 Ok yanıtıyla.

Bu konuyu yazma fikri cesurca 2 soru sorduğumda ortaya çıktı:

  • Uyarıları yakalama ve hataları şablonda belirtilen yere gönderme hakkında soru
  • Komut dosyasının yürütülmesinin yalnızca durmasına neden olan kritik hataları yakalama hakkında soru
Karmama ve favorilere eklemeye göre PHP habra topluluğu için ilginç olduklarını fark ettim. Bu nedenle, insanların ve arama motorlarının ihtiyaç duydukları bilgileri bulmaları daha kolay ve kapsamlı olsun diye bu sorunlara bir makale şeklinde çözüm üretmeye karar verdim.

İlgileniyorsanız detaylar haberimizin altında...

Kullanım nedenleri

Kullanıcının/arama motorunun sunucuda sorunlar olduğunu net bir şekilde yanıtlaması gerekir. Belirli bir Feng Shui kullanmadan bunu başarmak oldukça zordur ve bazen imkansızdır. Burada tüm bunlara ışık tuttum, kendime bir not bırakıyorum, çünkü bir hafta önce ne yapacağımı bilmiyordum ve muhtemelen birçok yeni başlayanın cesareti kırılacak.

Özellik Açıklamaları

Bu işlevsellik, hataları işlemek ve çıktıyı kontrol etmek için PHP'de mevcuttur. İşte onların güzelliklerinin ve eksikliklerinin bir açıklaması. Belge vermeyeceğim, sadece sayfalarına atıfta bulunacağım ve fikrimi açıklayacağım. Verilecekler sadece küçük bir kısım, makalenin sonunda belgelerin ilgili bölümlerine bağlantılar vereceğim. O halde tanışalım:

- Kritik olmayan hataların kontrolü: açıklamalar, uyarılar, kullanıcı hataları. Genel olarak, yorumlamayı anormal şekilde bitirmeyen her şey.
set_error_handler - Kullanıcı tanımlı bir hata işleyici ayarlar.
Tüm bu tür hataları loga yazmak için gereklidir. Ayarlanmadıysa, o zaman günlüğe yazılmaz, ancak her zaman hangi savaş durumlarında yorum ve uyarıların çağrılabileceğini bilmek isterim. Yani kullanıcının ürünü otomatik olarak test etmesine olanak tanır ve bunu fark etmez bile.
Eğer fonksiyon ayarlanmazsa, PHP sadece ekranda veri göstermeye çalışır ve eğer bu verilmezse, bu tür hatalardan hiçbir yaşam belirtisi olmaz.

- Kontrol, istisnalar: E_ERROR türünde bir hatadır.
set_exception_handler - Özel bir istisna işleyicisi ayarlar
Pekala, aşağıda açıklananlar olduğunda ve sadece İstisna türünde bir hatayı ele alırken neden icat edildiğini bilmiyorum. Bu yüzden basitçe var olduğunu bildiriyorum. Kritik "istisna" hatasını yakalar ve bu konuda bir şeyler yapmanızı sağlar. Her iki durumda da, senaryo biter. Varsayılan olarak çalışması benim için kişisel olarak yeterlidir (günlüklere yazar, görüntülemeye çalışır). Bunu hiç yeniden tanımlamazdım, aksi takdirde meydana gelen istisna hakkında günlüklere yazmak zorunda kalırdım.

- Çıkış kontrol fonksiyonları: Burada farklı nedenlerle bilmeniz gereken 3 işlevi anlatacağım. Örneğin, performans sorunları veya başlık çıktı sorunları için. Bizim durumumuzda, hata başlıklarını görüntülememiz gerekiyor.

Şartlar
Hatanın oluşabileceği koddan önce veya önce çalışan kodlu bir dosya var ve bu dosya ve ondan önceki tüm dosyalar hata imkansızlığı ile %100 hata ayıklanıyor. İşte daha kolay olacak bir koşul - yukarıdaki işlevlerin tüm kayıtları geçene kadar hatasız. Bu dosya, kompleksteki bu hata kontrol yöntemlerini açıklar. Tampon kontrol edilir, bir hata varsa, arabelleği sıfırlayın ve hatayı görüntüleyin.
Yorum içeren kod
Kodu test etmediğimi kendi başıma ekleyeceğim, çünkü bu kodda sahip olduğum şeyin basitleştirilmiş bir diyagramı, yorumlar kabul edilir
Devlet İnziva Yeri şu anda yedi binaya sahiptir: Kışlık Saray, Büyük İnziva Yeri (veya Eski İnziva Yeri), Küçük İnziva Yeri, Yeni İnziva Yeri, Ermitaj Tiyatrosu, Menshikov Sarayı ve eski Genelkurmay binası. Son iki mimari topluluk, nispeten yakın zamanda Devlet İnziva Yeri'nin bir parçası oldu.

Hermitage, dünyanın en büyük ve en ünlü sanat müzelerinden biridir. Petersburg'u ziyaret eden her turist, Hermitage'ın beş binası boyunca set boyunca yürüyerek şehri tanımaya başlar. Petersburg'un her sakini, Hermitage'ı ziyaret etmediyseniz, o zaman St. Petersburg'un ruhuyla dolu olmadığınızdan emindir. Şu anda, Hermitage aynı zamanda bir kültür ve eğitim kurumudur. Burada çeşitli üniversitelerden öğretmenler tarafından çeşitli konularda dersler verilmektedir. Petersburg öğrencilerinin okul müfredatı, Hermitage'ı ziyaret etmeyi içerir. Hermitage, okul ve gençlik merkezi ile yakın işbirliği içindedir.

Ermitaj'ın ana binası Kışlık Saray'dır. Saray, Elizabeth Petrovna'nın emriyle 18. yüzyılın ortalarında inşa edilmiştir. Yerinde, İmparatoriçe'ye kraliyet daireleri için yeterince muhteşem ve geniş görünen başka bir Kış Sarayı duruyordu. İmparatorluk sarayı olarak anılmaya değer yeni bina, mimar Bartolomeo Francesco Rastrelli'nin rehberliğinde inşa edildi, ancak ne tahtta onun yerine geçen Elizabeth ne de Peter III, içinde yaşamayı başardı. Moskova'daki taç giyme töreninden sonra, II. Catherine ciddiyetle, daha sonra Hermitage'ın sembolü haline gelen bitmiş Kışlık Saray'a girdi. Ancak, yeni ikamet yerini beğenmedi: önce burada bir şeyi yeniden inşa etmeyi emretti ve sonra Kış Sarayı'nın yanında daha sonra Küçük Hermitage olarak adlandırılan başka bir bina inşa etmeye karar verdi. Mimarlar Yuri Matveyevich Felten ve Wallen-Delamot Jean-Baptiste Michel projesinde çalıştı. Küçük İnziva Yeri'nin inşası tamamlandığında, Catherine zamanının önemli bir bölümünü orada geçirmeye başladı.

Küçük İnziva Yeri, II. Catherine için gelecekteki müzenin temelini oluşturan resim koleksiyonunu yerleştirebileceği bir yer haline geldi. Koleksiyon sürekli olarak yeni resimler, heykeller, süs taşlarından yapılmış makaleler ve diğer sanat objeleriyle dolduruldu. Ve sonunda, Küçük İnziva Yeri'nde yerleştirmeleri için boş alan kalmamıştı. 1771-1787'de, resim ve heykellerin depolanması için özel olarak tasarlanan Büyük İnziva Yeri olan başka bir bina eklendi. Mimar Yu. M. Felten'in yönetimi altında inşa edilen Büyük İnziva Yeri, Kışlık Saray ve Küçük İnziva Yeri'nden çok sade, süslenmemiş bir görünümle farklıydı.

Tiyatro gösterilerine katılım moda oldu. Yaklaşık olarak Büyük Ermitaj ile aynı yıllarda, Hermitage Tiyatrosu, Giacomo Quarenghi tarafından tasarlanan Saray Meydanı'na inşa edildi. İmparatoriçe Catherine II, Küçük Hermitage'ın tüm konukları ağırlayamadığı performanslara çok sayıda misafir davet etti. Küçük ve Büyük Hermitage'da yer tükendiğinde yeni Hermitage gerekli hale geldi. Yeni Hermitage projesinin geliştirilmesi Alman mimar Leo von Klenze'ye emanet edildi ve Rus mimarlar Vasily Petrovich Stasov ve Nikolai Efimovich Efimov tarafından gerçekleştirildi. Şaşırtıcı derecede güzel Hermitage Tiyatrosu, şu anda şehir düzeyinde toplu etkinliklerin yeridir.
(klasör görünümleri: 78464)

Bulunan: 188 fotoğraf 16 sayfa. Görüntülenen: 13 ila 24.



inziva yeri
İzlendi: 2939. Yorumlar:0


inziva yeri
İzlendi: 2659. Yorumlar:0


inziva yeri
İzlendi: 2027. Yorumlar:0


inziva yeri
İzlendi: 2227. Yorumlar:0


inziva yeri
İzlendi: 2542. Yorumlar:0


inziva yeri
İzlendi: 2531. Yorumlar:0


inziva yeri
İzlendi: 3068. Yorumlar:0


inziva yeri
İzlendi: 2737. Yorumlar:0


inziva yeri
İzlendi: 2945. Yorumlar:0

Tamam, kafamda biraz karmaşık ve umarım açıklayabilirim. Bir şey net değilse, soruyu açıklayabilmem için lütfen yorum yapın.

Kullanıcı dosyası yüklemelerini 3. sunucuya işlemek istiyorum.

Böylece sahibiz

  • kullanıcı
  • web sitesi (web sitesini çalıştıran sunucu)
  • depolama sunucusu (dosyayı alır)

Akış şu şekilde olmalıdır:

    Site, doğrudan hedef depolama sunucusuna işaret eden bir depolama bulut ağ geçidinden bir yükleme URL'si ister (http://serverXY.mystorage.com/upload.php> gibi bir şey). İstekle birlikte "hedef yol" (benzersiz web sitesi ve global olarak benzersiz) ve yönlendirme URL'si gönderilir.

    Web sitesi, hedef olarak depolama sunucuları yükleme sunucusuyla bir yükleme formu oluşturur, kullanıcı bir dosya seçer ve gönder düğmesine tıklar. Depolama sunucusu posta isteğini işler, dosyayı geçici bir konuma kaydeder (yani "/tmp-directory/".sha1(target-path-fromabove)) ve web sitesi tarafından belirtilen yeniden yönlendirme URL'sine yeniden yönlendirir. "Hedef yol" da geçilir.

    Kullanıcı işlemi iptal ederse veya bağlantı kesilirse veya bunun gibi bir şey olursa hiçbir "hayalet dosyanın" kalmasını istemiyorum! Ayrıca, depolama bulutunda düzgün bir şekilde işlenmemiş ve ardından kırılmış olan web sitesi veritabanındaki kayıtlardan da kaçınmalısınız. bu yüzden ve bir sonraki adım

    bunlar kritik adımlar

    • Artık web sitesi girişi kendi veritabanına yazar ve huzurlu bir API depolama isteği gönderir (imza, web sitesi gizli bir belirteçle kimlik doğrulaması yapmalıdır)
    • dosyayı depolama sunucusundaki geçici konumundan son konumuna kopyalar (bu, yalnızca yeniden adlandırılması nedeniyle hızlı olmalıdır)
    • aynı dinlenme sorgusu, sahip olarak web sitesi kimliğiyle birlikte depolama ağları veritabanına bir veritabanı satırı ekler
  • Depolama sunucusundaki tmp dizininde bulunan ve 24 saatten daha eski olan tüm dosyalar otomatik olarak silinir.

Kullanıcı tarayıcı penceresini kapatırsa veya bağlantı kesilirse sunucudaki program akışı da kesintiye uğrar değil mi? Yalnızca yıkıcılar ve kayıtlı kapatma işlevleri yürütülür, değil mi?

Kodun bu bölümünü "kritik" hale getirmemin bir yolu var mı, böylece sunucu, kodun bu bölümüne ulaşırsa, kullanıcının sayfa yüklemesini iptal edip etmediğine bakılmaksızın, onu sonuna kadar yürütür mü?

(Tabii ki, bir sunucu çökmesi veya hatasının her an bozulabileceğini biliyorum, ancak endişelerim düzenli iş parçacığı oluşturma ile ilgili)

Benden biri, site veritabanında dosyayı "tamamlandı" olarak işaretleyen bir bayrak ve zaman damgasına sahip olmak ve eski tamamlanmamış dosyalar için bir cronjob'ı kontrol etmek ve bunları depolama bulutundan ve ardından site veritabanından kaldırmaktı, ama gerçekten yapardım bu ek alan ve prosedürden kaçınmak ister.

API mağazasının çok genel olmasını ve gelecekteki birçok projede kullanmasını istiyorum.

Geliştiriciler ve amazon s3 için google depolama alanına baktım.

Aynı sorunu yaşıyorlar ve daha kötüsü. Amazon S3'te gönderi isteğinizi "imzalayabilirsiniz". Böylece dosya sizin yetkiniz altındaki kullanıcı tarafından yüklenir ve doğrudan kaydedilir ve kaydedilir ve bunun için ödeme yapmanız gerekir. Bağlantı kesilirse ve kullanıcı sitenize asla geri dönmezse, bilemezsiniz bile. Bu nedenle, imzaladığınız tüm indirme url'lerini saklamalı ve cronjob'da kontrol etmeli ve "hedefe ulaşmayan" her şeyi kaldırmalısınız.

Sevgili programcı arkadaşlarım, projem uzun zamandır sadece web programlama teknolojilerini anlama ve uygulama pratiği yapma arzusunun ötesine geçti. Bu bağlamda, projenin gelişimi hakkında giderek daha küresel düşünmeye başladım.

Yaklaşık bir aydır düşünüyordum ve sonunda şu sonuca vardım: Projeyi blog girişlerinden daha ileriye götürmemiz ve ona bir isim vermemiz gerekiyor.

Adın seçiminde bazı sorunlar vardı, çünkü tüm güzel alan adları uzun süredir satıcılar tarafından işgal edildi veya satın alındı. Birkaç günlük isimlendirmenin sonuçlarını takiben projem için değerli bir isim buldum!

Tanışmak: MOGUTA.CMS

moguta.ru alan adını zaten kaydettim ve yakında projeyle ilgili tüm haberler orada yayınlanacak.

Ek olarak, bugünden itibaren VKontakte grubu kullanıma sunuldu: MOGUTA.CMS

Ama hepsi bu değil!

seni işbirliğine davet ediyorum

Projenin geliştirilmesi ile ilgilenen herkes MOGUTA.CMS Geliştiricilerin saflarına katılmayı öneriyorum.

Takıma katılmanın faydaları nelerdir:

  1. Gerçek deneyim alışverişi;
  2. yaratma yeteneği;
  3. Sonuç olarak: bir çevrimiçi mağaza geliştirmek için hazır, hızlı, modern bir CMS;
  4. kamu saygısı.

Ek olarak, gelecekte bir tüzel kişilik kaydettirmek ve sırasıyla tüm ekibe gerekli maaşla iş sağlamak istiyorum. Tabii ki, bu yakında olmayacak ve bunun olacağının hiçbir garantisi yok, hepsi davetime verilen yanıtların etkinliğine bağlı.

Bu nedenle, bir okul çocuğu, öğrenci veya sadece akıllı bir adamsanız - fırsatı kaçırmayın, geliştiricilerin saflarına katılın ve zamanla ekibimiz CMS pazarında onur yerini alacaktır. (Oldukça iyimser! :))

Gelelim derse...