Nutzlose Kategorie php. PHP-Klasse für komfortables und sicheres Arbeiten mit MySQL. Erfahren Sie mehr über typisierte Platzhalter

Heute ist es unser Ziel, eine hierarchische Struktur von Kategorien zu schaffen. Uns ist wichtig, dass Kategorien bequem gespeichert und einfach dort angezeigt werden können, wo wir sie brauchen.

Manchmal erscheint das Einfache kompliziert, deshalb lege ich ein paar Codeschnipsel an, von denen ich hoffe, dass sie Ihnen bei der Implementierung von PHP-Kategorien in Form eines Baums nützlich sein werden.

Die Struktur sollte also aus der Kategorie-ID (id), dem Kategorienamen (name) und natürlich der übergeordneten Kategorie-ID (parent_id) bestehen. In MySQL sieht das so aus:

CREATE TABLE IF NOT EXISTS `category` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE =InnoDB-STANDARDZEICHENSATZ=utf8 AUTO_INCREMENT=0 ;

Minimale und verständliche Tabellenstruktur zum Speichern von Kategorien.

INSERT INTO `category` (`id`, `name`, `parent_id`) WERTE (1, „Telefone und Tablets“, „0“), (2, „Autos“, „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");

Wenn parent_id=0, hat diese Kategorie keine übergeordnete Kategorie.

Hier ist alles klar und einfach. Kommen wir nun zur Auflistung der Kategorien. Aber für die korrekte Ausgabe der Liste müssen wir zuerst die gesamte Liste der PHP-Kategorien erhalten und erst dann unseren Baum rekursiv bilden. Die folgende Funktion dient zum Abrufen dieser Liste:

Funktion get_cat() ( // Abfrage der Datenbank $sql = "SELECT * FROM category"; $result = mysql_query($sql); if(!$result) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows ($Ergebnis) != 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; } }

//das Katalog-Array abrufen $result = get_cat();

Jetzt brauchen wir eine Funktion mit Rekursion

Funktion view_cat($arr,$parent_id = 0) ( //Rekursionsbedingungen if(empty($arr[$parent_id])) ( return; ) echo "

    "; // Durchlaufe das Array und zeige for($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //Rekursion - prüfen, ob untergeordnete Kategorien vorhanden sind view_cat($arr,$arr[$parent_id][$i]["id "] ); echo "
  • "; ) echo "
"; }

Jetzt muss nur noch das Verzeichnis mit der rekursiven Funktion auf dem Bildschirm angezeigt werden

View_cat($ergebnis);

Und im Allgemeinen ist das alles. Auf diese Weise können wir einen vollständigen Kategorienbaum mit unendlichen Unterkategorien erhalten.

) Ich habe Ihnen ein Beispiel für die Verwendung regulärer Ausdrücke gezeigt, um bestimmte Teile zu finden Quellcode Seiten. Jetzt lernen wir, wie man sie selbst schreibt. Diese Fähigkeit hilft Ihnen beim Schreiben, Text von unnötigen Fragmenten zu befreien, in großen Textmengen nach den richtigen Teilen zu suchen und so weiter.

Erscheinungsdatum: 20.10.2013

Wir schreiben weiterhin einen Parser für Live-Internet-Besucherstatistiken. Wenn sich gerade jemand bei uns angemeldet hat, dann rate ich Ihnen, damit zu beginnen, wo wir uns ohne Autorisierung mit dem Dienst verbunden haben. Dort haben wir gelernt, wie man Inhalte von geöffneten Seiten erhält, die nicht passwortgeschützt sind. Tatsächlich ist der Zugriff auf die meisten Sites jedoch gesperrt, sodass ein Skript, das nicht weiß, wie man sich anmeldet, wenig Sinn macht, wie Sie verstehen. Aber keine Sorge, wir werden es jetzt beheben.

Erscheinungsdatum: 08.10.2013

Guten Tag, Leser! Es ist Zeit, etwas Übung zu bekommen. Sie haben bereits genug Wissen, um nützliche Skripte zu schreiben, die Ihnen die Arbeit erleichtern. Einer davon kann ein Parser sein. Was es ist, habe ich in meinem eigenen ausführlich beschrieben. Wenn Sie es also nicht wissen, rate ich Ihnen, es zu lesen. Kurz gesagt besteht die Essenz des Parsers darin, zu suchen und zu isolieren notwendige Informationen aus einem großen Text. Im Fall des Internets zieht dies meistens die erforderlichen Daten von den Seiten der Sites heraus. In unserem Fall ist dies Liveinternet. So lass uns gehen!

Erscheinungsdatum: 10.03.2013

Dieser Artikel konzentriert sich auf ein so leistungsstarkes Tool wie cURL sowie auf eine PHP-Bibliothek, die den Zugriff auf dieses Tool ermöglicht – libcurl. Wozu das alles? Zur Kommunikation mit dem Server über Datenübertragungsprotokolle wie http oder ftp. Der Rest der Protokolle ist für uns nicht besonders interessant, wenn sich jemand mit diesem Thema vertiefen möchte, muss er englischsprachige Ressourcen ausgraben, und dieser Artikel enthält die Grundlagen und Anwendungsbeispiele.

Erscheinungsdatum: 24.11.2012

Erscheinungsdatum: 05.11.2012

Und jetzt gibt es eine ziemlich große, aber nicht komplizierte Lektion über die Arbeit mit Dateien in PHP. Zunächst einmal, wofür sind die Dateien? Schließlich können Sie alles in der Datenbank speichern MySQL-Daten oder PostgreSQL oder was auch immer. Aber manchmal gibt es solche Aufgaben, wenn die Verwendung der Datenbank mit all der Verarbeitung und Sorge um die Sicherheit der Verbindung nicht ratsam ist. Zum Beispiel müssen Sie einen regulären Zähler erstellen, und davor haben wir in unserem Projekt keine Datenbank verwendet. Warum sollten wir also wegen eines winzigen Zählers eine Datenbank starten und nur ein paar Zeilen darin speichern? Es ist viel einfacher, Dateien zu verwenden. Außerdem unterstützt das Hosting manchmal Datenbanken überhaupt nicht, dann bleiben Dateien im Allgemeinen der einzige Ausweg.

Erscheinungsdatum: 04.11.2012

Wenn Sie Ihren Benutzern erlauben, Text (Name oder andere Informationen) an Ihre Website zu senden, müssen Sie vorsichtig sein. Sie müssen sicher sein, dass Sie keine Sicherheitslücken auf der Website haben, die Angreifer zum Hacken verwenden können. Wenn Sie dennoch Daten vom Benutzer erhalten müssen, verwenden Sie unbedingt die htmlentities-Funktion, um zu verhindern, dass HTML-Code oder Skripts ausgeführt werden, die schädlich und gefährlich sein können!

Erscheinungsdatum: 04.11.2012

In dieser Lektion werden wir uns Techniken zum Übergeben von Daten zwischen Formularen und Seiten ansehen. Diese Methoden sind POST und GET. Wir werden über jedes einzeln und ausführlicher sprechen. Im Allgemeinen ist es für die Kommunikation zwischen Formularen erforderlich. Zum Beispiel füllen wir einige Felder auf der Seite aus und müssen sie zur Verarbeitung auf eine andere Seite übertragen.

Erscheinungsdatum: 03.11.2012

Wie Sie vielleicht schon erraten haben, ist die do while-Schleife eine leicht modifizierte Version der while-Schleife, die wir in früheren Tutorials gesehen haben. Wenn Sie sich daran erinnern, wie das normale while funktioniert, dann wird es Ihnen leichter fallen, die neue Schleife zu verstehen. Wiederholen wir: Der Körper der While-Schleife wird ausgeführt, wenn die Bedingung wahr ist, und nicht ausgeführt, wenn sie nicht wahr ist, aber sie kann nicht einmal ausgeführt werden, wenn die Bedingung von Anfang an falsch ist. Wie funktioniert do while?

Erscheinungsdatum: 03.11.2012

Stellen Sie sich vor, Sie haben ein assoziatives Array, über das Sie iterieren möchten. PHP bietet eine einfache Möglichkeit, jedes Element eines Arrays der Reihe nach mit dem Foreach-Konstrukt zu verwenden.

Gibt ein Array von Objekten mit Kategorieinformationen zurück.

Die an diese Funktion übergebenen Parameter sind den an die Funktion wp_list_categories() übergebenen Parametern sehr ähnlich und können entweder als Array oder als Abfragezeichenfolge übergeben werden: type=post&order=DESC .

✈ 1 Mal = 0,005625 s = So langsam| 50000 mal = 11,98s = langsam| PHP 7.1.11, WP 4.9.5

Verwendung

$kategorien = get_categories($args);

Nutzungsmuster

$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" => FALSCH, // volle Liste Parameter, siehe Beschreibung der Funktion http://wp-kama.ru/function/get_terms)); if($categories)( foreach($categories as $cat)( // Daten im $cat-Objekt // $cat->term_id // $cat->name (Kategorie 1) // $cat->slug (Rubrika - 1) // $cat->term_group (0) // $cat->term_taxonomy_id (4) // $cat->Taxonomy (Kategorie) // $cat->description (Beschreibungstext) // $cat-> parent (0) // $cat->count (14) // $cat->object_id (2743) // $cat->cat_ID (4) // $cat->category_count (14) // $cat-> category_description (Beschreibungstext) // $cat->cat_name (Kategorie 1) // $cat->category_nicename (rubrika-1) // $cat->category_parent (0) ) ) Taxonomie (Linie) Der Name der zu verarbeitenden Taxonomie. Seit Version 3.0 hinzugefügt.
Standard: "Kategorie" Art (Linie)
  • post - Beitragskategorien (Standard);
  • link - Abschnitte von Links.
    Standard: "posten"
Kind von (Linie) Untergeordnete Kategorien (einschließlich aller Verschachtelungsebenen) der angegebenen Kategorie abrufen. Der Parameter gibt die ID der übergeordneten Kategorie an (die Kategorie, deren verschachtelte Kategorien Sie anzeigen möchten). Elternteil (Anzahl) Ruft die Kategorien ab, deren übergeordnete Kategorie dem angegebenen ID-Parameter entspricht. Der Unterschied zu child_of besteht darin, dass eine Verschachtelungsebene angezeigt wird.
Default: "" Sortieren nach (Linie)

Sortieren der empfangenen Daten nach bestimmten Kriterien. Zum Beispiel nach der Anzahl der Beiträge in jeder Kategorie oder nach Kategorienamen. Folgende Kriterien stehen zur Verfügung:

  • ID - Sortierung nach ID;
  • name - nach Namen sortieren (Standard);
  • slug - Sortierung nach alt. Name (Schnecke);
  • count - nach der Anzahl der Einträge in der Kategorie;
  • term_group - nach Gruppe.

Standard: "Name"

Befehl (Linie)

Die im Parameter "orderby" angegebene Sortierrichtung:

  • ASC - in der Reihenfolge vom kleinsten zum größten (1, 2, 3; a, b, c);
  • DESC - in umgekehrter Reihenfolge, vom größten zum kleinsten (3, 2, 1; c, b, a).

Voreinstellung: "ASC"

Ausblenden_leer (logisch)

Ob leere Kategorien (keine Einträge) erhalten werden sollen oder nicht:

  • 1 (wahr) - nicht leer erhalten,
  • 0 (falsch) - leer werden.

Standard: wahr

Hierarchisch (logisch) Wenn der Parameter auf eingestellt ist Stimmt, enthält das Ergebnis leere untergeordnete Kategorien, deren untergeordnete Kategorien Einträge enthalten (nicht leer).
Standard: wahr ausschließen (String/Array) Schließen Sie alle Kategorien aus der Liste aus. Sie müssen Kategorie-IDs durch Kommas getrennt oder in einem Array angeben. Wenn dieser Parameter angegeben ist, wird der Parameter child_of überschrieben.
Default: "" enthalten (String/Array) Nur die angegebenen Kategorien auflisten. Sie müssen Kategorie-IDs durch Kommas getrennt oder in einem Array angeben.
Default: "" Anzahl (Anzahl) Grenze. Die Anzahl der abzurufenden Kategorien. Standardmäßig keine Einschränkungen – alle Kategorien werden abgerufen. pad_counts (logisch) Wenn wahr, dann ist die Zahl, die die Anzahl der Einträge in den übergeordneten Kategorien anzeigt, die Summe ihrer eigenen Einträge und Einträge aus untergeordneten Kategorien.
Standard: falsch

Beispiele

#1 Dropdown-Liste

Um eine Dropdown-Liste mit Kategorien zu erstellen, können wir eine weitere spezielle Funktion wp_dropdown_categories() verwenden:

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

Bei diesem Ansatz verlieren wir jedoch etwas Flexibilität beim Erstellen der Liste, da wir am Ende eine vollständig erstellte Liste erhalten.

Daher ist es in einigen Fällen logischer, eine Dropdown-Liste mit der Funktion zu erstellen get_categories(). Hier ist ein Beispiel (angenommen, wir möchten die Unterkategorien (Kinder) der Kategorie 10 anzeigen):

#2 Liste der Kategorien und deren Beschreibung

Dieses Beispiel zeigt uns, wie man Links zu Kategorien auflistet, wobei unmittelbar nach jedem Link eine Beschreibung der Kategorie erscheint (wird beim Erstellen / Bearbeiten einer Kategorie angegeben):

"Name", "Auftrag" => "ASC")); foreach($categories as $category)( echo "

Kategorie: term_id) . ""title="" . sprintf(__("Alle Beiträge in %s anzeigen"), $category->name) . "" " . ">" . $kategorie->name."

