Beskorisna kategorija php. PHP klasa za praktičan i siguran rad s MySQL. Saznajte više o upisanim rezerviranim mjestima

Danas nam je cilj stvoriti hijerarhijsku strukturu kategorija. Važno nam je da je zgodno pohraniti kategorije i da ih je lako prikazati tamo gdje nam trebaju.

Ponekad jednostavno izgleda komplicirano, zato ću izložiti nekoliko isječaka koda za koje se nadam da će vam biti korisni za implementaciju php kategorija u obliku stabla.

Dakle, struktura bi se trebala sastojati od ID-a kategorije (id), naziva kategorije (name) i naravno ID-a roditeljske kategorije (parent_id). U MySQL-u to izgleda ovako:

KREIRAJ TABLICU AKO NE POSTOJI `kategorija` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE =InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Minimalna i razumljiva struktura tablice za pohranu kategorija.

INSERT INTO `category` (`id`, `name`, `parent_id`) VRIJEDNOSTI (1, "Telefoni i tableti", "0"), (2, "Automobili", "0"), (3, "Samsung ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, " Galaxy Tab 4", "3"), (10, "Galaxy S6", "3");

Gdje je parent_id=0, ova kategorija nema nadređenu kategoriju.

Ovdje je sve jasno i jednostavno. Sada prijeđimo na popis kategorija. Ali za ispravan ispis popisa prvo trebamo dobiti cijeli popis php kategorija, a tek onda pomoću rekurzije formirati naše stablo. Sljedeća funkcija je za dobivanje ovog popisa:

Funkcija get_cat() ( // upit baze podataka $sql = "SELECT * FROM kategorija"; $result = mysql_query($sql); if(!$result) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows ($rezultat) != 0) ( //Za($i = 0; $i< mysql_num_rows($result);$i++) { $row = mysql_fetch_array($result,MYSQL_ASSOC); //Формируем массив, где ключами являются адишники на родительские категории if(empty($arr_cat[$row["parent_id"]])) { $arr_cat[$row["parent_id"]] = array(); } $arr_cat[$row["parent_id"]] = $row; } //возвращаем массив return $arr_cat; } }

//dobijte polje kataloga $result = get_cat();

Sada nam treba funkcija s rekurzijom

Funkcija view_cat($arr,$parent_id = 0) ( //Uvjeti izlaza iz rekurzije if(empty($arr[$parent_id])) ( return; ) echo "

    "; // proći kroz niz i prikazati for($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //rekurzija - provjerite postoje li podređene kategorije view_cat($arr,$arr[$parent_id][$i]["id "] ); odjek "
  • "; ) jeka "
"; }

Sada preostaje samo prikazati imenik na ekranu pomoću rekurzivne funkcije

View_cat($rezultat);

I općenito, to je sve. Na taj način možemo dobiti potpuno stablo kategorija s beskonačnim potkategorijama.

) Pokazao sam vam primjer korištenja regularnih izraza za pronalaženje određenih dijelova izvorni kod stranice. Sada ćemo naučiti kako ih sami napisati. Ova vještina pomoći će vam u pisanju, čišćenju teksta od nepotrebnih fragmenata, traženju pravih dijelova u velikim količinama teksta i tako dalje.

Datum objave: 20.10.2013

Nastavljamo s pisanjem liveinternet analize statistike posjetitelja. Ako nam se netko tek pridružio, savjetujem vam da počnete s time da smo se neovlašteno povezali s uslugom. Tamo smo naučili kako doći do sadržaja s otvorenih stranica koje nisu zaštićene lozinkom. Ali, zapravo, pristup većini stranica je zatvoren, tako da je vrlo malo koristi od skripte koja ne zna kako se prijaviti, kao što razumijete. Ali ne brinite, sada ćemo to popraviti.

Datum objave: 08.10.2013

Dobar dan, čitatelji! Vrijeme je da malo vježbate. Već imate dovoljno znanja da počnete pisati korisne skripte koje će vam olakšati posao. Jedan od njih može biti parser. Što je to, detaljno sam opisao u svom, pa ako ne znate, savjetujem vam da to pročitate. Ukratko, bit parsera je pretraživanje i izolacija potrebne informacije iz velikog dijela teksta. U slučaju interneta, to je najčešće izvlačenje potrebnih podataka sa stranica stranica. U našem slučaju, to će biti Liveinternet. Pa, idemo!

Datum objave: 10.03.2013

Ovaj članak će se fokusirati na tako moćan alat kao što je cURL, kao i na php biblioteku koja omogućuje pristup ovom alatu - libcurl. Čemu sve ovo? Za komunikaciju s poslužiteljem putem protokola za prijenos podataka, kao što su http ili ftp. Ostali protokoli nam nisu posebno zanimljivi, ako se netko želi udubiti u ovu temu, morat će kopati izvore na engleskom jeziku, a ovaj članak će sadržavati osnove i primjere korištenja.

Datum objave: 24.11.2012

Datum objave: 05.11.2012

A sada će biti prilično velika, ali ne i komplicirana lekcija o radu s datotekama u php-u. Prije svega, čemu služe datoteke? Uostalom, sve možete pohraniti u bazu podataka MySQL podaci ili PostgreSQL ili bilo što drugo. Ali ponekad postoje takvi zadaci kada korištenje baze podataka, uz svu obradu i brigu o sigurnosti veze, nije preporučljivo. Na primjer, trebate napraviti obični brojač, a prije toga u našem projektu nismo koristili bazu podataka. Pa zašto bismo, radi jednog sićušnog brojača, pokrenuli bazu podataka i u nju pohranili samo nekoliko redaka? puno je lakše koristiti datoteke. Osim toga, ponekad hosting uopće ne podržava baze podataka, tada datoteke općenito ostaju jedini izlaz.

Datum objave: 04.11.2012

Kad god dopustite svojim korisnicima da pošalju tekst na vašu stranicu (ime ili bilo koju drugu informaciju), morate biti oprezni. Morate biti sigurni da na stranici nemate sigurnosnih rupa koje napadači mogu iskoristiti za hakiranje. Ako i dalje trebate primati podatke od korisnika, svakako koristite funkciju htmlentities kako biste spriječili pokretanje HTML koda ili skripti koje mogu biti štetne i opasne!

Datum objave: 04.11.2012

U ovoj lekciji ćemo pogledati tehnike za prijenos podataka između obrazaca i stranica. Ove metode su POST i GET. Razgovarat ćemo o svakom zasebno i detaljnije. Općenito govoreći, neophodan je za komunikaciju između oblika. Na primjer, ispunimo neka polja na stranici i trebamo ih prenijeti na drugu stranicu za obradu.

Datum objave: 03.11.2012

Zapravo, kao što ste do sada mogli pogoditi, do while petlja je malo modificirana verzija while petlje koju smo vidjeli u prethodnim tutorijalima. Ako se sjećate kako regularni while radi, bit će vam lakše razumjeti novu petlju. Ponovimo: tijelo while petlje se izvršava ako je uvjet istinit i ne izvršava se ako nije istinit, ali se ne smije izvršiti niti jednom ako je uvjet lažan od samog početka. Kako izgleda dok radi?

Datum objave: 03.11.2012

Zamislite da imate asocijativni niz koji želite iterirati. PHP pruža jednostavan način za redom korištenje svakog elementa niza pomoću konstrukcije Foreach.

Vraća niz objekata koji sadrže informacije o kategoriji.

Parametri proslijeđeni ovoj funkciji vrlo su slični parametrima proslijeđenim funkciji wp_list_categories() i mogu se proslijediti ili kao niz ili kao niz upita: type=post&order=DESC.

✈ 1 put = 0,005625 s = Tako sporo| 50000 puta = 11,98 s = polako| PHP 7.1.11, WP 4.9.5

Korištenje

$kategorije = get_categories($args);

Uzorak upotrebe

$categories = get_categories(array("taxonomy" => "category", "type" => "post", "child_of" => 0, "parent" => "", "orderby" => "name", " poredak" => "ASC", "hide_empty" => 1, "hijerarhijski" => 1, "isključi" => "", "uključi" => "", "broj" => 0, "pad_counts" => lažno, // puni popis parametre, pogledajte opis funkcije http://wp-kama.ru/function/get_terms)); if($categories)( foreach($categories as $cat)( // Podaci u objektu $cat // $cat->term_id // $cat->name (Kategorija 1) // $cat->slug (rubrika - 1) // $cat->term_group (0) // $cat->term_taxonomy_id (4) // $cat->taksonomija (kategorija) // $cat->description (Tekst opisa) // $cat-> roditelj (0) // $cat->count (14) // $cat->object_id (2743) // $cat->cat_ID (4) // $cat->category_count (14) // $cat-> category_description (Tekst opisa) // $cat->cat_name (Kategorija 1) // $cat->category_nicename (rubrika-1) // $cat->category_parent (0) ) ) taksonomija (crta) Naziv taksonomije za obradu. Dodano od verzije 3.0.
Zadano: "kategorija" tip (crta)
  • post - kategorije postova (zadano);
  • poveznica - dijelovi poveznica.
    Zadano: "post"
dijete_od (crta) Dohvatite podređene kategorije (uključujući sve razine ugniježđenja) navedene kategorije. Parametar navodi ID nadređene kategorije (kategorije čije ugniježđene kategorije želite prikazati). roditelj (broj) Dobiva kategorije čija je nadređena kategorija jednaka navedenom ID parametru. Razlika od child_of je u tome što će biti prikazana jedna razina ugniježđenja.
Zadano: "" naručiti po (crta)

Razvrstavanje primljenih podataka prema određenim kriterijima. Na primjer, prema broju postova u svakoj kategoriji ili prema nazivu kategorije. Dostupni su sljedeći kriteriji:

  • ID - sortiranje po ID-u;
  • ime - sortiraj po imenu (zadano);
  • slug - razvrstavanje po alt. ime (puž);
  • count - prema broju prijava u kategoriji;
  • term_group - po grupi.

Zadano: "ime"

Narudžba (crta)

Smjer sortiranja naveden u parametru "orderby":

  • ASC - redom, od najmanjeg prema najvećem (1, 2, 3; a, b, c);
  • DESC - obrnutim redoslijedom, od najvećeg prema najmanjem (3, 2, 1; c, b, a).

Zadano: "ASC"

Sakrij_prazno (logično)

Želite li ili ne dobiti prazne kategorije (bez unosa):

  • 1 (istina) - ne primati prazno,
  • 0 (lažno) - isprazni se.

Zadano: točno

Hijerarhijski (logično) Ako je parametar postavljen na pravi, rezultat će uključivati ​​prazne podređene kategorije čije podređene kategorije imaju unose (neprazne).
Zadano: točno isključiti (niz/niz) Isključite sve kategorije s popisa. Morate navesti ID-ove kategorija odvojene zarezima ili u nizu. Ako je ovaj parametar naveden, parametar child_of bit će nadjačan.
Zadano: "" uključiti (niz/niz) Navedite samo navedene kategorije. Trebate navesti ID-ove kategorija odvojene zarezima ili u nizu.
Zadano: "" broj (broj) Ograničiti. Broj kategorija koje treba dohvatiti. Prema zadanim postavkama nema ograničenja - sve će kategorije biti dohvaćene. broj_podložaka (logično) Ako je istinito, tada će broj koji pokazuje broj unosa u nadređenim kategorijama biti zbroj vlastitih unosa i unosa iz podređenih kategorija.
Zadano: netočno

Primjeri

#1 Padajući popis

Kako bismo stvorili padajući popis kategorija, možemo koristiti drugu posebnu funkciju wp_dropdown_categories() :

wp_dropdown_categories(array("hide_empty" => 0, "name" => "category_parent", "orderby" => "name", "selected" => $category->parent, "hierarchical" => true, "show_option_none" => __("Ništa")));

međutim, s ovim pristupom, izgubit ćemo nešto fleksibilnosti u postavljanju popisa, jer ćemo završiti s potpuno formiranim popisom.

Stoga će u nekim slučajevima biti logičnije stvoriti padajući popis pomoću funkcije get_categories(). Evo primjera (pod pretpostavkom da želimo prikazati potkategorije (djecu) kategorije 10):

#2 Popis kategorija i njihov opis

Ovaj primjer će nam pokazati kako ispisati linkove na kategorije, gdje će odmah iza svakog linka biti opis kategorije (navedeno prilikom kreiranja/uređivanja kategorije):

"ime", "narudžba" => "ASC")); foreach($categories kao $category)( echo "

Kategorija: term_id) . ""naslov="" . sprintf(__("Prikaži sve postove u %s"), $category->name) . "" " . ">" . $category->name."

"; jeka "

Opis:". $category->description . "

"; jeka "

Broj postova: ". $category->count . "

"; } ?>

Bilješke

  • Vidi: get_terms() Tip argumenata koji se mogu mijenjati.

Popis promjena

Od verzije 2.1.0 Predstavljeno.

Kod getcategories: wp-includes/category.php WP 5.3.2

"kategorija"); $args = wp_parse_args($args, $defaults); /** * Filtrira taksonomiju koja se koristi za dohvaćanje pojmova prilikom poziva get_categories(). * * @od 2.7.0 * * @param string $taxonomy Taksonomija iz koje se dohvaćaju pojmovi. * @param array $args Niz argumenata. Pogledajte get_terms(). */ $args["taksonomija"] = apply_filters("get_categories_taxonomy", $args["taksonomija"], $args); // Back compat if (isset($args["type"]) && "link" == $args["type"]) ( _deprecated_argument(__FUNCTION__, "3.0.0", sprintf(/* prevoditelji: 1: " type => link", 2: "taxonomy => link_category" */ __("%1$s je zastario. Koristite %2$s umjesto toga."), " tip => veza", "taksonomija => kategorija_veza")); $args["taxonomy"] = "link_category"; ) $categories = get_terms($args); if (is_wp_error($categories)) ( $categories = array(); ) else ( $categories = (array) ) $categories; foreach (array_keys($categories) as $k) ( _make_cat_compat($categories[ $k ]); ) ) return $categories; )

U ovom članku (webmaster level - advanced), govorit ćemo o, presijecajući na različite načine, tzv. fasetirana navigacija. Kako biste pojednostavili asimilaciju materijala, preporučujem da pregledate članak na Wikipediji "Klasifikacija aspekata" i publikacije na engleskom (ali sa slikama!) "Dizajnirajte bolju fasetiranu navigaciju za svoje web stranice".

Fasetirana navigacija filtrirana prema boji ili rasponu cijena može biti korisna za vaše posjetitelje, ali često štetna za pretraživanje stvaranjem višestrukih kombinacija adresa s dvostrukim sadržajem. Zbog duplikata, tražilice neće moći brzo indeksirati web mjesto radi ažuriranja sadržaja, što sukladno tome utječe na indeksiranje. Kako bismo smanjili ovaj problem i pomogli webmasterima da fasetiranu navigaciju učine pogodnom za pretraživanje, željeli bismo:

Idealno za korisnike i Google pretraživanje

Čisti put do stranica proizvoda/članaka:

Predstavljanje URL-a za stranicu kategorije:
http://www.example.com/category.php?category=gumasti-bomboni

Predstavljanje URL-a za određeni proizvod:
http://www.example.com/product.php?item=swedish-fish

Neželjeni duplikati uzrokovani fasetiranom navigacijom

Ista stranica dostupna je s različitih web adresa:

Kanonska stranica



URL: example.com/product.php? item=swedish-fish

Duplicirana stranica



URL:example.com/product.php? item=swedish-fish&category=gumeni-bomboni&price=5-10


kategorija=gumeni-bomboni&okus=kiselo&cijena=5-10

greške:

  • Googleu to nema smisla jer korisnici rijetko pretražuju [$9:55 marmelada].
  • Nema smisla da alati za indeksiranje pronađu istu stavku ("voćna salata") sa nadređenih stranica kategorije (bilo "Gummi" ili "Sour Gummy").
  • Negativna točka za vlasnika stranice, jer su zahtjevi za indeksiranje razrijeđeni s višestrukim verzijama iste kategorije.
  • Negativna točka za vlasnika stranice, jer je to beskorisno i nepotrebno opterećenje propusnosti stranice
Prazne stranice:


URL: example.com/category.php? kategorija=gumeni-bomboni&okus=kiselo&cijena=preko-10

greške:

  • Neispravno dat kod za tražilice (u ovom slučaju stranica bi trebala dati kod 404)
  • Prazna stranica za korisnike


Najgora (neprikladna za pretraživanje) rješenja za fasetiranu navigaciju

Primjer #1: U URL-u se koriste nestandardni parametri: zarezi i zagrade, umjesto ključ=vrijednost&:

  • primjer.com/kategorija? [ kategorija:gumasti-bomboni ][ sortiraj:cijena-niska-visoka ][ sid:789 ]
  • primjer.com/kategorija?kategorija , gumeni bomboni , sortiranje , nisko do visoko , sid , 789
Kako da:
primjer.com/kategorija? category=gumeni-bomboni&sort=low-to-high&sid=789

Primjer #2: Korištenje direktorija ili staza datoteka umjesto opcija na popisima vrijednosti koje ne mijenjaju sadržaj stranice:
primjer.com/c123/s789/product?swedish-fish
(gdje je /c123/ kategorija, /s789/ ID sesije, koji ne mijenja sadržaj stranice)

Dobra odluka:

  • primjer.com /gumeni-bomboni/ proizvod?item=swedish-fish&sid=789(direktorij, /gumene-bombone/, mijenja sadržaj stranice na smislen način)
Najbolja odluka:
  • example.com/product?item=swedish-fish& kategorija=gumeni-bomboni&sid=789 (URL parametri daju veću fleksibilnost tražilicama da odrede kako učinkovito indeksirati)
Alatima za indeksiranje je teško razlikovati korisne vrijednosti (npr. "gummy-candy") od beskorisnih vrijednosti (npr. "SESSIONID") kada su te vrijednosti smještene izravno na putu veze. S druge strane, parametri URL-a omogućuju tražilicama fleksibilnost za brzu provjeru i određivanje kada određena vrijednost ne zahtijeva pristup indeksiranja svim varijacijama.

Uobičajene vrijednosti koje ne mijenjaju sadržaj stranice i trebaju biti navedene kao URL parametri uključuju:

  • ID sesije
  • ID praćenje
  • Identifikatori preporuke
  • Vremenske oznake
Primjer #3: Pretvorite vrijednosti koje generiraju korisnici (moguće beskonačne) u parametre URL-a koji se mogu indeksirati i indeksirati, ali su beskorisni za pretraživanje.
Korištenje manjih podataka koje su generirali korisnici web-mjesta (kao što je zemljopisna dužina/širina ili "prije dana") u pretraženim i indeksiranim URL-ovima:
  • primjer.com/pronađi-liječnika? radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com/article?category=health& prije dana=7
Kako da:
  • primjer.com/pronađi-liječnika? grad=san-francisco&susjedstvo=soma
  • example.com/articles?category=health& datum=siječanj-10-2014
Umjesto da dopustite korisniku da generira vrijednosti za generiranje URL-ova koji se mogu indeksirati (što rezultira beskrajnim mogućnostima s vrlo malom vrijednošću za posjetitelje), bolje je objaviti kategoriju stranice za najpopularnije vrijednosti, a mogu se uključiti i dodatne informacije kako bi stranica bila više vrijedniji od uobičajene stranice za pretraživanje s rezultatima. Alternativno, možete razmisliti o postavljanju korisnički generiranih vrijednosti u zasebni direktorij i zatim korištenju datoteke robots.txt da onemogućite indeksiranje iz tog direktorija.
  • primjer.com /filtriranje/ find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • primjer.com /filtriranje/ articles?category=health&days-ago=7
I u robots.txt:
Korisnički agent: *
Zabrani: /filtriranje/

Primjer #4. Dodavanje URL parametara bez logike.

  • primjer.com /gumene-bombone/lizalice/gumene-bombone/ gumeni-bomboni/proizvod?švedska-riba
  • primjer.com/proizvod? mačka=gumeni-bomboni&mačka=lizalice&mačka=gumeni-bomboni&cat=gumeni-bomboni&item=švedska-riba
Dobra odluka:
  • primjer.com /gumeni-bomboni/ proizvod?item=swedish-fish
Najbolja odluka:
  • primjer.com/proizvod? item=swedish-fish&category=gumeni bomboni
Suvišni parametri URL-a samo povećavaju dupliciranje, a kao rezultat toga, stranica se manje učinkovito indeksira i indeksira. Stoga je potrebno riješiti se nepotrebnih URL parametara i povremeno očistiti junk linkove prije generiranja novih URL-ova. Ako je za korisničku sesiju potrebno mnogo parametara, moguće je sakriti informacije u kolačićima, umjesto stalnog dodavanja vrijednosti, kao mačka=gumene-bombone&mačka=lizalice&mačka=gumene-bombone& ...

Primjer #5: Predloži daljnje dorade (filtriranje) kada postoje nulti rezultati.

Loše:
Omogućuje korisnicima da odaberu filtre kada postoje nulte stavke za pročišćavanje.


Usklađivanje na stranicu s nula rezultata (na primjer, cijena=preko-10), što frustrira korisnike i uzrokuje nepotrebne upite za tražilice.

Kako da:
Kreirajte veze samo kada postoje elementi koje korisnik može odabrati. Ako je rezultat nula, označite vezu kao "sivu" (tj. ne može se kliknuti). Da biste dodatno poboljšali upotrebljivost, razmislite o uključivanju indikatora broja stavki pored svakog filtra.


Nije dopušteno prikazivanje stranice s nula rezultata (na primjer, cijena=preko-10), osim toga zabranjeno je korisnicima nepotrebne klikove, a tražilicama indeksiranje ove neupotrebljive stranice.

Potrebno je spriječiti nepotrebne URL-ove i minimizirati prostor posjetitelja generiranjem URL-ova samo kada su proizvodi dostupni. To će pomoći da korisnici ostanu angažirani na vašoj web-lokaciji (manje klikova na gumb Natrag kada nije pronađen proizvod), smanjiti broj mogućih URL-ova poznatih tražilicama. Također, ako stranica nije samo "trenutno rasprodana", nego je malo vjerojatno da će ikada sadržavati relevantne informacije, razmislite o tome da joj date kod odgovora 404. Na stranici 404 možete dizajnirati korisnu poruku za korisnike s više mogućnosti navigacije ili okvirom za pretraživanje kako bi korisnici mogli pronaći srodne proizvode.

Za nove web-lokacije čiji webmasteri razmatraju implementaciju fasetirane navigacije, postoji nekoliko opcija za optimizaciju indeksiranja (zbirka adresa na vašoj web-lokaciji poznatih Googlebotu) stranica s jedinstvenim sadržajem i smanjenje indeksiranja dvostrukih stranica u tražilici (konsolidacija signala indeksiranja).

Odredite koji su parametri URL-a potrebni tražilicama za indeksiranje svake pojedine stranice sadržaja (tj. odredite koji su parametri potrebni za stvaranje najmanje jedne putanje klika do svake stavke). Traženi parametri mogu uključivati ​​item-id, category-id, page itd.

Odredite koji će parametri biti korisni posjetiteljima s njihovim upitima, a koji će vjerojatnije uzrokovati dupliciranje u indeksiranju i indeksiranju. U primjeru slatkiša (marmelada), parametar URL-a "okus" mogao bi biti vrijedan korisnicima s upitima u primjeru okus=kiselo . Međutim, logično je smatrati da parametar "cijena" uzrokuje nepotrebno dupliciranje kategorija=gumeni-bomboni&okus=kiselo& cijena=preko-10 . Ostali uobičajeni primjeri:

  • Vrijedni parametri za tražilice: item-id, category-id, name, brand...
  • Nepotrebni parametri: session-id, price-range ...
Razmislite o implementaciji jedne od nekoliko opcija konfiguracije za URL-ove koji sadrže nepotrebne parametre. Samo se uvjerite da "nepotrebni" parametri URL-a stvarno nisu potrebni za indeksiranje od strane alata za indeksiranje ili za korisnika da pronađe svaki pojedinačni proizvod!

Opcija 1: i interne veze

Označite sve nepotrebne URL-ove s . To će smanjiti troškove rada robota za pretraživanje i spriječiti smanjenje učestalosti skeniranja. Morate globalno upravljati indeksiranjem kroz robots.txt (Napomena prevoditelja: pogledajte članak "").
Koristite atribut rel="canonical" za odvajanje stranica za indeks pretraživanja od stranica koje tamo nisu potrebne (na primjer, na stranici cijena=5-10 možete napisati atribut rel="canonical", koji označava kategoriju svih kiselih marmelada example.com/category.php?category=gumasti-bomboni&okus=kiselo& stranica=sve ).

Opcija 2: Robots.txt i Disallow

URL-ovi s nepotrebnim parametrima uključeni su u /filtering/ direktorij, koji će biti zatvoren u robots.txt (zabrani disallow). Ovo će svim tražilicama omogućiti indeksiranje samo "ispravne" unutarnje veze (sadržaja) stranice, ali će blokirati indeksiranje neželjenih URL-ova odjednom. Na primjer ( example.com/category.php?category=gumasti-bomboni), ako su vrijedni parametri bili predmet, kategorija i okus, a ID sesije i cijena bili su suvišni, tada bi URL za okus bio:
example.com/category.php?category=gumasti-bomboni& okus=kiselo, ali sve nepotrebne parametre, poput cijene, URL će uključiti u unaprijed definirani direktorij - /filtriranje/:
primjer.com /filtriranje/ kategorija.php?category=gumasti-bomboni&price=5-10,
koji će tada biti zabranjen putem robots.txt:
Korisnički agent: *
Zabrani: /filtriranje/

Opcija 3: Odvojeni hostovi

Provjerite jesu li i dalje primjenjiva najbolja gore navedena rješenja (na primjer za neželjene adrese). Inače, tražilice su već formirale veliku masu linkova u indeksu. Stoga će vaš rad biti usmjeren na smanjenje daljnjeg rasta nepotrebnih stranica koje pregledava Googlebot i konsolidaciju signala indeksiranja.

Koristite parametre sa standardnim kodiranjem i formatom ključ=vrijednost.

Uvjerite se da su vrijednosti koje ne mijenjaju sadržaj stranice, kao što su ID-ovi sesije, implementirane kao ključ=vrijednost, a ne direktoriji.

Nemojte dopustiti klikove i nemojte generirati URL-ove kada nema elemenata za filtriranje.

Dodajte logiku preslikavanju parametara URL-a: uklonite nepotrebne parametre radije nego da stalno dodajete vrijednosti (npr. izbjegavajte generiranje veze poput ove: example.com/product?cat=gumasti-bomboni&cat=lizalice &cat=gumasti-bomboni&item=swedish-fish).

Pohranite vrijedne parametre u URL tako da ih prvo navedete (jer su URL-ovi vidljivi u rezultatima pretraživanja), a manje relevantne parametre na kraju (kao što je ID sesije).
Izbjegavajte ovu strukturu veze: primjer.com/kategorija.php? session-id=123&tracking-id=456&category=gumeni-bomboni&okus=kiselo
Podesite postavke URL-a u Alatima za webmastere ako jasno razumijete kako funkcioniraju veze na vašoj web-lokaciji.

Osigurajte da kada koristite JavaScript za dinamičko upravljanje sadržajem (sortiranje/filtriranje/sakrij) bez ažuriranja URL-a, na vašem web-mjestu postoje stvarne web-adrese koje imaju vrijednost pretraživanja, kao što su glavne kategorije i stranice proizvoda, koje se mogu indeksirati i indeksirati. Pokušajte ne koristiti samo početnu stranicu (tj. jedan URL) za cijelu svoju stranicu, već dinamički mijenjajte sadržaj navigacije kroz JavaScript - to će, nažalost, korisnicima dati samo jedan URL u pretrazi. Također, provjerite da izvedba ne utječe negativno na dinamičko filtriranje, jer će spriječiti korisnika da radi sa web mjestom.

Poboljšajte indeksiranje različitih stranica istog sadržaja navođenjem atributa rel="canonical" na privilegiranoj verziji stranice. Atribut rel="canonical" može se koristiti unutar jedne ili više domena.

Optimizirajte indeksiranje "straničnog" sadržaja (npr. page=1 i page=2 iz kategorije "gumenih bombona") pomoću (ili):

  • Dodajte atribut rel="canonical" nizu stranica navodeći kanoničku kategoriju s parametrom "view-all" (npr. page=1, page=2 i page=3 iz kategorije "gumeni bomboni" s rel=” kanonski” na kategorija=gumeni-bomboni&stranica=sve), osiguravajući da je stranica relevantna za korisnike i da se brzo učitava.
  • Upotrijebite označavanje stranica rel="next" i rel="prev" da označite odnos između pojedinačnih stranica (pogledajte "Stranica s rel="next" i rel="prev" ").
Uključite samo kanonske veze u karte web stranica.

I tako, za početak ću opisati s čime ćemo raditi i što će nam trebati.
Sustav: PHP 5 i noviji, mySQL 4 i noviji
Pomoćne klase: dbsql.class.php (klasa baze podataka)
Klasa ugniježđene kategorije: classTreeCategory.php (izravno glavna klasa, njen popis i objašnjenja dati su u nastavku.

Napravite tablicu u bazi podataka sa sljedećom strukturom:

Pregled MySQL koda

Ova tablica sadrži polje iskaznica– redni broj kategorije, podkat- ima vrijednost nula za kategorije prvog reda ili ID nadređene kategorije, Ime- naziv kategorije.

Primjer klase, koja prikazuje kategorije kao popis s potkategorijama:

Pogledajte PHP kod

uključi("dbsql.class.php") ; uključi("classTreeCategory.php" ) ; $DB = novi DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // povezivanje s bazom podataka, navođenje podataka o pristupu$category = nova TreeCategory ($DB) ; // prijelaz u kategoriju klase, objekt rada s bazom podataka$category -> table = "category" ; // naziv tablice u bazi podataka s kategorijama$array = $category -> getCategory() ; // dobiti sve kategorije iz baze podataka u obliku višerazinskog niza, sortirane i ugniježđene već redoslijedom koji nam je potreban$category -> outCategory ($array, "opcija") ; // priprema izlaza kategorija (formiranje HTML-a), prosljeđivanje polja s kategorijama echo $kategorija -> html ; // izlaz kategorije kao HTML

Kao što možete vidjeti iz gornjeg primjera, sve je krajnje jednostavno, kreiramo novi objekt $category, postavljamo s kojom tablicom baze podataka radimo: 'category', zatim iz tablice dobivamo popis svih kategorija koje su već formatirane kao niz i raščlanjeni hijerarhijskim redom, uzimajući u obzir sve potkategorije. zatim niz prosljeđujemo metodi outCategory() koja za nas generira gotov HTML kod koji se samo prikazuje u pregledniku.

Metoda outCategory(), kao što vidimo, uzima dva parametra @array i @string u prvom parametru niz sa svim kategorijama, au drugom niz koji sadrži vrijednost opcija ili stol, ova vrijednost određuje koju vrstu HTML koda treba generirati.
Značenje opcija

Pogledajte HTML kod

Za umetanje zadanog HTML koda u odabrano polje bilo kojeg obrasca.

Značenje stol- generira sljedeći HTML kod:

Pogledajte HTML kod

Ovaj HTML kod je zgodan za lijepljenje u tablicu koja prikazuje sve naše potkategorije kategorija.

Klasa također ima sljedeće metode:
izbrisati stavku ($id);- uklanja jednu kategoriju, unatoč ugniježđenim
delKategorija($niz, $id);- briše kategoriju sa svim ugniježđenim potkategorijama, $array - niz sa svim kategorijama pripremljen metodom $category->getCategory(), $id - broj kategorije koja se briše
Dodaj Predmet();- ovu metodu treba pozvati ako želite dodati kategoriju, dok ova metoda čita vrijednosti iz podataka prenesenih POST metodom, tj. iz niza $_POST.
$name=$this->PHP_slashes(strip_tags($_POST['name'])); // ime kategorije
$podcat=intval($_POST['podcat']); // ID nadređene kategorije, ako je navedena 0, kategorija će biti u korijenu.
updateItem(); - slično prethodnoj metodi, osim što ova metoda ažurira kategoriju, njen naziv i razinu ugniježđenja.

tablica="kategorija"; // zahtjev za odabir popisa kategorija, naziv tablice * $category->outCategory($category->getCategory()); // pripremite izlaz kategorije (tražite niz kategorija) * echo $category->html; // prikaz kategorija u HTML nazivu * */ /** * Izbaci tablicu na kojoj se radi * * DROP TABLE IF EXISTS `category`; * STVARANJE TABLICE `kategorija` (* `id` int(11) NOT NULL auto_increment, * `podcat` int(11) NOT NULL, * `name` varchar(255) NOT NULL, * PRIMARNI KLJUČ (`id`), * KEY `id` (`id`) *) ENGINE=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory ( /** * String upita baze podataka */ var $table; /** * Sučelje baze podataka */ var $DB; /** * Niz kategorija s ugniježđenim potkategorijama */ var $arrayCat; / ** * Automatsko brojanje broja crtica prije naziva kategorije pri prikazu */ var $countPodcat; /** * HTML kod za prikaz kategorija s potkategorijama */ var $html; /** * Nabavite sučelje za rad s bazom podataka i stavite ga u lokalnu varijablu */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Dobiva popis kategorija, sortira i stavlja u niz s ugniježđenim nizovima, itd. * @return array category */ function getCategory () ( $all = $this->DB->getAll("SELECT * FROM `($this->table)` ORDER BY `id` ASC"); $path = array(); if(count($all)>0) ( foreach($all as $item): if($item["podcat"]==0)$sort[ $item[ "id"]]=$item; if($item["podcat"]>0) ( if(isset($path[$item["podcat"]])) ( $str="$sort" ; foreach( $path[$item["podcat"]] kao $pitem): $rep =$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$stavka;"; eval($str); foreach($path[$item["podcat"]] kao $pitem): $path[$item["id"]]=$pitem; endforeach; $path[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$sort; return $this->arrayCat; ) /** * Ispisuje kategorije, stavlja gotov HTML u $this->html * @param array Array s kategorijama i ugniježđenim podkategorijama * @param string Tip generiranog HTML koda za izlaz, opciju ili tablicu */ function outCategory(& $arrayCat, $type="option", $idSel=0) ( foreach($arrayCat as $sub) ( $this->countPodcat++; $this->outItem($sub, $type); if(!empty($ sub[" sub"]))$this->outCategory($sub["sub"], $type, $idSel); $this->countPodcat--; ) ) /** * Pomoćna metoda za pripremu HTML koda * @param array Niz s kategorijom * @param string Vrsta generiranog HTML koda za izlaz, opcija ili tablica */ function outItem($sub, $type="option", $idSel=0) ( for($i=0;$) icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="odabrano"; inače $se=""; if($type=="option")$this->html.=" ($out) ($sub["name"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) funkcija delCategory(&$a_tree,&$id=0) ( foreach($a_tree as $sub) ( if($sub["id"]$id and isset($sub["sub"]))$this- >delCategory($sub["sub"],$id); if($sub["id"]==$id) ( $sql="DELETE FROM ($this->table) WHERE id = "$id" LIMIT 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); ) ) ) funkcija delCategory_process (&$a_tree) ( foreach($a_tree as $sub) ( $sql="DELETE FROM ($this->table) WHERE id = "($sub["id"])" LIMIT 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) funkcija updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="AŽURIRANJE `( $this->table)` SET `name` = "($name)",`podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) funkcija addItem() ( $name=$this->PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="I NSERT INTO `($this->table)` (`id`,`podcat`,`name`) VALUES ("", "$podcat", "$name");"; $this->DB->execute($sql); ) funkcija deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Lokacija: ?component=($this->component)"); ) funkcija PHP_slashes($string,$type="add") ( if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists("addslashes")) ( return addslashes($string); ) else ( return mysql_real_escape_string($string); ) ) ) else if ($type == "slashes") ( return stripslashes($string); ) else ( die("greška u PHP_slashes (mixed,add | strip)"); ) ) )

Cijeli razred je napisan u roku od sat vremena i, naravno, ima nedostataka, ali sve se to može popraviti. Njegova upotreba je preporučljiva u obrazovne svrhe, iako usput, nakon što ga malo dovršite, možete ga ugraditi u bilo koji sustav i uživati ​​u njegovom radu)).

Bio bih vam zahvalan ako u komentarima ponudite vlastite opcije za rješavanje ovog problema - organiziranje kategorija beskonačne razine gniježđenja.