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

Danas nam je cilj stvoriti hijerarhijsku strukturu kategorija. Važno nam je da je zgodno pohranjivati ​​kategorije i da ih je lako prikazati tamo gdje su nam potrebne.

Ponekad jednostavno izgleda komplikovano, 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 treba da se sastoji od id kategorije (id), naziva kategorije (ime) i naravno id nadređene kategorije (parent_id). U MySQL-u to izgleda ovako:

KREIRAJ TABELU AKO NE POSTOJI `kategorija` (`id` int(10) nepotpisan NOT NULL AUTO_INCREMENT, `ime` varchar(255) NOT NULL, `parent_id` int(11) NIJE NULL, PRIMARNI KLJUČ (`id`)) ENGINE =InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Minimalna i razumljiva struktura tabele za pohranjivanje kategorija.

UMETNI U `kategoriju` (`id`, `ime`, `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 idemo na navođenje kategorija. Ali za ispravan izlaz liste, prvo trebamo dobiti cijelu listu php kategorija, a tek onda pomoću rekurzije formirati naše stablo. Sljedeća funkcija je da dobijete ovu listu:

Funkcija get_cat() ( // upiti bazu podataka $sql = "SELECT * FROM kategorija"; $result = mysql_query($sql); if(!$result) ( vrati 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; } }

//dobijemo kataloški niz $result = get_cat();

Sada nam je potrebna funkcija sa rekurzijom

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

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

Sada ostaje samo prikazati direktorij na ekranu pomoću rekurzivne funkcije

View_cat($result);

I generalno, to je sve. Na ovaj način možemo dobiti kompletno stablo kategorija sa 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 će vam pomoći da pišete, čistite tekst od nepotrebnih fragmenata, tražite prave dijelove u velikim količinama teksta i tako dalje.

Datum objave: 20.10.2013

Nastavljamo da pišemo live internet analizu posjetitelja. Ako nam se neko tek pridružio, onda vam savjetujem da počnete od toga gdje smo se neovlašteno povezali na servis. Tamo smo naučili kako doći do sadržaja sa otvorenih stranica koje nisu zaštićene lozinkom. Ali, u stvari, pristup većini sajtova je zatvoren, tako da je vrlo malo koristi od skripte koja ne zna kako da se prijavi, kao što razumete. Ali ne brinite, sada ćemo to popraviti.

Datum objave: 08.10.2013

Dobar dan, čitaoci! Vrijeme je za malo vježbe. Već imate dovoljno znanja da počnete pisati korisne skripte koje će vam olakšati rad. Jedan od njih može biti parser. O čemu se radi, detaljno sam opisao u svom, pa ako ne znate, savjetujem vam da pročitate. Ukratko, suština parsera je da traži i izoluje potrebne informacije iz velikog komada teksta. U slučaju interneta, to je najčešće izvlačenje potrebnih podataka sa stranica sajtova. U našem slučaju, to će biti Liveinternet. Pa idemo!

Datum objave: 03.10.2013

Ovaj članak će se fokusirati na tako moćan alat kao što je cURL, kao i na php biblioteku koja omogućava pristup ovom alatu - libcurl. čemu sve ovo? Za komunikaciju sa serverom putem protokola za prijenos podataka, kao što su http ili ftp. Ostali protokoli nas ne zanimaju posebno, ako neko želi da se udubi u ovu temu, onda će morati da kopa resurse na engleskom jeziku, a ovaj članak će sadržati osnove i primere upotrebe.

Datum objave: 24.11.2012

Datum objave: 05.11.2012

A sada će biti prilično velika, ali ne i komplikovana lekcija o radu sa datotekama u php-u. Prije svega, čemu služe fajlovi? Uostalom, sve možete pohraniti u bazu podataka MySQL podaci ili PostgreSQL ili bilo šta drugo. Ali ponekad postoje takvi zadaci kada korištenje baze podataka, uz svu obradu i brigu o sigurnosti veze, nije preporučljivo. Na primjer, potrebno je napraviti običan brojač, a prije toga nismo koristili bazu podataka u našem projektu. Pa zašto bismo, zbog jednog malog brojača, pokrenuli bazu podataka i pohranili samo nekoliko redaka u nju? mnogo je lakše koristiti fajlove. 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 dozvolite svojim korisnicima da pošalju tekst na vašu web stranicu (ime ili bilo koju drugu informaciju), morate biti oprezni. Morate biti sigurni da nemate sigurnosnih rupa na web lokaciji koje napadači mogu koristiti za hakiranje. Ako i dalje trebate primati podatke od korisnika, obavezno koristite funkciju htmlentities kako biste spriječili pokretanje HTML koda ili skripti koji mogu biti štetni i opasni!

Datum objave: 04.11.2012

U ovoj lekciji ćemo pogledati tehnike prenošenja podataka između obrazaca i stranica. Ove metode su POST i GET. Govorit ćemo o svakom posebno i detaljnije. Uopšteno govoreći, neophodno je za komunikaciju između formi. Na primjer, popunimo neka polja na stranici i trebamo ih prenijeti na drugu stranicu radi obrade.

Datum objave: 03.11.2012

Zapravo, kao što ste do sada mogli pretpostaviti, do while petlja je malo izmijenjena verzija while petlje koju smo vidjeli u prethodnim tutorijalima. Ako se sjećate kako funkcionira regularni while, tada će vam biti 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 može izvršiti ni jednom ako je uvjet netačan od samog početka. Kako radite dok radite?

Datum objave: 03.11.2012

Zamislite da imate asocijativni niz preko kojeg želite iterirati. PHP pruža jednostavan način za korištenje svakog elementa niza naizmjence koristeći Foreach konstrukciju.

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

Parametri koji se prosljeđuju ovoj funkciji vrlo su slični parametrima koji se prosljeđuju 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.98s = polako| PHP 7.1.11, WP 4.9.5

Upotreba

$categories = get_categories($args);

Obrazac upotrebe

$categories = get_categories(array("taxonomy" => "kategorija", "type" => "post", "child_of" => 0, "roditelj" => "", "orderby" => "ime", " poredak" => "ASC", "hide_empty" => 1, "hijerarhijski" => 1, "isključi" => "", "include" => "", "broj" => 0, "pad_counts" => false, // puna lista parametre, pogledajte opis funkcije http://wp-kama.ru/function/get_terms)); if($categories)( foreach($categories kao $cat)( // Podaci u $cat objektu // $cat->term_id // $cat->name (Kategorija 1) // $cat->slug (rubrika - 1) // $cat->term_group (0) // $cat->term_taxonomy_id (4) // $cat->taksonomy (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 (linija) Naziv taksonomije za obradu. Dodano od verzije 3.0.
Zadano: "kategorija" tip (linija)
  • post - kategorije postova (podrazumevano);
  • link - sekcije linkova.
    Zadano: "post"
child_of (linija) Nabavite podređene kategorije (uključujući sve razine ugniježđenja) navedene kategorije. Parametar specificira 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 prikazan jedan nivo ugniježđenja.
Zadano: "" Poredak po (linija)

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

  • ID - sortiranje po ID-u;
  • ime - sortiraj po imenu (podrazumevano);
  • puž - sortiranje po alt. ime (puž);
  • count - po broju prijava u kategoriji;
  • termin_grupa - po grupi.

Zadano: "ime"

red (linija)

Smjer sortiranja naveden u parametru "orderby":

  • ASC - redom, od najmanjeg do najvećeg (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)

Da li dobiti prazne kategorije (bez unosa):

  • 1 (tačno) - ne primajte prazno,
  • 0 (netačno) - isprazni se.

Podrazumevano: istina

Hijerarhijski (logično) Ako je parametar postavljen na istinito, rezultat će uključiti prazne podređene kategorije čije podređene kategorije imaju unose (neprazne).
Podrazumevano: istina isključiti (niz/niz) Isključite sve kategorije sa liste. Morate navesti ID-ove kategorija odvojene zarezima ili u nizu. Ako je ovaj parametar specificiran, parametar child_of će biti poništen.
Zadano: "" uključiti (niz/niz) Navedite samo navedene kategorije. Morate navesti ID-ove kategorija odvojene zarezima ili u nizu.
Zadano: "" broj (broj) Limit. Broj kategorija koje treba preuzeti. Podrazumevano, nema ograničenja - sve kategorije će biti preuzete. pad_counts (logično) Ako je tačno, tada će broj koji pokazuje broj unosa u nadređenim kategorijama biti zbir vlastitih unosa i unosa iz podređenih kategorija.
Podrazumevano: false

Primjeri

#1 Padajuća lista

Da bismo kreirali padajuću listu kategorija, možemo koristiti drugu specijalnu funkciju wp_dropdown_categories() :

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

međutim, ovim pristupom ćemo izgubiti određenu fleksibilnost u postavljanju liste, jer ćemo na kraju dobiti potpuno formiranu listu.

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

#2 Lista kategorija i njihov opis

Ovaj primjer će nam pokazati kako da navedemo linkove do kategorija, gdje će odmah nakon svake veze biti opis kategorije (naveden prilikom kreiranja/uređivanja kategorije):

"name", "order" => "ASC")); foreach($categories kao $category)( echo "

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

"; eho"

Opis:". $category->description . "

"; eho"

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

"; } ?>

Bilješke

  • Pogledajte: get_terms() Tip argumenata koji se mogu promijeniti.

Lista promjena

Od verzije 2.1.0 Uvedeno.

Šifra getcategories : wp-includes/category.php WP 5.3.2

"kategorija"); $args = wp_parse_args($args, $defaults); /** * Filtrira taksonomiju koja se koristi za dohvaćanje termina prilikom pozivanja get_categories(). * * @s obzirom na 2.7.0 * * @param string $taksonomija Taksonomija za dohvat pojmova. * @param array $args Niz argumenata. Pogledajte get_terms(). */ $args["taxonomy"] = apply_filters("get_categories_taxonomy", $args["taxonomy"], $args); // Back compat if (isset($args["type"]) && "link" == $args["type"]) ( _deprecated_argument(__FUNCTION__, "3.0.0", sprintf(/* prevodioci: 1: " type => link", 2: "taksonomija => link_category" */ __("%1$s je zastario. Koristite %2$s umjesto toga."), " tip => link", "taksonomija => kategorija_veze")); $args["taxonomy"] = "link_category"; ) $categories = get_terms($args); if (is_wp_error($categories)) ( $categories = array(); ) else ( $categories = (niz ) $categories; foreach (array_keys($categories) kao $k) ( _make_cat_compat($categories[ $k ]); ) ) return $categories; )

U ovom članku (nivo webmastera - napredni) govorit ćemo o, ukrštanju na različite načine, tzv. fasetirana navigacija. Da biste pojednostavili asimilaciju materijala, preporučujem da pogledate članak na Wikipediji "Klasifikacija aspekata" i publikacije na engleskom (ali sa slikama!) "Dizajn bolje fasetirane navigacije za vaše web stranice".

Fasetirana navigacija filtrirana prema boji ili rasponu cijena može biti korisna za vaše posjetitelje, ali često štetna za pretragu stvaranjem više kombinacija adresa s dupliranim sadržajem. Zbog duplikata, pretraživači neće moći brzo indeksirati stranicu radi ažuriranja sadržaja, što shodno tome utič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 pretragu

Jasan put do stranica sa proizvodima/člancima:

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

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

Neželjeni duplikati uzrokovani fasetiranom navigacijom

Istoj stranici se može pristupiti sa različitih web adresa:

Canonical page



URL: example.com/product.php? item=švedska-riba

Duplicirana stranica



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


kategorija=gumasti bomboni&ukus=kiselo&cijena=5-10

Greške:

  • Guglu nema smisla, jer korisnici rijetko pretražuju [$9:55 marmelada].
  • Nema smisla da pretraživači pronađu istu stavku ("voćna salata") na stranicama roditeljske kategorije (bilo "Gummi" ili "Sour Gummy").
  • Negativan poen za vlasnika sajta, jer su zahtevi za indeksiranje razvodnjeni sa više verzija iste kategorije.
  • Negativan poen za vlasnika stranice, jer je beskorisno i nepotrebno opterećenje propusnog opsega stranice
Prazne stranice:


URL: example.com/kategorija.php? kategorija=gumasti bomboni&ukus=kiselo&cijena=preko-10

Greške:

  • Pogrešno dat kod za pretraživače (u ovom slučaju stranica treba dati kod 404)
  • Prazna stranica za korisnike


Najgora (nepogodna 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: od niske do visoke ][ sid:789 ]
  • example.com/category?category , gumeni bomboni , sortiraj , lowtohigh , sid , 789
Kako:
primjer.com/kategorija? kategorija=gumasti bomboni&sort=nisko do visoko&sid=789

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

Dobra odluka:

  • example.com /gumi-bomboni/ product?item=swedish-fish&sid=789(direktorij, /gummy-candy/, mijenja sadržaj stranice na smislen način)
Najbolje rješenje:
  • example.com/product?item=švedska-riba& kategorija=gumasti bomboni&sid=789 (URL parametri daju veću fleksibilnost pretraživačima da odrede kako da indeksiraju efikasno)
Pokretačima je teško razlikovati korisne vrijednosti (npr. "gumasti bombon") od beskorisnih vrijednosti (npr. "SESSIONID") kada su te vrijednosti postavljene direktno u putanju veze. S druge strane, parametri URL-a pružaju fleksibilnost pretraživačima da brzo provjere i odrede kada data vrijednost ne zahtijeva pristup indeksiranju svim varijacijama.

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

  • ID sesije
  • ID praćenje
  • Identifikatori upućivača
  • Vremenske oznake
Primjer #3: Pretvorite vrijednosti koje generiraju korisnici (moguće beskonačne) u URL parametre koji se mogu indeksirati i indeksirati, ali beskorisni za pretraživanje.
Korištenje manjih podataka koje su generirali korisnici web-mjesta (kao što su geografska dužina/širina ili "prije dana") u indeksiranim i indeksiranim URL-ovima:
  • primjer.com/nađi-liječnika? radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com/article?category=zdravlje& dana-prije=7
Kako:
  • primjer.com/nađi-liječnika? city=san-francisco&neighborhood=soma
  • example.com/articles?category=zdravlje& datum=10.januar 2014
Umjesto da dopustite korisniku da generira vrijednosti za generiranje URL-ova koji se mogu indeksirati (što rezultira beskonačnim mogućnostima s vrlo malo vrijednosti za posjetitelje), bolje je objaviti kategoriju stranice za najpopularnije vrijednosti, a mogu se uključiti i dodatne informacije kako bi stranica bila bolja vrijednija od obične stranice za pretraživanje s rezultatima. Alternativno, možete razmisliti o postavljanju korisnički generiranih vrijednosti u poseban direktorij, a zatim pomoću robots.txt da onemogućite indeksiranje iz tog direktorija.
  • example.com /filtriranje/ find-a-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • example.com /filtriranje/ articles?category=zdravlje&days-ago=7
I u robots.txt:
Korisnički agent: *
Disallow: /filtriranje/

Primjer #4. Dodavanje URL parametara bez logike.

  • example.com /gummy-candy/lizalice/gummy-candy/ gumeni bomboni/proizvod? švedska-riba
  • primjer.com/proizvod? cat=gummy-candy&cat=lollipops&cat=gummy-candy&cat=gummy-candy&item=swedish-fish
Dobra odluka:
  • example.com /gumi-bomboni/ proizvod?item=švedska-riba
Najbolje rješenje:
  • primjer.com/proizvod? item=swedish-fish&category=gummy-bonbon
Dodatni parametri URL-a samo povećavaju dupliciranje, a kao rezultat toga, stranica je manje efikasno indeksirana i indeksirana. Stoga je potrebno riješiti se nepotrebnih parametara URL-a i povremeno čistiti neželjene 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, npr. cat=gummy-candy&cat=lizalice&cat=gummy-candy& ...

Primjer #5: Predložite daljnja preciziranja (filtriranje) kada postoje nulti rezultati.

Loše:
Dozvolite korisnicima da odaberu filtere kada postoje nulte stavke za preciziranje.


Prečišćavanje na stranicu sa nula rezultata (na primjer, cijena=preko-10), što frustrira korisnike i uzrokuje nepotrebne upite za tražilice.

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


Prikazivanje stranice sa nula rezultata (na primjer, cijena=preko-10) nije dozvoljeno, plus je zabranjeno korisnicima da vrše nepotrebne klikove, a pretraživačima da indeksiraju ovu nekorisnu stranicu.

Neophodno je spriječiti nepotrebne URL-ove i minimizirati prostor posjetitelja generiranjem URL-ova samo kada su proizvodi dostupni. Ovo će pomoći da korisnici ostanu angažirani na vašoj web-lokaciji (manje klikova na dugme za povratak kada se ne pronađe proizvod), smanjiti broj mogućih URL-ova poznatih pretraživačima. Također, ako stranica nije samo "privremeno van zalihe", već je malo vjerovatno da će ikada sadržavati relevantne informacije, razmislite o tome da joj date šifru odgovora 404. Na stranici 404 možete dizajnirati korisnu poruku za korisnike s više opcija za navigaciju ili okvirom za pretraživanje tako da korisnici mogu pronaći srodne proizvode.

Za nove web stranice čiji webmasteri razmišljaju o implementaciji fasetirane navigacije, postoji nekoliko opcija za optimizaciju indeksiranja (kolekcija adresa na vašoj web-lokaciji poznatih Googlebot-u) jedinstvenih stranica sa sadržajem i smanjenje indeksiranja duplikata stranica na pretraživačima (konsolidacija signala indeksiranja).

Odredite koji su parametri URL-a potrebni za pretraživače da indeksiraju svaku pojedinačnu stranicu sadržaja (tj. odredite koji su parametri potrebni za kreiranje najmanje jedne putanje klika do svake stavke). Obavezni parametri mogu uključivati ​​item-id , category-id , page itd.

Odredite koji će parametri biti korisni posjetiteljima sa njihovim upitima, a koji će vjerojatnije uzrokovati dupliranje u indeksiranju i indeksiranju. U primjeru slastičarstva (marmelade), parametar URL-a "ukus" mogao bi biti vrijedan korisnicima s upitima u primjeru ukus=kiselo . Međutim, logično je smatrati da parametar "cijena" uzrokuje nepotrebno dupliciranje kategorija=gumasti bomboni&ukus=kiselo& cijena=preko-10 . Drugi uobičajeni primjeri:

  • Vrijedni parametri za pretraživače: 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 pazite da "nepotrebni" URL parametri zaista nisu potrebni za indeksiranje od strane indeksa ili da korisnik pronađe svaki pojedinačni proizvod!

Opcija 1: i interne veze

Označite sve nepotrebne URL-ove sa . 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 prevodioca: pogledajte članak "").
Koristite atribut rel="canonical" da odvojite stranice 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 sve kisele marmelade example.com/category.php?category=gummy-bonbon&taste=kiselo& stranica=sve ).

Opcija 2: Robots.txt i Disallow

URL-ovi sa nepotrebnim parametrima su uključeni u /filtering/ direktorij, koji će biti zatvoren u robots.txt (zabrana nedozvoljena). Ovo će omogućiti svim pretraživačima da indeksiraju samo "ispravan" intralink (sadržaj) stranice, ali će blokirati indeksiranje neželjenih URL-ova odjednom. Na primjer ( example.com/category.php?category=gumasti bomboni), ako su vrijedni parametri stavka, kategorija i ukus, a id sesije i cijena suvišni, tada bi URL za ukus bio:
example.com/category.php?category=gumasti bomboni& ukus=kiselo, ali sve nepotrebne parametre, kao što je cijena, URL će uključiti u unaprijed definirani direktorij - /filtriranje/:
example.com /filtriranje/ category.php?category=gummy-candies&price=5-10,
koji će tada biti zabranjen putem robots.txt:
Korisnički agent: *
Zabraniti: /filtriranje/

Opcija 3: Odvojite hostove

Uvjerite se da najbolja rješenja navedena iznad (na primjer, za neželjene adrese) i dalje vrijede. Inače, pretraživači su već formirali veliku masu linkova u indeksu. Stoga će vaš rad biti usmjeren na smanjenje daljeg rasta nepotrebnih stranica koje pregleda Googlebot i konsolidaciju signala indeksiranja.

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

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

Ne dozvoljavajte klikove i nemojte generirati URL-ove kada nema elemenata za filtriranje.

Dodajte logiku u mapiranje parametara URL-a: uklonite nepotrebne parametre umjesto da dodajete vrijednosti cijelo vrijeme (npr. izbjegavajte generiranje veze poput ove: example.com/product?cat=gummy-candy&cat=lizalice &cat=gummy-candy&item=swedish-fish).

Pohranite vrijedne parametre u URL tako što ćete ih prvo navesti (jer su URL-ovi vidljivi u rezultatima pretraživanja), a manje relevantne parametre zadnji (kao što je ID sesije).
Izbjegavajte ovu strukturu veza: primjer.com/kategorija.php? session-id=123&tracking-id=456&category=gumasti bomboni&ukus=kiselo
Podesite postavke URL-a u Webmaster Tools-u ako imate jasno razumijevanje o tome 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šoj web lokaciji postoje stvarne web adrese koje imaju vrijednost za pretragu, 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 web stranicu, već dinamički mijenjajte sadržaj navigacije putem JavaScripta - to će, nažalost, korisnicima dati samo jedan URL u pretrazi. Također, uvjerite se da performanse ne utječu negativno na dinamičko filtriranje, jer će spriječiti korisnika da radi sa web lokacijom.

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

Optimizirajte indeksiranje "paginiranog" sadržaja (npr. stranica=1 i stranica=2 iz kategorije "gumastih bombona") pomoću (bilo jednog):

  • Dodajte atribut rel="canonical" nizu stranica navodeći kanonsku kategoriju sa parametrom "prikaži sve" (npr. page=1, page=2 i page=3 iz kategorije "gumasti bomboni" sa rel=” kanonski” na kategorija=gumasti bomboni&page=sve), osiguravajući da je stranica relevantna za korisnike i da se brzo učitava.
  • Koristite oznake paginacije rel="next" i rel="prev" da naznačite odnos između pojedinačnih stranica (pogledajte članak "Paginaton with rel="next" i rel="prev" ") .
Uključite samo kanonske veze u mape sajta.

I zato ću za početak opisati sa čime ćemo raditi i šta će nam trebati.
Sistem: PHP 5 i noviji, mySQL 4 i noviji
Časovi za pomoćnike: dbsql.class.php (klasa baze podataka)
Ugniježđena klasa kategorije: classTreeCategory.php (direktno glavna klasa, njen spisak i objašnjenja su dati ispod.

Kreirajte tabelu u bazi podataka sa sledećom strukturom:

Pregled MySQL koda

Ova tabela sadrži polje ID- redni broj kategorije, podcat- ima vrijednost nula za kategorije prvog reda ili ID nadređene kategorije, ime- naziv kategorije.

Primjer klase koja prikazuje kategorije kao listu sa potkategorijama:

Pogledajte PHP kod

include("dbsql.class.php") ; include("classTreeCategory.php" ) ; $DB = novi DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // spajanje na bazu podataka, specificiranje pristupnih podataka$category = nova TreeCategory ($DB) ; // prelazimo na klasu kategorije, objekt rada sa bazom podataka$category -> table = "kategorija" ; // ime tablice u bazi podataka sa kategorijama$array = $category -> getCategory() ; // dobijamo sve kategorije iz baze podataka u obliku niza na više nivoa, sortiranih i ugniježđenih već onim redoslijedom koji nam je potreban$category -> outCategory ($array, "option") ; // priprema izlaza kategorija (formiranje HTML), prosljeđivanje niza s kategorijama echo $category -> html ; // izlazne 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 tabele dobijamo listu svih kategorija koje su već formatirane kao niz i raščlanjeni po hijerarhijskom redu, uzimajući u obzir sve potkategorije. zatim prosljeđujemo niz metodi outCategory(), koja za nas generiše gotov HTML kod, koji ostaje samo da se prikaže u pretraživaču.

OutCategory() metoda, kao što vidimo, uzima dva parametra @array i @string u prvom parametru niz sa svim kategorijama, a u drugom niz koji sadrži vrijednost opcija ili sto, ova vrijednost specificira tip HTML koda za generiranje.
Značenje opcija

Pogledajte HTML kod

Da biste umetnuli dati HTML kod u polje za odabir bilo kojeg obrasca.

Značenje sto- 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đe ima sledeće metode:
deleteItem($id);- uklanja jednu kategoriju, uprkos ugniježđenim
delCategory($array, $id);- briše kategoriju sa svim ugniježđenim potkategorijama, $array - niz sa svim kategorijama pripremljenim metodom $category->getCategory(), $id - broj kategorije za brisanje
addItem();- ovu metodu treba pozvati ako želite da dodate kategoriju, dok ova metoda čita vrijednosti iz podataka prenesenih POST metodom, tj. iz niza $_POST.
$name=$this->PHP_slashes(strip_tags($_POST['name'])); // naziv kategorije
$podcat=intval($_POST['podcat']); // ID roditeljske kategorije, ako je specificirano 0, kategorija će biti u korijenu.
updateItem(); - slično prethodnoj metodi, osim što ova metoda ažurira kategoriju, njen naziv i nivo ugniježđenja.

table="kategorija"; // zahtjev za odabir liste kategorija, ime tablice * $category->outCategory($category->getCategory()); // pripremiti izlaz kategorije (zahtjev za niz kategorija) * echo $category->html; // prikaži kategorije u HTML nazivu * */ /** * Izbaci tablicu na kojoj se radi * * ISPUSTI TABELU AKO POSTOJI `kategorija`; * CREATE TABLE `category` (* `id` int(11) NOT NULL auto_increment, * `podcat` int(11) NOT NULL, * `name` varchar(255) NOT NULL, * PRIMARY KEY (`id`), * KEY `id` (`id`) *) ENGINE=MyISAM DEFAULT CHARSET=utf8; * */ klasa TreeCategory ( /** * niz upita baze podataka */ var $table; /** * Interfejs baze podataka */ var $DB; /** * Niz kategorija sa ugniježđenim potkategorijama */ var $arrayCat; / ** * Automatski broj crtica ispred naziva kategorije prilikom prikaza */ var $countPodcat; /** * HTML kod za prikaz kategorija sa potkategorijama */ var $html; /** * Dobijte interfejs za rad sa bazom podataka i stavi ga u lokalnu varijablu */ funkcija __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Dobiva listu kategorija, sortiranja i stavlja u niz sa ugniježđenim nizovima, itd. * @return kategorija polja */ funkcija getCategory () ( $all = $this->DB->getAll("SELECT * FROM `($this->table)` ORDER BY `id` ASC"); $path = array(); if(count($all)>0) ( foreach($all kao $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.="=$item;"; eval($str); foreach($path[$item["podcat"]] kao $pitem): $path[$item["id"]]=$pitem; endforeach; $path[$item["id"]]=$item["podcat"]; ) ostalo ( $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 niz Niz sa kategorijama i ugniježđenim potkategorijama * @param string Vrsta generiranog HTML koda za izlaz, opcija ili tabela */ funkcija outCategory(& $arrayCat, $type="option", $idSel=0) ( foreach($arrayCat kao $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 niz Niz sa kategorijom * @param string Vrsta generiranog HTML koda za izlaz, opcija ili tabela */ funkcija outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="odabrano"; else $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 kao $sub) (if($sub["id"]$id i isset($sub["sub"]))$this- >delCategory($sub["sub"],$id); if($sub["id"]==$id) ( $sql="IZBRIŠI IZ ($this->tabele) GDJE 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 kao $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="UPDATE `( $this->table)` SET `name` = "($name)",`podcat` = "($podcat)" GDJE `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`) VRIJEDNOSTI ("", "$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()) ( vrati $string; ) else ( if (function_exists("addslashes")) (vrati addslashes($string); ) else ( vrati mysql_real_escape_string($string); ) ) ) else if ($type == "strip") (vrati stripslashes($string); ) else ( die("greška u PHP_slashes (pomiješano,dodaj | traka)"); ) ))

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

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