"; Echo"

Beschreibung:". $category->description . "

"; Echo"

Anzahl der Beiträge: ". $category->count . "

"; } ?>

Anmerkungen

  • Siehe: get_terms() Art der Argumente, die geändert werden können.

Liste der Änderungen

Seit Version 2.1.0 Eingeführt.

Der Code getcategories : wp-includes/category.php WP 5.3.2

"Kategorie"); $args = wp_parse_args($args, $defaults); /** * Filtert die Taxonomie, die zum Abrufen von Begriffen verwendet wird, wenn get_categories() aufgerufen wird. * * @seit 2.7.0 * * @param string $taxonomy Taxonomie, aus der Begriffe abgerufen werden. * @param array $args Ein Array von Argumenten. Siehe get_terms(). */ $args["Taxonomie"] = apply_filters("get_categories_taxonomy", $args["Taxonomy"], $args); // Rückwärtskompatibilität if (isset($args["type"]) && "link" == $args["type"]) ( _deprecated_argument(__FUNCTION__, "3.0.0", sprintf(/* translaters: 1: " type => link", 2: "taxonomy => link_category" */ __("%1$s ist veraltet. Verwenden Sie stattdessen %2$s."), " geben Sie => Link ein", "Taxonomie => link_category")); $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; )

In diesem Artikel (Webmaster-Level - Fortgeschrittene) werden wir auf unterschiedliche Weise über die sogenannten sprechen. Facettennavigation. Um die Aneignung des Materials zu vereinfachen, empfehle ich, den Wikipedia-Artikel „Facet-Klassifikation“ und Veröffentlichungen in englischer Sprache (aber mit Bildern!) „Design better faceted navigation for your websites“ durchzugehen.

