Bezużyteczna kategoria php. Klasa PHP do wygodnej i bezpiecznej pracy z MySQL. Dowiedz się więcej o wpisywanych symbolach zastępczych

Dzisiaj naszym celem jest stworzenie hierarchicznej struktury kategorii. Ważne jest dla nas, aby kategorie były wygodne do przechowywania i aby można je było łatwo wyświetlać tam, gdzie ich potrzebujemy.

Czasami proste wydaje się skomplikowane, dlatego przedstawię kilka fragmentów kodu, które, mam nadzieję, będą przydatne do implementacji kategorii php w postaci drzewa.

Tak więc struktura powinna składać się z identyfikatora kategorii (id), nazwy kategorii (name) i oczywiście identyfikatora kategorii nadrzędnej (parent_id). W MySQL wygląda to tak:

UTWÓRZ TABELĘ, JEŚLI NIE ISTNIEJE `kategoria` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`)) SILNIK =DOMYŚLNY ZESTAW ZNAKÓWInnoDB=utf8 AUTO_INCREMENT=0;

Minimalna i zrozumiała struktura tabeli do przechowywania kategorii.

WSTAW DO `kategorii` (`id`, `name`, `parent_id`) WARTOŚCI (1, „Telefony i tablety”, „0”), (2, „Samochody”, „0”), (3, „Samsung ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, " Karta Galaktyka 4”, „3”), (10, „Galaxy S6”, „3”);

Gdzie parent_id=0, ta kategoria nie ma kategorii nadrzędnej.

Tutaj wszystko jest jasne i proste. Przejdźmy teraz do wyszczególnienia kategorii. Jednak dla poprawnego wyjścia listy musimy najpierw pobrać całą listę kategorii php, a dopiero potem, używając rekurencji, uformować nasze drzewo. Poniższa funkcja służy do uzyskania tej listy:

Funkcja get_cat() ( // zapytanie do bazy danych $sql = "SELECT * FROM category"; $result = mysql_query($sql); if(!$result) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows ($wynik) != 0) ( //For($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; } }

// pobierz tablicę katalogową $result = get_cat();

Teraz potrzebujemy funkcji z rekurencją

Funkcja view_cat($arr,$parent_id = 0) ( //Warunki wyjścia rekurencji if(empty($arr[$parent_id])) ( return; ) echo "

    "; // przechodzenie przez tablicę i wyświetlanie for($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //rekurencja - sprawdza czy istnieją kategorie potomne view_cat($arr,$arr[$parent_id][$i]["id "]); echo "
  • "; ) Echo "
"; }

Teraz pozostaje tylko wyświetlić katalog na ekranie za pomocą funkcji rekurencyjnej

View_cat($wynik);

I ogólnie to wszystko. W ten sposób możemy otrzymać kompletne drzewo kategorii z nieskończoną liczbą podkategorii.

) Pokazałem ci przykład użycia wyrażeń regularnych do znalezienia określonych fragmentów kod źródłowy strony. Teraz nauczymy się, jak napisać je samodzielnie. Ta umiejętność pomoże ci pisać, usuwać tekst ze zbędnych fragmentów, wyszukiwać właściwe fragmenty w dużych ilościach tekstu i tak dalej.

Data publikacji: 20.10.2013

Kontynuujemy pisanie parsera statystyk odwiedzających na żywo. Jeśli ktoś właśnie do nas dołączył, to radzę zacząć od miejsca, w którym połączyliśmy się z serwisem bez autoryzacji. Tam nauczyliśmy się, jak pobierać treści z otwartych stron, które nie są chronione hasłem. Ale w rzeczywistości dostęp do większości witryn jest zamknięty, więc skrypt, który nie wie, jak się zalogować, jest bardzo mało użyteczny, jak rozumiesz. Ale nie martw się, naprawimy to teraz.

Data publikacji: 08.10.2013

Dzień dobry czytelnicy! Czas trochę poćwiczyć. Masz już wystarczającą wiedzę, aby zacząć pisać przydatne skrypty, które ułatwią Ci pracę. Jednym z nich może być parser. Co to jest, opisałem szczegółowo w swoim własnym, więc jeśli nie wiesz, radzę przeczytać. Krótko mówiąc, istotą parsera jest wyszukiwanie i izolowanie niezbędne informacje z dużego fragmentu tekstu. W przypadku Internetu jest to najczęściej wyciąganie wymaganych danych ze stron serwisów. W naszym przypadku będzie to Liveinternet. Więc chodźmy!

Data publikacji: 03.10.2013

Ten artykuł skupi się na tak potężnym narzędziu jak cURL, a także na bibliotece php, która zapewnia dostęp do tego narzędzia - libcurl. Po co to wszystko? Aby komunikować się z serwerem za pośrednictwem protokołów przesyłania danych, takich jak http lub ftp. Reszta protokołów nie jest dla nas szczególnie interesująca, jeśli ktoś chce zagłębić się w ten temat, to będzie musiał pogrzebać w anglojęzycznych zasobach, a ten artykuł będzie zawierał podstawy i przykłady użycia.

Data publikacji: 24.11.2012

Data publikacji: 05.11.2012

A teraz będzie dość duża, ale nie skomplikowana lekcja na temat pracy z plikami w php. Po pierwsze, do czego służą pliki? W końcu możesz przechowywać wszystko w bazie danych Dane MySQL lub PostgreSQL lub cokolwiek innego. Ale czasami zdarzają się takie zadania, gdy korzystanie z bazy danych, przy całym przetwarzaniu i trosce o bezpieczeństwo połączenia, nie jest wskazane. Na przykład musisz zrobić zwykły licznik, a wcześniej nie używaliśmy bazy danych w naszym projekcie. Po co więc dla jednego malutkiego licznika uruchamiać bazę danych i przechowywać w niej tylko kilka wierszy? znacznie łatwiej jest używać plików. Poza tym czasami hosting w ogóle nie obsługuje baz danych, wtedy pliki na ogół pozostają jedynym wyjściem.

Data publikacji: 04.11.2012

Za każdym razem, gdy zezwalasz użytkownikom na przesyłanie tekstu do Twojej witryny (nazwiska lub innych informacji), musisz zachować ostrożność. Musisz mieć pewność, że nie masz luk w zabezpieczeniach w witrynie, które atakujący mogą wykorzystać do włamania. Jeśli nadal potrzebujesz otrzymywać dane od użytkownika, pamiętaj o użyciu funkcji htmlentities, aby zapobiec uruchamianiu kodu HTML lub skryptów, które mogą być szkodliwe i niebezpieczne!

Data publikacji: 04.11.2012

W tej lekcji przyjrzymy się technikom przekazywania danych między formularzami i stronami. Te metody to POST i GET. Porozmawiamy o każdym osobno i bardziej szczegółowo. Ogólnie rzecz biorąc, jest to niezbędne do komunikacji między formularzami. Na przykład wypełniamy niektóre pola na stronie i musimy przenieść je na inną stronę w celu przetworzenia.

Data publikacji: 03.11.2012

W rzeczywistości, jak można się już domyślić, pętla do while jest nieco zmodyfikowaną wersją pętli while, którą widzieliśmy w poprzednich samouczkach. Jeśli pamiętasz, jak działa zwykła pętla while, łatwiej będzie ci zrozumieć nową pętlę. Powtórzmy: ciało pętli while jest wykonywane, jeśli warunek jest prawdziwy i nie jest wykonywane, jeśli nie jest prawdziwy, ale może nie zostać wykonane ani razu, jeśli warunek jest fałszywy od samego początku. Jak się sprawuje podczas pracy?

Data publikacji: 03.11.2012

Wyobraź sobie, że masz tablicę asocjacyjną, którą chcesz iterować. PHP zapewnia łatwy sposób użycia każdego elementu tablicy po kolei za pomocą konstrukcji Foreach.

Zwraca tablicę obiektów zawierających informacje o kategorii.

Parametry przekazywane do tej funkcji są bardzo podobne do parametrów przekazywanych do funkcji wp_list_categories() i mogą być przekazywane jako tablica lub ciąg zapytania: type=post&order=DESC .

✈ 1 raz = 0,005625 s = Tak wolno| 50000 razy = 11,98 s = powoli| PHP 7.1.11, WP 4.9.5

Stosowanie

$kategorie = get_categories($args);

Wzór użycia

$categories = get_categories(array("taxonomy" => "category", "type" => "post", "child_of" => 0, "parent" => "", "orderby" => "name", " order" => "ASC", "hide_empty" => 1, "hierarchical" => 1, "exclude" => "", "include" => "", "number" => 0, "pad_counts" => FAŁSZ, // pełna lista parametry, patrz opis funkcji http://wp-kama.ru/function/get_terms)); if($categories)( foreach($categories as $cat)( // Dane w obiekcie $cat // $cat->term_id // $cat->name (Kategoria 1) // $cat->slug (rubrika - 1) // $cat->term_group (0) // $cat->term_taxonomy_id (4) // $cat->taksonomia (kategoria) // $cat->description (Tekst opisu) // $cat-> rodzic (0) // $kot->liczba (14) // $kot->identyfikator_obiektu (2743) // $kot->identyfikator_kota (4) // $kot->liczba_kategorii (14) // $kot-> category_description (Tekst opisu) // $cat->cat_name (Kategoria 1) // $cat->category_nicename (rubrika-1) // $cat->category_parent (0) ) ) taksonomia (linia) Nazwa taksonomii do przetworzenia. Dodane od wersji 3.0.
Domyślnie: „kategoria” typ (linia)
  • post - kategorie postów (domyślnie);
  • link - sekcje linków.
    Domyślnie: „post”
dziecko (linia) Pobierz kategorie podrzędne (w tym wszystkie poziomy zagnieżdżenia) określonej kategorii. Parametr określa identyfikator kategorii nadrzędnej (kategorii, której zagnieżdżone kategorie mają być wyświetlane). rodzic (numer) Pobiera kategorie, których kategoria nadrzędna jest równa określonemu parametrowi identyfikatora. Różnica w stosunku do child_of polega na tym, że zostanie pokazany jeden poziom zagnieżdżenia.
Domyślny: "" Zamów przez (linia)

Sortowanie otrzymanych danych według określonych kryteriów. Na przykład według liczby postów w każdej kategorii lub według nazwy kategorii. Dostępne są następujące kryteria:

  • ID - sortowanie po ID;
  • nazwa - sortuj po nazwie (domyślnie);
  • ślimak - sortowanie według alt. imię (ślimak);
  • count - według liczby wpisów w kategorii;
  • term_group - według grupy.

Domyślnie: „nazwa”

Zamówienie (linia)

Kierunek sortowania określony w parametrze „orderby”:

  • ASC - w kolejności od najmniejszej do największej (1, 2, 3; a, b, c);
  • DESC - w odwrotnej kolejności, od największego do najmniejszego (3, 2, 1; c, b, a).

Domyślnie: „ASC”

Ukryj_pusty (logiczny)

Czy otrzymywać puste kategorie (bez wpisów):

  • 1 (prawda) - nie otrzymuj pustych,
  • 0 (fałsz) - opróżnij.

Wartość domyślna: prawda

Hierarchiczny (logiczny) Jeśli parametr jest ustawiony na PRAWDA, wynik będzie zawierał puste kategorie podrzędne, których kategorie podrzędne mają wpisy (niepuste).
Wartość domyślna: prawda wykluczać (ciąg znaków/tablica) Wyklucz wszystkie kategorie z listy. Musisz określić identyfikatory kategorii oddzielone przecinkami lub w tablicy. Jeśli ten parametr jest określony, parametr child_of zostanie zastąpiony.
Domyślny: "" włączać (ciąg znaków/tablica) Podaj tylko określone kategorie. Musisz określić identyfikatory kategorii oddzielone przecinkami lub w tablicy.
Domyślny: "" numer (numer) Limit. Liczba kategorii do pobrania. Domyślnie brak ograniczeń - zostaną pobrane wszystkie kategorie. liczby padów (logiczny) Jeśli to prawda, to liczba, która pokazuje liczbę wpisów w kategoriach nadrzędnych, będzie sumą wpisów własnych i wpisów z kategorii podrzędnych.
Domyślnie: fałsz

Przykłady

# 1 Lista rozwijana

Aby utworzyć rozwijaną listę kategorii, możemy użyć innej specjalnej funkcji wp_dropdown_categories() :

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

jednak przy takim podejściu stracimy trochę elastyczności w tworzeniu listy, ponieważ otrzymamy w pełni uformowaną listę.

Dlatego w niektórych przypadkach bardziej logiczne będzie utworzenie listy rozwijanej za pomocą funkcji get_categories(). Oto przykład (zakładając, że chcemy wyświetlić podkategorie (dzieci) kategorii 10):

#2 Lista kategorii i ich opis

Ten przykład pokaże nam jak wylistować linki do kategorii, gdzie zaraz po każdym linku pojawi się opis kategorii (określany przy tworzeniu/edycji kategorii):

"nazwa", "zamówienie" => "ASC")); foreach($kategorie jako $kategoria)( echo "

Kategoria: term_id) . ""tytuł="" . sprintf(__("Wyświetl wszystkie posty w %s"), $category->name) . "" " . ">" . $kategoria->nazwa."

"; Echo "

Opis:". $kategoria->opis . "

"; Echo "

Liczba postów: ". $category->count . "

"; } ?>

Notatki

  • Zobacz: get_terms() Typ argumentów, które można zmienić.

Lista zmian

Od wersji 2.1.0 wprowadzony.

Kod pobierz kategorie: wp-includes/category.php WP 5.3.2

"Kategoria"); $args = wp_parse_args($args, $domyślne); /** * Filtruje taksonomię używaną do pobierania terminów podczas wywoływania metody get_categories(). * * @since 2.7.0 * * @param string $taksonomia Taksonomia, z której pobierane są terminy. * @param tablica $args Tablica argumentów. Zobacz get_terms(). */ $args["taksonomia"] = apply_filters("get_categories_taxonomy", $args["taksonomia"], $args); // Kompatybilność wsteczna if (isset($args["type"]) && "link" == $args["type"]) ( _deprecated_argument(__FUNCTION__, "3.0.0", sprintf(/* translators: 1: " type => link", 2: "taxonomy => link_category" */ __("%1$s jest przestarzałe. Zamiast tego użyj %2$s."), " wpisz => łącze", "taksonomia => kategoria_linków")); $args["taksonomia"] = "link_category"; ) $categories = get_terms($args); if (is_wp_error($categories)) ( $categories = array(); ) else ( $categories = (tablica ) $kategorie; foreach (array_keys($categories) as $k) ( _make_cat_compat($categories[ $k ]); ) ) return $categories; )

W tym artykule (poziom webmastera - zaawansowany) porozmawiamy o przecinających się na różne sposoby tzw. fasetowa nawigacja. Dla ułatwienia przyswojenia materiału polecam zapoznać się z artykułem w Wikipedii "Facet klasyfikacji" oraz publikacjami w języku angielskim (ale z obrazkami!) "Zaprojektuj lepszą nawigację fasetową dla Twoich stron internetowych".

Aspektowa nawigacja filtrowana według koloru lub przedziału cenowego może być przydatna dla odwiedzających, ale często szkodzi wyszukiwaniu, tworząc wiele kombinacji adresów ze zduplikowanymi treściami. Ze względu na duplikaty wyszukiwarki nie będą mogły szybko zaindeksować witryny w poszukiwaniu aktualizacji treści, co odpowiednio wpłynie na indeksowanie. Aby zminimalizować ten problem i pomóc webmasterom uczynić nawigację fasetową przyjazną dla wyszukiwania, chcielibyśmy:

Idealny dla użytkowników i wyszukiwarki Google

Wyczyść ścieżkę do stron produktów/artykułów:

Reprezentujący adres URL strony kategorii:
http://www.example.com/category.php?category=żelki-cukierki

Reprezentujący adres URL konkretnego produktu:
http://www.example.com/product.php?item=szwedzka-ryba

Niechciane duplikaty spowodowane nawigacją fasetową

Ta sama strona jest dostępna z różnych adresów internetowych:

Strona kanoniczna



Adres URL: przyklad.com/produkt.php? item=szwedzka ryba

Zduplikowana strona



URL:przyklad.com/produkt.php? item=szwedzka-ryba&category=żelki-cukierki&price=5-10


kategoria=żelki-cukierki&smak=kwaśny&cena=5-10

Błędy:

  • Dla Google nie ma to sensu, ponieważ użytkownicy rzadko wyszukują hasło [marmolada za 9:55 USD].
  • Nie ma sensu, aby roboty indeksujące znajdowały ten sam produkt („sałatka owocowa”) na stronach kategorii nadrzędnych (albo „Gummi”, albo „Kwaśne żelki”).
  • Negatywny punkt dla właściciela witryny, ponieważ żądania indeksowania są rozproszone wieloma wersjami tej samej kategorii.
  • Negatywny punkt dla właściciela witryny, ponieważ jest to bezużyteczne i niepotrzebne obciążenie przepustowości witryny
Puste strony:


Adres URL: przyklad.com/kategoria.php? category=żelki-cukierki&taste=kwaśne&cena=powyżej 10

Błędy:

  • Błędnie podany kod dla wyszukiwarek (w tym przypadku strona powinna podać kod 404)
  • Pusta strona dla użytkowników


Najgorsze (przyjazne dla wyszukiwania) rozwiązania nawigacji fasetowej

Przykład 1: W adresie URL używane są niestandardowe parametry: przecinki i nawiasy zamiast klucz=wartość&:

  • przyklad.com/kategoria? [ kategoria:żelki-cukierki ][sort:cena-od najniższej do wysokiej ][ sid:789 ]
  • example.com/category?category , żelki-cukierki , sortowanie , od najniższej do wysokiej , sid , 789
Jak:
przyklad.com/kategoria? category=żelki-cukierki&sort=od niskiej do wysokiej&sid=789

Przykład nr 2: Używanie katalogów lub ścieżek plików zamiast opcji na listach wartości, które nie zmieniają zawartości strony:
example.com/c123/s789/product?szwedzka-ryba
(gdzie /c123/ to kategoria, /s789/ to identyfikator sesji, który nie zmienia zawartości strony)

Dobra decyzja:

  • example.com /żelki-cukierki/ product?item=szwedzka ryba&sid=789(katalog /gummy-candy/ w znaczący sposób zmienia zawartość strony)
Najlepsza decyzja:
  • example.com/product?item=szwedzka-ryba& category=Gummy-cukierki&sid=789 (Parametry adresów URL zapewniają wyszukiwarkom większą elastyczność w określaniu sposobu efektywnego indeksowania)
Robotom indeksującym trudno jest odróżnić użyteczne wartości (np. „gummy-candy”) od wartości bezużytecznych (np. „SESSIONID”), gdy wartości te są umieszczone bezpośrednio w ścieżce linku. Z drugiej strony parametry adresu URL zapewniają wyszukiwarkom elastyczność szybkiego sprawdzania i określania, kiedy dana wartość nie wymaga dostępu robota do wszystkich odmian.

Typowe wartości, które nie zmieniają zawartości strony i powinny być wymienione jako parametry adresu URL to:

  • Identyfikator sesji
  • Śledzenie tożsamości
  • Identyfikatory odsyłaczy
  • znaczniki czasu
Przykład nr 3: Konwertuj wartości generowane przez użytkowników (prawdopodobnie nieskończone) na parametry adresów URL, które można przeszukiwać i indeksować, ale bezużyteczne w wyszukiwaniu.
Wykorzystywanie drugorzędnych danych generowanych przez użytkowników witryny (takich jak długość/szerokość geograficzna lub „dni temu”) w przeszukiwanych i indeksowanych adresach URL:
  • example.com/znajdź-lekarza? promień=15&szerokość geograficzna=40,7565068&długość geograficzna=-73,9668408
  • example.com/article?category=zdrowie& dni temu=7
Jak:
  • example.com/znajdź-lekarza? miasto=san-francisco&sąsiedztwo=soma
  • example.com/articles?category=zdrowie& data=styczeń-10-2014
Zamiast pozwalać użytkownikowi generować wartości w celu generowania indeksowanych adresów URL (skutkujących nieskończonymi możliwościami o bardzo małej wartości dla odwiedzających), lepiej opublikować kategorię strony dla najpopularniejszych wartości i można dołączyć dodatkowe informacje, aby strona była bardziej wartościowa niż zwykła strona wyszukiwania z wynikami. Alternatywnie możesz rozważyć umieszczenie wartości generowanych przez użytkowników w osobnym katalogu, a następnie użycie pliku robots.txt do wyłączenia indeksowania z tego katalogu.
  • przyklad.com /filtracja/ znajdź lekarza?radius=15&latitude=40.7565068&longitude=-73.9668408
  • przyklad.com /filtracja/ artykuły?category=health&days-ago=7
A w pliku robots.txt:
Agent użytkownika: *
Uniemożliwić: /filtracja/

Przykład nr 4. Dodawanie parametrów adresu URL bez logiki.

  • przyklad.com /żelki-cukierki/lizaki/żelki-cukierki/żelki-cukierki/produkt?szwedzka-ryba
  • przyklad.com/produkt? kot=żelki-cukierki&kot=lizaki&kot=żelki-cukierki&cat=żelek-cukierek&item=szwedzka-ryba
Dobra decyzja:
  • example.com /żelki-cukierki/ product?item=szwedzka-ryba
Najlepsza decyzja:
  • przyklad.com/produkt? item=szwedzka-ryba&category=żelki-cukierki
Nieistotne parametry adresów URL tylko zwiększają liczbę duplikatów, w wyniku czego witryna jest mniej wydajnie przeszukiwana i indeksowana. Dlatego konieczne jest pozbycie się zbędnych parametrów adresu URL i okresowe czyszczenie niepotrzebnych linków przed wygenerowaniem nowych adresów URL. Jeśli do sesji użytkownika potrzebnych jest wiele parametrów, możliwe jest ukrycie informacji w plikach cookie, zamiast ciągłego dodawania wartości, np kot=żelek-cukierek&kot=lizaki&kot=żelek-cukierek& ...

Przykład nr 5: Zasugeruj dalsze uściślenia (filtrowanie), gdy wyniki są zerowe.

Źle:
Zezwalaj użytkownikom na wybieranie filtrów, gdy istnieją puste elementy do doprecyzowania.


Zawężenie do strony z zerowymi wynikami (na przykład cena=ponad-10), co frustruje użytkowników i powoduje niepotrzebne zapytania dla wyszukiwarek.

Jak:
Twórz łącza tylko wtedy, gdy istnieją elementy do wybrania przez użytkownika. Jeśli wynik wynosi zero, oznacz link jako „szary” (tj. nieklikalny). Aby jeszcze bardziej poprawić użyteczność, rozważ umieszczenie wskaźnika liczby elementów obok każdego filtra.


Wyświetlanie strony z zerowymi wynikami (np. cena=powyżej 10) jest niedozwolone, ponadto zabrania się użytkownikom wykonywania zbędnych kliknięć, a wyszukiwarkom indeksowania tej nieprzydatnej strony.

Konieczne jest zapobieganie niepotrzebnym adresom URL i minimalizowanie miejsca dla odwiedzających poprzez generowanie adresów URL tylko wtedy, gdy produkty są dostępne. Pomoże to utrzymać zaangażowanie użytkowników w Twojej witrynie (mniej kliknięć przycisku Wstecz, gdy nie zostanie znaleziony żaden produkt), zmniejszyć liczbę możliwych adresów URL znanych wyszukiwarkom. Ponadto, jeśli strona jest nie tylko „chwilowo niedostępna”, ale jest mało prawdopodobne, aby kiedykolwiek zawierała istotne informacje, rozważ nadanie jej kodu odpowiedzi 404. Na stronie 404 możesz zaprojektować użyteczną wiadomość dla użytkowników z większą liczbą opcji nawigacji lub polem wyszukiwania, aby użytkownicy mogli znaleźć powiązane produkty.

W przypadku nowych witryn, których webmasterzy rozważają wdrożenie nawigacji aspektowej, istnieje kilka opcji optymalizacji indeksowania (zbiór adresów w Twojej witrynie znanych Googlebotowi) unikalnych stron z treścią i ograniczenia indeksowania zduplikowanych stron w wyszukiwarkach (konsolidacja sygnałów indeksowania).

Określ, jakie parametry adresu URL są wymagane, aby wyszukiwarki indeksowały poszczególne strony z treścią (tj. określ, jakie parametry są wymagane do utworzenia co najmniej jednej ścieżki kliknięcia do każdego elementu). Wymagane parametry mogą obejmować id-pozycji , id-kategorii , stronę itp.

Określ, które parametry będą przydatne dla odwiedzających z ich zapytaniami, a które z większym prawdopodobieństwem spowodują duplikowanie podczas przeszukiwania i indeksowania. W przykładzie słodyczy (marmolady) parametr adresu URL „smak” może być wartościowy dla użytkowników z zapytaniami w przykładzie smak = kwaśny . Logiczne jest jednak uznanie parametru „cena” za powodujący niepotrzebne powielanie kategoria=żelki-cukierki&smak=kwaśny& cena=powyżej 10 . Inne typowe przykłady:

  • Wartościowe parametry dla wyszukiwarek: item-id , category-id , name , brand ...
  • Zbędne parametry: session-id , price-range ...
Rozważ wdrożenie jednej z kilku opcji konfiguracji dla adresów URL, które zawierają niepotrzebne parametry. Upewnij się tylko, że „niepotrzebne” parametry adresu URL nie są naprawdę wymagane do indeksowania przez roboty lub do znalezienia przez użytkownika poszczególnych produktów!

Opcja 1: i linki wewnętrzne

Oznacz wszystkie niepotrzebne adresy URL rozszerzeniem . Zmniejszy to koszty pracy robota wyszukującego i zapobiegnie spadkowi częstotliwości skanowania. Musisz globalnie zarządzać indeksowaniem pliku robots.txt (uwaga tłumacza: patrz artykuł „”).
Użyj atrybutu rel="canonical", aby oddzielić strony indeksu wyszukiwania od stron, które nie są tam potrzebne (na przykład na stronie cena=5-10 możesz wpisać atrybut rel="canonical", wskazujący kategorię wszystkich marmolady kwaśnej example.com/category.php?category=żelki-cukierki&smak=kwaśny& strona=wszystko ).

Opcja 2: Robots.txt i Disallow

Adresy URL ze zbędnymi parametrami są umieszczane w katalogu /filtering/, który zostanie zamknięty w pliku robots.txt (zakaz zabronienia). Umożliwi to wszystkim wyszukiwarkom przeszukiwanie tylko „poprawnych” linków wewnętrznych (treści) witryny, ale jednocześnie zablokuje indeksowanie niechcianych adresów URL. Na przykład ( example.com/category.php?category=żelki-cukierki), jeśli wartościowymi parametrami były pozycja, kategoria i smak, a identyfikator sesji i cena byłyby zbędne, to adres URL smaku wyglądałby następująco:
example.com/category.php?category=żelki-cukierki& smak = kwaśny, ale wszystkie zbędne parametry, takie jak cena, adres URL będzie zawierał w predefiniowanym katalogu - /filtrowanie/:
przyklad.com /filtracja/ category.php?category=żelki-cukierki&price=5-10,
które następnie zostaną zbanowane przez plik robots.txt:
Agent użytkownika: *
Nie zezwalaj: /filtrowanie/

Opcja 3: Oddzielne hosty

Upewnij się, że najlepsze rozwiązania wymienione powyżej (na przykład w przypadku adresów-śmieci) nadal obowiązują. W przeciwnym razie wyszukiwarki utworzyły już dużą masę linków w indeksie. Tym samym Twoja praca będzie miała na celu ograniczenie dalszego przyrostu niepotrzebnych stron przeglądanych przez Googlebota oraz konsolidację sygnałów indeksowania.

Użyj parametrów ze standardowym kodowaniem i formatem klucz=wartość.

Upewnij się, że wartości, które nie zmieniają zawartości strony, takie jak identyfikatory sesji, są zaimplementowane jako klucz=wartość, a nie katalogi.

Nie zezwalaj na kliknięcia i nie generuj adresów URL, gdy nie ma elementów do filtrowania.

Dodaj logikę do mapowania parametrów adresu URL: usuń niepotrzebne parametry, zamiast cały czas dodawać wartości (np. unikaj generowania takiego linku: example.com/product?cat=żelki-cukierki&kot=lizaki &cat=żelki-cukierki&item=szwedzka-ryba).

Przechowuj wartościowe parametry w adresie URL, wymieniając je jako pierwsze (ponieważ adresy URL są widoczne w wynikach wyszukiwania), a mniej istotne parametry na końcu (takie jak identyfikator sesji).
Unikaj tej struktury linków: przyklad.com/kategoria.php? identyfikator-sesji=123&identyfikator-śledzenia=456&category=żelki-cukierki&taste=kwaśne
Dostosuj ustawienia adresów URL w Narzędziach dla webmasterów, jeśli dobrze wiesz, jak działają linki w Twojej witrynie.

Upewnij się, że używając JavaScript do dynamicznego zarządzania treścią (sortowanie/filtrowanie/ukrywanie) bez aktualizowania adresu URL, w Twojej witrynie znajdują się prawdziwe adresy internetowe, które mają wartość wyszukiwania, takie jak główne kategorie i strony produktów, które można przeszukiwać i indeksować . Staraj się nie używać tylko strony głównej (czyli jednego adresu URL) dla całej witryny, ale dynamicznie zmieniaj zawartość nawigacji za pomocą JavaScript - to niestety da użytkownikom tylko jeden adres URL w wyszukiwaniu. Upewnij się również, że wydajność nie wpływa negatywnie na filtrowanie dynamiczne, ponieważ uniemożliwi to użytkownikowi pracę z witryną.

Popraw indeksowanie różnych stron o tej samej treści, określając atrybut rel="canonical" w uprzywilejowanej wersji strony. Atrybut rel="canonical" może być używany w jednej lub kilku domenach.

Zoptymalizuj indeksowanie treści „podzielonych na strony” (np. page=1 i page=2 z kategorii „żelki cukierki”) przez (albo):

  • Dodaj atrybut rel="canonical" do serii stron określając kategorię kanoniczną z parametrem "view-all" (np. page=1, page=2 i page=3 z kategorii "żelki cukierki" z rel=” kanoniczny” na category=żelki-cukierki&page=all), upewniając się, że strona jest odpowiednia dla użytkowników i szybko się ładuje.
  • Użyj znaczników paginacji rel="next" i rel="prev" do wskazania relacji między poszczególnymi stronami (zobacz "Paginaton z rel="next" i rel="prev" ") .
W mapach witryn umieszczaj tylko linki kanoniczne.

I tak na początek opiszę z czym będziemy pracować i czego będziemy potrzebować.
System: PHP 5 i nowsze, mySQL 4 i nowsze
Klasy pomocnicze: dbsql.class.php (klasa bazy danych)
Zagnieżdżona klasa kategorii: classTreeCategory.php (bezpośrednio główna klasa, jej lista i objaśnienia są podane poniżej.

Utwórz tabelę w bazie danych o następującej strukturze:

Przeglądanie kodu MySQL

Ta tabela zawiera pole ID- numer seryjny kategorii, podkot- ma wartość zero dla kategorii pierwszego rzędu lub identyfikator kategorii nadrzędnej, nazwa- nazwa kategorii.

Przykład klasy wyświetlającej kategorie jako listę z podkategoriami:

Zobacz kod PHP

include("dbsql.class.php"); include("classTreeCategory.php" ); $DB = new DB_Engine("mysql", $settings ["dbHost"], $settings ["dbUser"], $settings ["dbPass"], $settings ["dbName"]); // łączymy się z bazą danych, podając dane dostępowe$kategoria = nowa kategoria drzewa ($DB); // przekazać do klasy category obiekt pracy z bazą danych$kategoria -> tabela = "kategoria" ; // nazwa tabeli w bazie danych z kategoriami$tablica = $kategoria -> getCategory() ; // pobierz wszystkie kategorie z bazy danych w postaci tablicy wielopoziomowej, posortowanej i zagnieżdżonej już w wymaganej kolejności$kategoria -> kategoria wyjściowa ($tablica, "opcja"); // przygotowanie wyjścia kategorii (formowanie HTML), przekazanie tablicy z kategoriami echo $kategoria -> html ; // wyświetla kategorie jako HTML

Jak widać z powyższego przykładu wszystko jest niezwykle proste, tworzymy nowy obiekt $category, ustawiamy z jaką tabelą bazy danych pracujemy: 'category', następnie dostajemy z tabeli listę wszystkich kategorii już sformatowaną jako tablica i zdekomponowane w porządku hierarchicznym, z uwzględnieniem wszystkich podkategorii. następnie przekazujemy tablicę do metody outCategory(), która generuje dla nas gotowy kod HTML, który pozostaje tylko do wyświetlenia w przeglądarce.

Metoda outCategory() jak widać przyjmuje dwa parametry @array i @string w pierwszym parametrze tablicę ze wszystkimi kategoriami, a w drugim string zawierający wartość opcja Lub tabela, ta wartość określa, jaki typ kodu HTML ma zostać wygenerowany.
Oznaczający opcja

Zobacz kod HTML

Aby wstawić podany kod HTML w wybrane pole dowolnego formularza.

Oznaczający tabela- generuje następujący kod HTML:

Zobacz kod HTML

Ten kod HTML jest wygodny do wklejenia do tabeli, która wyświetla wszystkie podkategorie naszych kategorii.

Klasa posiada również następujące metody:
usuń element($ id);- usuwa jedną kategorię, pomimo zagnieżdżonych
delCategory($tablica, $id);- usuwa kategorię ze wszystkimi zagnieżdżonymi podkategoriami, $array - tablica ze wszystkimi kategoriami przygotowanymi metodą $category->getCategory(), $id - numer kategorii do usunięcia
Dodaj Przedmiot();- tę metodę należy wywołać, jeśli chcemy dodać kategorię, natomiast ta metoda odczytuje wartości z danych przekazywanych metodą POST, tj. z tablicy $_POST.
$name=$this->PHP_slashes(strip_tags($_POST['nazwa'])); // Nazwa Kategorii
$podcat=intval($_POST['podcat']); // Identyfikator kategorii nadrzędnej, jeśli określono 0, kategoria będzie znajdować się w katalogu głównym.
aktualizuj element(); - podobnie jak poprzednia metoda, z tą różnicą, że ta metoda aktualizuje kategorię, jej nazwę i poziom zagnieżdżenia.

table="kategoria"; // żądanie wybrania listy kategorii, nazwa tabeli * $category->outCategory($category->getCategory()); // przygotuj wyjście kategorii (zażądaj tablicy kategorii) * echo $category->html; // wyświetl kategorie w nazwie HTML * */ /** * Zrzuć tabelę, nad którą pracujesz * * DROP TABLE IF EXISTS `category`; * CREATE TABLE `category` (* `id` int(11) NOT NULL auto_increment, * `podcat` int(11) NOT NULL, * `name` varchar(255) NOT NULL, * PRIMARY KEY (`id`), * KLUCZ `id` (`id`) *) ENGINE=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory ( /** * Ciąg zapytania do bazy danych */ var $table; /** * Interfejs bazy danych */ var $DB; /** * Tablica kategorii z zagnieżdżonymi podkategoriami */ var $arrayCat; / ** * Automatyczne zliczanie myślników przed nazwą kategorii podczas wyświetlania */ var $countPodcat; /** * Kod HTML do wyświetlania kategorii z podkategoriami */ var $html; /** * Pobierz interfejs do pracy z bazą danych i umieść go w zmiennej lokalnej */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Pobiera listę kategorii, sortuje i umieszcza w tablicy z zagnieżdżonymi tablicami itp. * @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"]] as $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; koniec; $str.="[($pozycja["podcat"])]"; $str.="[($pozycja["identyfikator"])]"; $str.="=$pozycja;"; ewal($str); foreach($ścieżka[$item["podcat"]] as $pitem): $path[$item["id"]]=$pitem; koniec; $path[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) koniec dla każdego; ) $this->arrayCat=$sort; return $this->arrayCat; ) /** * Drukuje kategorie, umieszcza gotowy kod HTML w $this->html * @param array Tablica z kategoriami i zagnieżdżonymi podkategoriami * @param string Typ wygenerowanego kodu HTML do wyświetlenia, opcji lub tabeli */ function outCategory(& $arrayCat, $type="option", $idSel=0) ( foreach($arrayCat as $sub) ( $this->countPodcat++; $this->outItem($sub, $type); if(!pusty($ sub["sub"]))$this->outCategory($sub["sub"], $type, $idSel); $this->countPodcat--; ) ) /** * Metoda pomocnicza do przygotowania kodu HTML * @param tablica Tablica z kategorią * @param string Typ generowanego kodu HTML do wyświetlenia, opcja lub tabela */ function outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="wybrano"; w przeciwnym razie $se=""; if($type=="option")$this->html.=" ($out) ($sub["nazwa"]) "; if($type=="table")$this->html.= ($out) ($sub["nazwa"]) HTML; ) funkcja 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="USUŃ Z ($this->table) WHERE id = "$id" LIMIT 1"; $this->DB->execute($sql); if (isset($sub["sub"])) $this->delCategory_process($sub["sub"]); ) ) ) delCategory_process (&$a_tree) ( foreach($a_tree as $sub) ( $sql="USUŃ Z ($this->table) WHERE id = "($sub["id"])" LIMIT 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) funkcja updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["nazwa"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="AKTUALIZACJA `( $this->table)` SET `name` = "($name)",`podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) funkcja addItem() ( $name=$this->PHP_slashes(strip_tags($_POST["nazwa"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="INSERT INTO `($this->table)` (`id`,`podcat`,`name`) WARTOŚCI ("", "$podcat" , "$nazwa");"; $this->DB->execute($sql); ) funkcja deleteItem($id) ( $id=intval($id); $sql="USUŃ Z `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Lokalizacja: ?component=($this->component)"); ) function PHP_slashes($string,$type="add") ( if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists („addslashes”)) ( return addlashes($ string); ) else ( return mysql_real_escape_string($ string); ) ) else if ($type == "strip") ( return stripslashes($string); ) else ( die("błąd w PHP_slashes (mixed,add | strip)"); ) ) )

Cała klasa została napisana w ciągu godziny i oczywiście ma wady, ale wszystko to można naprawić. Jego użycie jest wskazane do celów edukacyjnych, chociaż nawiasem mówiąc, po ukończeniu go trochę, możesz osadzić go w dowolnym systemie i cieszyć się jego pracą)).

Byłbym wdzięczny, gdybyś w komentarzach zaoferował własne opcje rozwiązania tego problemu - organizowanie kategorii o nieskończonym poziomie zagnieżdżenia.