Facettennavigation, gefiltert nach Farbe oder Preisspanne, kann für Ihre Besucher nützlich sein, ist aber oft nachteilig für die Suche, da mehrere Adresskombinationen mit doppeltem Inhalt erstellt werden. Aufgrund von Duplikaten können Suchmaschinen die Website nicht schnell nach Inhaltsaktualisierungen durchsuchen, was sich entsprechend auf die Indexierung auswirkt. Um dieses Problem zu minimieren und Webmastern dabei zu helfen, die facettierte Navigation suchfreundlich zu gestalten, möchten wir Folgendes tun:

Ideal für Benutzer und die Google-Suche

Eindeutiger Pfad zu Produkt-/Artikelseiten:

Stellt die URL für die Kategorieseite dar:
http://www.example.com/category.php?category=gummy-candies

Stellt eine URL für ein bestimmtes Produkt dar:
http://www.example.com/product.php?item=swedish-fish

Unerwünschte Duplikate durch facettierte Navigation

Auf dieselbe Seite kann von verschiedenen Webadressen aus zugegriffen werden:

Kanonische Seite



URL: example.com/produkt.php? item=schwedischer Fisch

Seite duplizieren



URL:beispiel.com/produkt.php? item=schwedischer-fisch&category=gummibonbons&preis=5-10


category=gummibonbons&taste=sauer&preis=5-10

Fehler:

  • Macht für Google keinen Sinn, da Nutzer selten nach [$9:55 Marmelade] suchen.
  • Es macht für Crawler keinen Sinn, denselben Artikel ("Obstsalat") auf übergeordneten Kategorieseiten zu finden (entweder "Gummi" oder "Sauergummi").
  • Ein negativer Punkt für den Websitebesitzer, da Indexanfragen mit mehreren Versionen derselben Kategorie verwässert werden.
  • Ein negativer Punkt für den Websitebesitzer, da die Bandbreite der Website nutzlos und unnötig belastet wird
Leere Seiten:


URL: example.com/category.php? category=gummibonbons&taste=sauer&preis=über-10

Fehler:

  • Falsch angegebener Code für Suchmaschinen (in diesem Fall sollte die Seite den Code 404 angeben)
  • Leere Seite für Benutzer


Schlechteste (nicht suchfreundliche) Lösungen für facettierte Navigation

Beispiel 1: In der URL werden nicht standardmäßige Parameter verwendet: Kommas und Klammern statt Schlüssel=Wert&:

  • example.com/category? [Kategorie:Gummibonbons] [Sortieren:Preis-niedrig-bis-hoch]][sid:789]
  • example.com/category?category , gummibonbons , sort , lowtohigh , sid , 789
Wie man:
example.com/category? category=gummibonbons&sort=low-to-high&sid=789

Beispiel #2: Verwenden von Verzeichnissen oder Dateipfaden anstelle von Optionen in Wertelisten, die den Inhalt der Seite nicht ändern:
example.com/c123/s789/product?swedish-fish
(wobei /c123/ die Kategorie ist, /s789/ die Sitzungs-ID, die den Inhalt der Seite nicht ändert)

Gute Entscheidung:

  • example.com /gummibonbons/ product?item=schwedischer-fisch&sid=789(das Verzeichnis /gummy-candy/ verändert den Inhalt der Seite sinnvoll)
Die beste Lösung:
  • example.com/product?item=schwedischer-fisch& category=gummibonbons&sid=789 (URL-Parameter geben Suchmaschinen mehr Flexibilität, um festzulegen, wie effizient gecrawlt werden soll)
Es ist für Crawler schwierig, nützliche Werte (z. B. „Gummy-Candy“) von nutzlosen Werten (z. B. „SESSIONID“) zu unterscheiden, wenn diese Werte direkt im Linkpfad platziert werden. Andererseits bieten URL-Parameter den Suchmaschinen die Flexibilität, schnell zu prüfen und festzustellen, wann ein bestimmter Wert keinen Crawler-Zugriff auf alle Variationen erfordert.

Zu den gängigen Werten, die den Inhalt der Seite nicht verändern und als URL-Parameter aufgeführt werden sollten, gehören:

  • Session-ID
  • ID-Verfolgung
  • Referrer-Identifikatoren
  • Zeitstempel
Beispiel #3: Konvertieren Sie benutzergenerierte Werte (möglicherweise unendlich) in URL-Parameter, die zwar gecrawlt und indexiert werden können, aber für die Suche unbrauchbar sind.
Verwendung von geringfügigen Daten, die von Website-Benutzern generiert wurden (z. B. Längengrad/Breitengrad oder „vor Tagen“) in gecrawlten und indexierten URLs:
  • example.com/find-a-doctor? Radius=15&Breitengrad=40.7565068&Längengrad=-73.9668408
  • example.com/article?category=health& Vor Tagen = 7
Wie man:
  • example.com/find-a-doctor? city=san-francisco&neighborhood=soma
  • example.com/articles?category=health& Datum = 10. Januar 2014
Anstatt den Benutzer Werte generieren zu lassen, um crawlbare URLs zu generieren (was zu endlosen Möglichkeiten mit sehr geringem Wert für Besucher führt), ist es besser, eine Seitenkategorie für die beliebtesten Werte zu veröffentlichen, und es können zusätzliche Informationen enthalten sein, um die Seite mehr zu machen wertvoller als eine normale Suchseite mit Ergebnissen. Alternativ können Sie erwägen, benutzergenerierte Werte in einem separaten Verzeichnis zu platzieren und dann mithilfe von robots.txt das Crawlen aus diesem Verzeichnis zu deaktivieren.
  • beispiel.com /filtern/ suche-einen-arzt?radius=15&latitude=40.7565068&longitude=-73.9668408
  • beispiel.com /filtern/ article?category=health&days-ago=7
Und in robots.txt:
User-Agent: *
Nicht zulassen: /filtern/

Beispiel Nr. 4. URL-Parameter ohne Logik hinzufügen.

  • beispiel.com /gummibonbons/lutscher/gummibonbons/ Gummibärchen/Produkt?schwedischer Fisch
  • example.com/product? cat=gummibonbons&cat=lutscher&cat=gummibonbons&cat=gummibonbons&item=schwedischer-fisch
Gute Entscheidung:
  • example.com /gummy-candy/ product?item=swedish-fish
Die beste Lösung:
  • example.com/product? item=schwedischer-fisch&category=gummibonbons
Fremde URL-Parameter erhöhen nur die Duplizierung, wodurch die Website weniger effizient gecrawlt und indexiert wird. Daher ist es notwendig, unnötige URL-Parameter zu entfernen und Junk-Links regelmäßig zu bereinigen, bevor neue URLs generiert werden. Wenn viele Parameter für die Benutzersitzung benötigt werden, ist es möglich, die Informationen in Cookies zu verstecken, anstatt ständig Werte hinzuzufügen, wie z cat=gummibonbons&cat=lutscher&cat=gummibonbons& ...

Beispiel #5: Weitere Verfeinerungen (Filterung) vorschlagen, wenn es keine Ergebnisse gibt.

Schlecht:
Erlauben Sie Benutzern, Filter auszuwählen, wenn es keine zu verfeinernden Elemente gibt.


Verfeinerung auf eine Seite mit null Ergebnissen (z. B. Preis=über-10), was Benutzer frustriert und unnötige Suchanfragen für Suchmaschinen verursacht.

Wie man:
Erstellen Sie Links nur, wenn es Elemente gibt, die der Benutzer auswählen kann. Wenn das Ergebnis Null ist, markieren Sie den Link als „grau“ (d. h. nicht anklickbar). Um die Benutzerfreundlichkeit weiter zu verbessern, sollten Sie erwägen, neben jedem Filter eine Anzeige für die Elementanzahl einzufügen.


Das Anzeigen einer Seite mit null Ergebnissen (z. B. Preis=über-10) ist nicht zulässig, außerdem ist es Benutzern verboten, unnötige Klicks zu tätigen, und Suchmaschinen, diese nicht nützliche Seite zu crawlen.

Es ist notwendig, unnötige URLs zu vermeiden und den Besucherraum zu minimieren, indem URLs nur generiert werden, wenn Produkte verfügbar sind. Dies trägt dazu bei, dass Benutzer auf Ihrer Website bleiben (weniger Klicks auf die Zurück-Schaltfläche, wenn kein Produkt gefunden wird), und die Anzahl möglicher URLs, die Suchmaschinen bekannt sind, wird reduziert. Wenn die Seite nicht nur „vorübergehend vergriffen“ ist, sondern wahrscheinlich auch nie relevante Informationen enthalten wird, ziehen Sie in Erwägung, ihr einen 404-Antwortcode zu geben. Auf der 404-Seite können Sie eine nützliche Nachricht für Benutzer mit mehr Navigationsoptionen oder einem Suchfeld entwerfen, damit Benutzer verwandte Produkte finden können.

Für neue Websites, deren Webmaster die Implementierung einer facettierten Navigation erwägen, gibt es mehrere Optionen, um das Crawling (das Sammeln von Adressen auf Ihrer Website, die dem Googlebot bekannt sind) von Seiten mit eindeutigem Inhalt zu optimieren und die Suchmaschinenindizierung doppelter Seiten zu reduzieren (Konsolidierung von Indizierungssignalen).

Bestimmen Sie, welche URL-Parameter Suchmaschinen benötigen, um jede einzelne Inhaltsseite zu crawlen (dh bestimmen Sie, welche Parameter erforderlich sind, um mindestens einen Klickpfad zu jedem Element zu erstellen). Erforderliche Parameter können Artikel-ID , Kategorie-ID , Seite usw. sein.

Bestimmen Sie, welche Parameter für Besucher bei ihren Abfragen nützlich sind und welche eher zu Duplikaten beim Crawling und Indexieren führen. Im Beispiel für Süßwaren (Marmelade) könnte der URL-Parameter "Geschmack" für Benutzer mit den Abfragen im Beispiel wertvoll sein Geschmack = sauer . Es ist jedoch logisch, den Parameter „Preis“ als unnötige Doppelung zu betrachten category=gummibonbons&taste=sauer& Preis = über-10 . Andere gängige Beispiele:

  • Wertvolle Parameter für Suchmaschinen: Artikel-ID , Kategorie-ID , Name , Marke ...
  • Unnötige Parameter: Session-ID , Preisspanne ...
Erwägen Sie die Implementierung einer von mehreren Konfigurationsoptionen für URLs, die unnötige Parameter enthalten. Achten Sie nur darauf, dass wirklich keine „unnötigen“ URL-Parameter zum Crawlen durch Crawler oder zum Auffinden jedes einzelnen Produkts durch den User benötigt werden!

Option 1: und interne Links

Markieren Sie alle unnötigen URLs mit dem . Dies reduziert die Arbeitskosten des Suchroboters und verhindert eine Verringerung der Scanfrequenz. Sie müssen das Crawling global über die robots.txt verwalten (Anmerkung des Übersetzers: siehe Artikel "").
Verwenden Sie das Attribut rel="canonical", um Seiten für den Suchindex von Seiten zu trennen, die dort nicht benötigt werden (beispielsweise auf der Seite page Preis=5-10 Sie können das Attribut rel="canonical" schreiben, das die Kategorie aller sauren Marmeladen angibt example.com/category.php?category=gummibonbons&taste=sauer& seite=alle ).

Option 2: Robots.txt und Disallow

URLs mit unnötigen Parametern werden in das /filtering/-Verzeichnis aufgenommen, das in robots.txt geschlossen wird (verboten nicht zulassen). Dadurch können alle Suchmaschinen nur den „korrekten“ Intralink (Inhalt) der Website crawlen, das Crawlen unerwünschter URLs wird jedoch sofort blockiert. Zum Beispiel ( example.com/category.php?category=gummibonbons), wenn die wertvollen Parameter item, category und taste wären und die Session-ID und der Preis redundant wären, dann wäre die URL für taste:
example.com/category.php?category=gummibonbons& Geschmack = sauer, aber alle unnötigen Parameter, wie Preis, wird die URL in einem vordefinierten Verzeichnis enthalten - /filtering/:
beispiel.com /filtern/ category.php?category=gummibonbons&price=5-10,
die dann per robots.txt gebannt werden:
User-Agent: *
Nicht zulassen: /filtern/

Option 3: Separate Hosts

Stellen Sie sicher, dass die oben aufgeführten besten Lösungen (z. B. für Junk-Adressen) weiterhin gelten. Ansonsten haben Suchmaschinen bereits eine große Linkmasse im Index gebildet. Daher wird Ihre Arbeit darauf abzielen, das weitere Wachstum unnötiger Seiten, die vom Googlebot angezeigt werden, zu reduzieren und Indizierungssignale zu konsolidieren.

Verwenden Sie Parameter mit Standardcodierung und Schlüssel=Wert-Format.

Stellen Sie sicher, dass Werte, die den Inhalt der Seite nicht verändern, wie z. B. Session-IDs, als Schlüssel=Wert implementiert sind, nicht als Verzeichnisse.

Lassen Sie keine Klicks zu und generieren Sie keine URLs, wenn keine Elemente zum Filtern vorhanden sind.

Fügen Sie der URL-Parameterzuordnung Logik hinzu: Entfernen Sie unnötige Parameter, anstatt ständig Werte hinzuzufügen (z. B. vermeiden Sie, einen Link wie diesen zu generieren: example.com/product?cat=gummy-candy&cat=lollis &cat=gummy-candy&item=swedish-fish).

Speichern Sie wertvolle Parameter in der URL, indem Sie sie zuerst auflisten (weil URLs in den Suchergebnissen sichtbar sind) und weniger relevante Parameter zuletzt (z. B. die Sitzungs-ID).
Vermeiden Sie diese Linkstruktur: example.com/category.php? Sitzungs-ID=123&Tracking-ID=456&category=gummibonbons&taste=sauer
Passen Sie die URL-Einstellungen in den Webmaster-Tools an, wenn Sie genau wissen, wie Links auf Ihrer Website funktionieren.

Stellen Sie sicher, dass bei der Verwendung von JavaScript zum dynamischen Verwalten von Inhalten (Sortieren/Filtern/Ausblenden) ohne Aktualisierung der URL echte Webadressen auf Ihrer Website vorhanden sind, die einen Suchwert haben, z. B. Hauptkategorien und Produktseiten, die gecrawlt und indexiert werden können . Versuchen Sie, nicht nur die Startseite (also eine URL) für Ihre gesamte Seite zu verwenden, sondern den Inhalt der Navigation dynamisch über JavaScript zu ändern – dadurch erhalten Benutzer leider nur eine URL in der Suche. Stellen Sie außerdem sicher, dass die Leistung die dynamische Filterung nicht negativ beeinflusst, da dies den Benutzer daran hindert, mit der Website zu arbeiten.

Verbessern Sie die Indizierung verschiedener Seiten mit demselben Inhalt, indem Sie das rel="canonical"-Attribut auf der privilegierten Version der Seite angeben. Das Attribut rel="canonical" kann innerhalb einer oder mehrerer Domains verwendet werden.

Optimieren Sie die Indizierung von „paginierten“ Inhalten (z. B. Seite=1 und Seite=2 aus der Kategorie „Gummibonbons“) durch (entweder):

  • Fügen Sie einer Reihe von Seiten ein rel="canonical"-Attribut hinzu, das die kanonische Kategorie mit dem Parameter "view-all" angibt (z. B. Seite=1, Seite=2 und Seite=3 aus der Kategorie "Gummibonbons" mit rel=" kanonisch“ an category=gummibonbons&page=all), um sicherzustellen, dass die Seite für Benutzer relevant ist und schnell geladen wird.
  • Verwenden Sie das Paginierungs-Markup rel="next" und rel="prev" um die Beziehung zwischen einzelnen Seiten anzuzeigen (siehe "Paginierung mit rel="next" und rel="prev" ") .
Fügen Sie nur kanonische Links in Sitemaps ein.

Und so werde ich zunächst beschreiben, womit wir arbeiten werden und was wir brauchen werden.
System: PHP 5 und höher, mySQL 4 und höher
Helfer Klassen: dbsql.class.php (Datenbankklasse)
Verschachtelte Kategorieklasse: classTreeCategory.php (direkt die Hauptklasse, ihre Auflistung und Erläuterungen sind unten angegeben.

Erstellen Sie in der Datenbank eine Tabelle mit folgender Struktur:

Anzeigen von MySQL-Code

Diese Tabelle enthält ein Feld ICH WÜRDE- Seriennummer der Kategorie, Podcast- hat für Kategorien erster Ordnung den Wert Null oder die ID der übergeordneten Kategorie, Name- Name der Kategorie.

Ein Beispiel für die Klasse, die Kategorien als Liste mit Unterkategorien anzeigt:

PHP-Code anzeigen

include("dbsql.class.php") ; include("classTreeCategory.php" ) ; $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // Verbindung zur Datenbank herstellen, Zugangsdaten angeben$kategorie = neue Baumkategorie ($DB ) ; // an die Kategorieklasse übergeben, das Objekt der Arbeit mit der Datenbank$kategorie -> tabelle = "kategorie" ; // Tabellenname in der Datenbank mit Kategorien$array = $kategorie -> getCategory() ; // Alle Kategorien aus der Datenbank in Form eines mehrstufigen Arrays abrufen, sortiert und verschachtelt bereits in der von uns benötigten Reihenfolge$category -> outCategory ($array , "option" ) ; // Vorbereiten der Ausgabe von Kategorien (Bilden von HTML), Übergeben eines Arrays mit Kategorien echo $kategorie -> html ; // Kategorien als HTML ausgeben

Wie Sie im obigen Beispiel sehen können, ist alles extrem einfach, wir erstellen ein neues $category-Objekt, legen fest, mit welcher Datenbanktabelle wir arbeiten: 'category', dann erhalten wir aus der Tabelle eine Liste aller Kategorien, die bereits als Array formatiert sind und hierarchisch unter Berücksichtigung aller Unterkategorien zerlegt. dann übergeben wir das Array an die Methode outCategory(), die uns einen vorgefertigten HTML-Code generiert, der nur noch im Browser angezeigt werden muss.

Die outCategory()-Methode nimmt, wie wir sehen können, zwei Parameter @array und @string, im ersten Parameter ein Array mit allen Kategorien und im zweiten einen String, der einen Wert enthält Möglichkeit oder Tisch, gibt dieser Wert an, welche Art von HTML-Code generiert werden soll.
Bedeutung Möglichkeit

HTML-Code anzeigen

Um den angegebenen HTML-Code in das Auswahlfeld eines beliebigen Formulars einzufügen.

Bedeutung Tisch- generiert den folgenden HTML-Code:

HTML-Code anzeigen

Dieser HTML-Code ist praktisch zum Einfügen in eine Tabelle, die alle Unterkategorien unserer Kategorien anzeigt.

Die Klasse hat auch die folgenden Methoden:
deleteItem($id);- Entfernt eine Kategorie, trotz der verschachtelten
delCategory($array, $id);- löscht eine Kategorie mit allen verschachtelten Unterkategorien, $array - ein Array mit allen Kategorien, vorbereitet durch die Methode $category->getCategory(), $id - Nummer der zu löschenden Kategorie
Artikel hinzufügen();- Diese Methode sollte aufgerufen werden, wenn Sie eine Kategorie hinzufügen möchten, während diese Methode die Werte aus den von der POST-Methode übertragenen Daten liest, d.h. aus dem Array $_POST.
$name=$this->PHP_slashes(strip_tags($_POST['name'])); // Kategoriename
$podcat=intval($_POST['podcat']); // ID der übergeordneten Kategorie, wenn 0 angegeben ist, ist die Kategorie die Wurzel.
updateItem(); - ähnlich der vorherigen Methode, außer dass diese Methode die Kategorie, ihren Namen und ihre Verschachtelungsebene aktualisiert.

Tabelle="Kategorie"; // Anfrage zur Auswahl einer Liste von Kategorien, Tabellenname * $category->outCategory($category->getCategory()); // Kategorieausgabe vorbereiten (ein Array von Kategorien anfordern) * echo $category->html; // Kategorien im HTML-Namen anzeigen * */ /** * Tabelle, an der gearbeitet wird, ausgeben * * 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`), * KEY `id` (`id`) *) ENGINE=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory ( /** * Datenbankabfragezeichenfolge */ var $table; /** * Datenbankschnittstelle */ var $DB; /** * Array von Kategorien mit verschachtelten Unterkategorien */ var $arrayCat; / ** * Automatisches Zählen der Bindestriche vor dem Kategorienamen bei der Anzeige */ var $countPodcat; /** * HTML-Code zum Anzeigen von Kategorien mit Unterkategorien */ var $html; /** * Holen Sie sich die Schnittstelle zum Arbeiten mit der Datenbank und füge es in eine lokale Variable ein */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Ruft eine Liste von Kategorien ab, sortiert und fügt sie in ein Array mit verschachtelten Arrays ein usw. * @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]"; endforreach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$Artikel;"; eval($str); foreach($path[$item["podcat"]] as $pitem): $path[$item["id"]]=$pitem; endforreach; $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; ) /** * Gibt die Kategorien aus, legt das fertige HTML in $this->html * @param array Array mit Kategorien und verschachtelten Unterkategorien * @param string Typ des generierten HTML-Codes zur Ausgabe, Option oder Tabelle */ 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--; ) ) /** * Hilfsmethode zum Vorbereiten von HTML-Code * @param array Array mit Kategorie * @param string Typ des generierten HTML-Codes zur Ausgabe, Option oder Tabelle */ function outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="ausgewählt"; sonst $se=""; if($type=="option")$this->html.=" ($out) ($sub["name"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) function 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"]); ) ) ) function 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"]); ) ) function 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)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) function 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); ) function deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Location: ?component=($this->component)"); ) function PHP_slashes($string,$type="add") ( if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists("addslashes")) ( returnaddslashes($string); ) else (return mysql_real_escape_string($string); ) ) ) else if ($type == "strip") ( return stripeslashes($string); ) else ( die("error in PHP_slashes (mixed,add | strip)"); ) ) )

Die ganze Klasse war innerhalb einer Stunde geschrieben und hat natürlich Mängel, aber das alles lässt sich beheben. Seine Verwendung ist für Bildungszwecke ratsam, obwohl Sie es übrigens, nachdem Sie es ein wenig beendet haben, in jedes System einbetten und seine Arbeit genießen können)).

Ich wäre Ihnen dankbar, wenn Sie in den Kommentaren Ihre eigenen Möglichkeiten zur Lösung dieses Problems anbieten - das Organisieren von Kategorien mit unendlicher Verschachtelungsebene.