Categoria inutile php. Classe PHP per un lavoro comodo e sicuro con MySQL. Ulteriori informazioni sui segnaposto digitati

Oggi il nostro obiettivo è creare una struttura gerarchica di categorie. Per noi è importante che sia conveniente memorizzare le categorie e che sia facile visualizzarle dove ne abbiamo bisogno.

A volte il semplice sembra complicato, ecco perché esporrò alcuni frammenti di codice che spero possano esserti utili per implementare le categorie php sotto forma di albero.

Quindi, la struttura dovrebbe essere composta dall'id della categoria (id), dal nome della categoria (name) e ovviamente dall'id della categoria genitore (parent_id). In MySQL ha questo aspetto:

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`)) MOTORE =InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

Struttura della tabella minima e comprensibile per la memorizzazione delle categorie.

INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES (1, "Telefoni e tablet", "0"), (2, "Automobili", "0"), (3, "Samsung ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, " Scheda Galassia 4", "3"), (10, "Galaxy S6", "3");

Dove parent_id=0, questa categoria non ha una categoria padre.

Tutto è chiaro e semplice qui. Ora passiamo all'elenco delle categorie. Ma per il corretto output dell'elenco, dobbiamo prima ottenere l'intero elenco delle categorie php e solo allora, usando la ricorsione, formare il nostro albero. La seguente funzione è quella di ottenere questo elenco:

Funzione get_cat() ( // interroga il database $sql = "SELECT * FROM category"; $result = mysql_query($sql); if(!$result) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows ($risultato) != 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; } }

//ottenere l'array del catalogo $result = get_cat();

Ora abbiamo bisogno di una funzione con ricorsione

Funzione view_cat($arr,$parent_id = 0) ( //Condizioni di uscita dalla ricorsione if(empty($arr[$parent_id])) ( return; ) echo "

    "; // scorre l'array e visualizza for($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //ricorsione - controlla se ci sono categorie figlio view_cat($arr,$arr[$parent_id][$i]["id "] ); eco "
  • "; ) eco "
"; }

Ora non resta che visualizzare la directory sullo schermo utilizzando la funzione ricorsiva

View_cat($risultato);

E in generale, questo è tutto. In questo modo possiamo ottenere un albero completo di categorie con infinite sottocategorie.

) Ti ho mostrato un esempio di utilizzo di espressioni regolari per trovare determinati pezzi codice sorgente pagine. Ora impareremo come scriverli da soli. Questa abilità ti aiuterà a scrivere, cancellare il testo da frammenti non necessari, cercare le parti giuste in grandi volumi di testo e così via.

Data di pubblicazione: 20.10.2013

Continuiamo a scrivere un parser di statistiche sui visitatori di liveinternet. Se qualcuno si è appena unito a noi, allora ti consiglio di iniziare, dove ci siamo collegati al servizio senza autorizzazione. Lì abbiamo imparato come ottenere contenuti da pagine aperte che non sono protette da password. Ma, in effetti, l'accesso alla maggior parte dei siti è chiuso, quindi è molto poco utile per uno script che non sa come accedere, come capisci. Ma non preoccuparti, lo ripareremo ora.

Data di pubblicazione: 08.10.2013

Buon pomeriggio, lettori! È ora di fare un po' di pratica. Hai già abbastanza conoscenze per iniziare a scrivere script utili che semplificheranno il tuo lavoro. Uno di questi può essere un parser. Di cosa si tratta, l'ho descritto in dettaglio nel mio, quindi se non lo sai, ti consiglio di leggerlo. In breve, l'essenza del parser è cercare e isolare informazione necessaria da un testo di grandi dimensioni. Nel caso di Internet, molto spesso si tratta di estrarre i dati richiesti dalle pagine dei siti. Nel nostro caso, questo sarà Liveinternet. Quindi andiamo!

Data di pubblicazione: 03/10/2013

Questo articolo si concentrerà su uno strumento così potente come cURL, nonché su una libreria php che fornisce l'accesso a questo strumento: libcurl. A cosa serve tutto questo? Per comunicare con il server tramite protocolli di trasferimento dati, come http o ftp. Il resto dei protocolli non ci interessa particolarmente, se qualcuno vuole approfondire questo argomento, dovrà scavare risorse in lingua inglese e questo articolo conterrà le basi e gli esempi di utilizzo.

Data di pubblicazione: 24.11.2012

Data di pubblicazione: 05.11.2012

E ora ci sarà una lezione piuttosto ampia, ma non complicata, su come lavorare con i file in php. Prima di tutto, a cosa servono i file? Dopotutto, puoi archiviare tutto nel database Dati MySQL o PostgreSQL o qualsiasi altra cosa. Ma a volte ci sono tali attività quando non è consigliabile utilizzare il database, con tutta l'elaborazione e la preoccupazione per la sicurezza della connessione. Ad esempio, è necessario creare un contatore regolare e prima non utilizzavamo un database nel nostro progetto. Allora perché dovremmo, per il bene di un piccolo contatore, avviare un database e memorizzarvi solo un paio di righe? è molto più facile usare i file. Inoltre, a volte l'hosting non supporta affatto i database, quindi i file generalmente rimangono l'unica via d'uscita.

Data di pubblicazione: 04.11.2012

Ogni volta che consenti ai tuoi utenti di inviare testo al tuo sito (nome o qualsiasi altra informazione), devi stare attento. Devi essere sicuro di non avere buchi di sicurezza nel sito che gli aggressori possono utilizzare per hackerare. Se hai ancora bisogno di ricevere dati dall'utente, assicurati di utilizzare la funzione htmlentities per impedire l'esecuzione di codice HTML o script che possono essere dannosi e pericolosi!

Data di pubblicazione: 04.11.2012

In questa lezione esamineremo le tecniche per il passaggio di dati tra moduli e pagine. Questi metodi sono POST e GET. Ne parleremo separatamente e in modo più dettagliato. In generale, è necessario per la comunicazione tra le forme. Ad esempio, compiliamo alcuni campi nella pagina e dobbiamo trasferirli in un'altra pagina per l'elaborazione.

Data di pubblicazione: 03.11.2012

Infatti, come avrete già intuito, il ciclo do while è una versione leggermente modificata del ciclo while che abbiamo visto nei tutorial precedenti. Se ricordi come funziona il normale while, ti sarà più facile capire il nuovo ciclo. Ripetiamo: il corpo del ciclo while viene eseguito se la condizione è vera e non eseguito se non è vera, ma potrebbe non essere eseguito nemmeno una volta se la condizione è falsa fin dall'inizio. Come si fa mentre si lavora?

Data di pubblicazione: 03.11.2012

Immagina di avere un array associativo su cui vuoi iterare. PHP fornisce un modo semplice per utilizzare a turno ogni elemento di un array utilizzando il costrutto Foreach.

Restituisce una matrice di oggetti contenente informazioni sulla categoria.

I parametri passati a questa funzione sono molto simili ai parametri passati alla funzione wp_list_categories() e possono essere passati sia come array che come stringa di query: type=post&order=DESC .

✈ 1 volta = 0,005625 s = Così lenta| 50000 volte = 11,98s = lentamente| PHP 7.1.11, WP 4.9.5

Utilizzo

$categorie = get_categorie($args);

Modello di utilizzo

$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" => falso, // lista completa parametri, vedere la descrizione della funzione http://wp-kama.ru/function/get_terms)); if($categories)( foreach($categories as $cat)( // Dati nell'oggetto $cat // $cat->term_id // $cat->name (Categoria 1) // $cat->slug (rubrika - 1) // $cat->term_group (0) // $cat->term_taxonomy_id (4) // $cat->tassonomia (categoria) // $cat->description (testo della descrizione) // $cat-> parent (0) // $cat->count (14) // $cat->object_id (2743) // $cat->cat_ID (4) // $cat->category_count (14) // $cat-> category_description (Testo della descrizione) // $cat->cat_name (Categoria 1) // $cat->category_nicename (rubrika-1) // $cat->category_parent (0) ) ) tassonomia (linea) Il nome della tassonomia da elaborare. Aggiunto dalla versione 3.0.
Predefinito: "categoria" tipo (linea)
  • post - categorie di post (predefinito);
  • collegamento - sezioni di collegamenti.
    Predefinito: "post"
figlio di (linea) Ottieni le categorie figlio (inclusi tutti i livelli di annidamento) della categoria specificata. Il parametro specifica l'ID della categoria principale (la categoria di cui si desidera visualizzare le categorie nidificate). genitore (numero) Ottiene le categorie la cui categoria padre è uguale al parametro ID specificato. La differenza rispetto a child_of è che verrà mostrato un livello di annidamento.
Predefinito: "" ordinato da (linea)

Ordinamento dei dati ricevuti secondo determinati criteri. Ad esempio, in base al numero di post in ciascuna categoria o in base al nome della categoria. Sono disponibili i seguenti criteri:

  • ID - ordinamento per ID;
  • name - ordina per nome (predefinito);
  • lumaca - ordinamento per alt. nome (lumaca);
  • contare - in base al numero di voci nella categoria;
  • term_group - per gruppo.

Predefinito: "nome"

Ordine (linea)

La direzione di ordinamento specificata nel parametro "orderby":

  • ASC - in ordine, dal più piccolo al più grande (1, 2, 3; a, b, c);
  • DESC - in ordine inverso, dal più grande al più piccolo (3, 2, 1; c, b, a).

Predefinito: "ASC"

Nascondi_vuoto (logico)

Se ottenere o meno categorie vuote (senza voci):

  • 1 (vero) - non ricevere vuoto,
  • 0 (falso) - diventa vuoto.

Predefinito: vero

Gerarchico (logico) Se il parametro è impostato su VERO, il risultato includerà le categorie figlio vuote le cui categorie figlio hanno voci (non vuote).
Predefinito: vero escludere (stringa/matrice) Escludi qualsiasi categoria dall'elenco. È necessario specificare gli ID di categoria separati da virgole o in un array. Se questo parametro viene specificato, il parametro child_of verrà sovrascritto.
Predefinito: "" includere (stringa/matrice) Elenca solo le categorie specificate. È necessario specificare gli ID di categoria separati da virgole o in un array.
Predefinito: "" numero (numero) Limite. Il numero di categorie da recuperare. Per impostazione predefinita, nessuna restrizione: verranno recuperate tutte le categorie. pad_counts (logico) Se vero, il numero che mostra il numero di voci nelle categorie padre sarà la somma delle proprie voci e delle voci delle categorie figlie.
Predefinito: falso

Esempi

# 1 Elenco a discesa

Per creare un elenco a discesa di categorie, possiamo utilizzare un'altra funzione speciale wp_dropdown_categories() :

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

tuttavia, con questo approccio, perderemo una certa flessibilità nell'impostazione dell'elenco, poiché ci ritroveremo con un elenco completo.

Pertanto, in alcuni casi sarà più logico creare un elenco a discesa utilizzando la funzione get_categorie(). Ecco un esempio (supponendo di voler visualizzare le sottocategorie (bambini) della categoria 10):

#2 Elenco delle categorie e loro descrizione

Questo esempio ci mostrerà come elencare i collegamenti alle categorie, dove subito dopo ogni collegamento ci sarà una descrizione della categoria (specificata durante la creazione/modifica di una categoria):

"nome", "ordine" => "ASC")); foreach($categorie come $categoria)( echo "

Categoria: term_id) . ""titolo="" . sprintf(__("Visualizza tutti i post in %s"), $categoria->nome) . "" " . ">" . $categoria->nome."

"; eco "

Descrizione:". $categoria->descrizione . "

"; eco "

Conteggio post: ". $category->count . "

"; } ?>

Appunti

  • Vedere: get_terms() Tipo di argomenti che possono essere modificati.

Elenco delle modifiche

Dalla versione 2.1.0 Introdotto.

Codice getcategorie : wp-includes/category.php WP 5.3.2

"categoria"); $args = wp_parse_args($args, $default); /** * Filtra la tassonomia utilizzata per recuperare i termini quando si chiama get_categories(). * * @since 2.7.0 * * @param string $taxonomy Tassonomia da cui recuperare i termini. * @param array $args Un array di argomenti. Vedere 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(/* translates: 1: " type => link", 2: "taxonomy => link_category" */ __("%1$s è obsoleto. Usa invece %2$s."), " digitare => collegamento", "tassonomia => link_category")); $args["taxonomy"] = "link_category"; ) $categories = get_terms($args); if (is_wp_error($categories)) ( $categories = array(); ) else ( $categories = (array ) $categorie; foreach (array_keys($categories) as $k) ( _make_cat_compat($categories[ $k ]); ) ) return $categorie; )

In questo articolo (livello webmaster - avanzato), parleremo, intersecando in modi diversi, del cosiddetto. navigazione sfaccettata. Per semplificare l'assimilazione del materiale, consiglio di ripassare l'articolo di Wikipedia "Classificazione dei facet" e le pubblicazioni in inglese (ma con immagini!) "Design better faceted navigation for your website".

La navigazione sfaccettata filtrata per colore o fascia di prezzo può essere utile per i tuoi visitatori, ma spesso dannosa per la ricerca creando più combinazioni di indirizzi con contenuti duplicati. A causa dei duplicati, i motori di ricerca non saranno in grado di eseguire rapidamente la scansione del sito per gli aggiornamenti dei contenuti, il che influisce di conseguenza sull'indicizzazione. Per ridurre al minimo questo problema e aiutare i webmaster a semplificare la ricerca nella navigazione con facet, vorremmo:

Ideale per gli utenti e la ricerca su Google

Percorso chiaro per le pagine dei prodotti/articoli:

Rappresenta l'URL per la pagina della categoria:
http://www.example.com/category.php?category=caramelle-gommose

Rappresenta un URL per un prodotto specifico:
http://www.example.com/product.php?item=swedish-fish

Duplicati indesiderati causati dalla navigazione a faccette

La stessa pagina è accessibile da diversi indirizzi web:

Pagina canonica



URL: esempio.com/prodotto.php? item=pesce-svedese

Pagina duplicata



URL:esempio.com/prodotto.php? item=pesce-svedese&category=caramelle-gommose&price=5-10


categoria=caramelle-gommose&gusto=acido&prezzo=5-10

Errori:

  • Non ha senso per Google, poiché gli utenti raramente cercano [$ 9:55 marmellata].
  • Non ha senso che i crawler trovino lo stesso articolo ("macedonia di frutta") dalle pagine delle categorie principali ("Gummi" o "Sour Gummy").
  • Un punto negativo per il proprietario del sito, perché le richieste di indicizzazione sono diluite con più versioni della stessa categoria.
  • Un punto negativo per il proprietario del sito, perché è un carico inutile e non necessario sulla larghezza di banda del sito
Pagine bianche:


URL: esempio.com/categoria.php? categoria=caramelle-gommose&gusto=acido&prezzo=over-10

Errori:

  • Codice errato per i motori di ricerca (in questo caso la pagina dovrebbe riportare il codice 404)
  • Pagina vuota per gli utenti


Soluzioni peggiori (non ricercabili) per la navigazione a faccette

Esempio 1: Nell'URL vengono utilizzati parametri non standard: virgole e parentesi, invece di chiave=valore&:

  • example.com/category? [ categoria:caramelle-gommose ][ ordina:prezzo-basso-alto ][ sid:789 ]
  • example.com/category?category , caramelle gommose , sort , lowtohigh , sid , 789
Come:
example.com/category? categoria=caramelle-gommose&sort=basso-alto&sid=789

Esempio #2: Utilizzo di directory o percorsi di file anziché opzioni in elenchi di valori che non modificano il contenuto della pagina:
example.com/c123/s789/product?swedish-fish
(dove /c123/ è la categoria, /s789/ è l'ID di sessione, che non modifica il contenuto della pagina)

Buona decisione:

  • example.com /caramelle-gommose/ product?item=pesce-svedese&sid=789(la directory, /gummy-candy/, cambia il contenuto della pagina in modo significativo)
La decisione migliore:
  • example.com/product?item=swedish-fish& categoria=caramelle-gommose&sid=789 (I parametri URL offrono maggiore flessibilità ai motori di ricerca per determinare come eseguire la scansione in modo efficiente)
È difficile per i crawler differenziare valori utili (es. "gummy-candy") da valori inutili (es. "SESSIONID") quando questi valori sono inseriti direttamente nel percorso del link. D'altra parte, i parametri URL forniscono ai motori di ricerca la flessibilità di controllare e determinare rapidamente quando un determinato valore non richiede l'accesso del crawler a tutte le varianti.

I valori comuni che non modificano il contenuto della pagina e dovrebbero essere elencati come parametri URL includono:

  • ID sessione
  • Monitoraggio dell'identità
  • Identificatori di referrer
  • Timestamp
Esempio #3: Converti i valori generati dall'utente (possibilmente infiniti) in parametri URL che sono scansionabili e indicizzabili ma inutili per la ricerca.
Utilizzo di dati secondari generati dagli utenti del sito (come longitudine/latitudine o "giorni fa") negli URL sottoposti a scansione e indicizzati:
  • example.com/find-a-doctor? raggio=15&latitudine=40.7565068&longitudine=-73.9668408
  • example.com/article?category=salute& giorni fa=7
Come:
  • example.com/find-a-doctor? città=san-francisco&quartiere=soma
  • example.com/articles?category=salute& data=10-gennaio-2014
Invece di lasciare che l'utente generi valori per generare URL scansionabili (con il risultato di possibilità infinite con un valore minimo per i visitatori), è meglio pubblicare una categoria di pagina per i valori più popolari e possono essere incluse informazioni aggiuntive per rendere la pagina più prezioso rispetto alla normale pagina di ricerca con i risultati. In alternativa, potresti prendere in considerazione l'idea di inserire i valori generati dall'utente in una directory separata e quindi utilizzare robots.txt per disabilitare la scansione da tale directory.
  • esempio.com /filtraggio/ trovare-un-dottore?radius=15&latitude=40.7565068&longitude=-73.9668408
  • esempio.com /filtraggio/ articoli?category=salute&giorni-ago=7
E in robots.txt:
Agente utente: *
Non consentire: /filtraggio/

Esempio #4. Aggiunta di parametri URL senza logica.

  • esempio.com /caramelle-gommose/lecca-lecca/caramelle-gommose/ caramelle gommose/prodotto?pesce-svedese
  • example.com/product? cat=caramelle-gommose&cat=lecca-lecca&cat=caramelle-gommose&cat=caramelle-gommose&item=pesce-svedese
Buona decisione:
  • example.com /caramelle-gommose/ product?item=pesce-svedese
La decisione migliore:
  • example.com/product? item=pesce-svedese&category=caramelle-gommose
I parametri URL estranei aumentano solo la duplicazione e, di conseguenza, il sito viene scansionato e indicizzato in modo meno efficiente. Pertanto, è necessario eliminare i parametri URL non necessari e ripulire periodicamente i collegamenti indesiderati prima di generare nuovi URL. Se sono necessari molti parametri per la sessione utente, è possibile nascondere le informazioni nei cookie, piuttosto che aggiungere costantemente valori, come gatto=caramelle-gommose&gatto=lecca-lecca&gatto=caramelle-gommose& ...

Esempio #5: Suggerire ulteriori perfezionamenti (filtraggio) quando ci sono risultati nulli.

Male:
Consenti agli utenti di selezionare i filtri quando ci sono elementi nulli da perfezionare.


Affinamento a una pagina con zero risultati (ad esempio, prezzo=over-10), che frustra gli utenti e provoca query non necessarie per i motori di ricerca.

Come:
Crea link solo quando ci sono elementi che l'utente può selezionare. Se il risultato è zero, segna il link come "grigio" (cioè non cliccabile). Per migliorare ulteriormente l'usabilità, prendi in considerazione l'inclusione di un indicatore del conteggio degli elementi accanto a ciascun filtro.


La visualizzazione di una pagina con zero risultati (ad esempio, prezzo=over-10) non è consentita, inoltre è vietato agli utenti di fare clic non necessari e ai motori di ricerca di eseguire la scansione di questa pagina non utile.

È necessario prevenire URL non necessari e ridurre al minimo lo spazio dei visitatori generando URL solo quando i prodotti sono disponibili. Ciò contribuirà a mantenere gli utenti coinvolti sul tuo sito (meno clic sul pulsante Indietro quando non viene trovato alcun prodotto), a ridurre il numero di possibili URL noti ai motori di ricerca. Inoltre, se la pagina non è solo "temporaneamente esaurita" ma è improbabile che contenga mai informazioni rilevanti, valuta la possibilità di assegnarle un codice di risposta 404. Nella pagina 404, puoi progettare un messaggio utile per gli utenti con più opzioni di navigazione o una casella di ricerca in modo che gli utenti possano trovare prodotti correlati.

Per i nuovi siti i cui webmaster stanno prendendo in considerazione l'implementazione della navigazione con facet, sono disponibili diverse opzioni per ottimizzare la scansione (la raccolta di indirizzi sul tuo sito nota a Googlebot) di pagine di contenuti univoci e ridurre l'indicizzazione dei motori di ricerca delle pagine duplicate (consolidamento dei segnali di indicizzazione).

Determina quali parametri URL sono necessari ai motori di ricerca per eseguire la scansione di ogni singola pagina di contenuto (ovvero, determina quali parametri sono necessari per creare almeno un percorso di clic per ciascun elemento). I parametri richiesti possono includere item-id , category-id , page ecc.

Determina quali parametri saranno utili ai visitatori con le loro query e quali hanno maggiori probabilità di causare duplicazioni nella scansione e nell'indicizzazione. Nell'esempio dei prodotti dolciari (marmellata), il parametro URL "taste" potrebbe essere prezioso per gli utenti con le query nell'esempio sapore=aspro . Tuttavia, è logico ritenere che il parametro "prezzo" causi inutili duplicazioni categoria=caramelle-gommose&gusto=acido& prezzo=oltre-10 . Altri esempi comuni:

  • Parametri preziosi per i motori di ricerca: item-id , category-id , name , brand...
  • Parametri non necessari: session-id , price-range ...
Prendi in considerazione l'implementazione di una delle numerose opzioni di configurazione per gli URL che contengono parametri non necessari. Assicurati solo che i parametri URL "non necessari" non siano davvero richiesti per la scansione da parte dei crawler o per consentire all'utente di trovare ogni singolo prodotto!

Opzione 1: e collegamenti interni

Contrassegna tutti gli URL non necessari con l'estensione . Ciò ridurrà i costi di manodopera del robot di ricerca e impedirà una diminuzione della frequenza di scansione. È necessario gestire globalmente la scansione tramite robots.txt (Nota del traduttore: vedere l'articolo "").
Utilizza l'attributo rel="canonical" per separare le pagine per l'indice di ricerca dalle pagine non necessarie (ad esempio, nella pagina prezzo=5-10 puoi scrivere l'attributo rel="canonical", che indica la categoria di tutte le marmellate acide example.com/category.php?category=caramelle-gommose&gusto=acido& pagina=tutto ).

Opzione 2: Robots.txt e Disallow

Gli URL con parametri non necessari sono inclusi nella directory /filtering/, che verrà chiusa in robots.txt (prohibit disallow). Ciò consentirà a tutti i motori di ricerca di eseguire la scansione solo dell'intralink (contenuto) "corretto" del sito, ma bloccherà immediatamente la scansione degli URL indesiderati. Per esempio ( example.com/category.php?category=caramelle-gommose), se i parametri validi fossero articolo, categoria e gusto e l'ID sessione e il prezzo fossero ridondanti, l'URL per il gusto sarebbe:
example.com/category.php?category=caramelle-gommose& sapore=aspro, ma tutti i parametri non necessari, come il prezzo, l'URL includerà in una directory predefinita - /filtering/:
esempio.com /filtraggio/ category.php?category=caramelle-gommose&price=5-10,
che verrà quindi bannato tramite robots.txt:
Agente utente: *
Non consentire: /filtraggio/

Opzione 3: host separati

Assicurati che le migliori soluzioni sopra elencate (per gli indirizzi spazzatura, ad esempio) siano ancora valide. Altrimenti, i motori di ricerca hanno già formato una grande massa di link nell'indice. Pertanto, il tuo lavoro mirerà a ridurre l'ulteriore crescita di pagine non necessarie visualizzate da Googlebot e a consolidare i segnali di indicizzazione.

Utilizza parametri con codifica standard e formato chiave=valore.

Assicurati che i valori che non modificano il contenuto della pagina, come gli ID di sessione, siano implementati come chiave=valore, non come directory.

Non consentire clic e non generare URL quando non ci sono elementi da filtrare.

Aggiungi logica alla mappatura dei parametri URL: rimuovi i parametri non necessari piuttosto che aggiungere valori continuamente (ad esempio, evita di generare un collegamento come questo: example.com/product?cat=caramelle-gommose&cat=lecca-lecca &cat=caramelle-gommose&item=pesce-svedese).

Memorizza parametri importanti nell'URL elencandoli per primi (perché gli URL sono visibili nei risultati di ricerca) e per ultimi i parametri meno rilevanti (come l'ID di sessione).
Evita questa struttura di collegamento: esempio.com/categoria.php? id-sessione=123&id-tracciamento=456&category=caramelle-gommose&gusto=acido
Modifica le impostazioni dell'URL in Strumenti per i Webmaster se hai una chiara comprensione di come funzionano i link sul tuo sito.

Assicurati che quando utilizzi JavaScript per gestire dinamicamente i contenuti (ordina/filtra/nascondi) senza aggiornare l'URL, sul tuo sito siano presenti indirizzi web reali che hanno un valore di ricerca, come le categorie principali e le pagine dei prodotti, che possono essere scansionati e indicizzati . Cerca di non utilizzare solo la home page (ovvero un URL) per l'intero sito, ma modifica dinamicamente il contenuto della navigazione tramite JavaScript: questo, sfortunatamente, darà agli utenti un solo URL nella ricerca. Inoltre, assicurati che le prestazioni non influiscano negativamente sul filtro dinamico, in quanto impediranno all'utente di lavorare con il sito.

Migliora l'indicizzazione di diverse pagine dello stesso contenuto specificando l'attributo rel="canonical" sulla versione privilegiata della pagina. L'attributo rel="canonical" può essere utilizzato all'interno di uno o più domini.

Ottimizza l'indicizzazione dei contenuti "impaginati" (ad es. pagina=1 e pagina=2 della categoria "caramelle gommose") mediante (uno dei due):

  • Aggiungi un attributo rel="canonical" a una serie di pagine specificando la categoria canonical con il parametro "view-all" (ad es. page=1, page=2 e page=3 dalla categoria "caramelle gommose" con rel=" canonico” su categoria=caramelle-gommose&page=tutto), assicurandosi che la pagina sia pertinente per gli utenti e si carichi rapidamente.
  • Usa il markup di paginazione rel="next" e rel="prev" per indicare la relazione tra le singole pagine (vedi "Paginaton con rel="next" e rel="prev" ") .
Includi solo link canonici nelle sitemap.

E così, per cominciare, descriverò con cosa lavoreremo e di cosa avremo bisogno.
Sistema: PHP 5 e versioni successive, mySQL 4 e versioni successive
Classi di aiuto: dbsql.class.php (classe database)
Classe di categoria nidificata: classTreeCategory.php (direttamente la classe principale, il suo elenco e le spiegazioni sono riportati di seguito.

Creare una tabella nel database con la seguente struttura:

Visualizzazione del codice MySQL

Questa tabella contiene un campo ID- numero di serie della categoria, podcat- ha un valore pari a zero per le categorie del primo ordine o l'ID della categoria principale, nome- nome della categoria.

Un esempio della classe, che mostra le categorie come un elenco con sottocategorie:

Visualizza il codice PHP

include("dbsql.class.php") ; include("classTreeCategory.php" ); $DB = new DB_Engine("mysql" , $settings [ "dbHost" ] , $settings [ "dbUser" ] , $settings [ "dbPass" ] , $settings [ "dbName" ] ) ; // connettersi al database, specificando i dati di accesso$category = nuovo TreeCategory ($DB); // passa alla classe categoria, oggetto di lavoro con il database$categoria -> tabella = "categoria" ; // nome della tabella nel database con le categorie$array = $categoria -> getCategoria() ; // ottiene tutte le categorie dal database sotto forma di un array multilivello, ordinato e nidificato già nell'ordine di cui abbiamo bisogno$category -> outCategory ($array , "opzione" ); // prepara l'output delle categorie (formando HTML), passando un array con le categorie echo $categoria -> html ; // categorie di output come HTML

Come puoi vedere dall'esempio sopra, tutto è estremamente semplice, creiamo un nuovo oggetto $category, stabiliamo con quale tabella del database lavoriamo: 'category', quindi otteniamo dalla tabella un elenco di tutte le categorie già formattate come un array e scomposto in ordine gerarchico, tenendo conto di tutte le sottocategorie. quindi passiamo l'array al metodo outCategory(), che genera per noi un codice HTML già pronto, che resta solo da visualizzare nel browser.

Il metodo outCategory(), come possiamo vedere, prende due parametri @array e @string nel primo parametro un array con tutte le categorie, e nel secondo una stringa contenente un valore opzione O tavolo, questo valore specifica il tipo di codice HTML da generare.
Senso opzione

Visualizza il codice HTML

Per inserire il codice HTML dato nel campo di selezione di qualsiasi modulo.

Senso tavolo- genera il seguente codice HTML:

Visualizza il codice HTML

Questo codice HTML è utile per incollarlo in una tabella che mostra tutte le nostre sottocategorie di categorie.

La classe ha anche i seguenti metodi:
deleteItem($id);- rimuove una categoria, nonostante quelle nidificate
delCategoria($array, $id);- elimina una categoria con tutte le sottocategorie nidificate, $array - un array con tutte le categorie preparate dal metodo $category->getCategory(), $id - numero della categoria da eliminare
Aggiungi articolo();- questo metodo dovrebbe essere chiamato se si desidera aggiungere una categoria, mentre questo metodo legge i valori dai dati trasmessi dal metodo POST, ovvero dall'array $_POST.
$name=$this->PHP_slashes(strip_tags($_POST['name'])); // Nome della categoria
$podcat=intval($_POST['podcat']); // ID della categoria padre, se viene specificato 0, la categoria sarà alla radice.
aggiornaItem(); - simile al metodo precedente, tranne per il fatto che questo metodo aggiorna la categoria, il suo nome e il livello di nidificazione.

tabella="categoria"; // richiesta di selezionare un elenco di categorie, nome tabella * $category->outCategory($category->getCategory()); // prepara l'output della categoria (richiede un array di categorie) * echo $categoria->html; // visualizza le categorie nel nome HTML * */ /** * Scarica la tabella su cui si sta lavorando * * 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`), * CHIAVE `id` (`id`) *) MOTORE=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory ( /** * Stringa di query del database */ var $table; /** * Interfaccia del database */ var $DB; /** * Array di categorie con sottocategorie nidificate */ var $arrayCat; / ** * Conta automaticamente il numero di trattini prima del nome della categoria durante la visualizzazione */ var $countPodcat; /** * Codice HTML per la visualizzazione di categorie con sottocategorie */ var $html; /** * Ottieni l'interfaccia per lavorare con il database e inserirlo in una variabile locale */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Ottiene un elenco di categorie, ordina e inserisce in un array con array nidificati, ecc. * @return array category */ function getCategory () ( $all = $this->DB->getAll("SELECT * FROM `($this->table)` ORDER BY `id` ASC"); $percorso = 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( $percorso[$item["podcat"]] as $pitem): $rep=$item["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($item["podcat"])]"; $str.="[($item["id"])]"; $str.="=$elemento;"; eval($str); foreach($percorso[$item["podcat"]] as $pitem): $percorso[$item["id"]]=$pitem; endforeach; $percorso[$item["id"]]=$item["podcat"]; ) else ( $sort[$item["podcat"]]["sub"][$item["id"]]=$item; $path[$item["id"]]=$item["podcat" ]; ) ) endforeach; ) $this->arrayCat=$ordina; return $this->arrayCat; ) /** * Stampa le categorie, inserisce l'HTML finito in $this->html * @param array Array con categorie e sottocategorie nidificate * @param string Tipo di codice HTML generato per l'output, opzione o tabella */ 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--; ) ) /** * Metodo di supporto per la preparazione del codice HTML * @param array Array con categoria * @param string Tipo di codice HTML generato per l'output, opzione o tabella */ funzione outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="selezionato"; altro $se=""; if($tipo=="opzione")$this->html.=" ($out) ($sub["nome"]) "; if($type=="table")$this->html.= ($out) ($sub["name"]) HTML; ) funzione delCategoria(&$a_tree,&$id=0) ( foreach($a_tree as $sub) ( if($sub["id"]$id e isset($sub["sub"]))$this- >delCategoria($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"]); ) ) ) funzione 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"]); ) ) funzione updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["nome"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="AGGIORNA `( $this->table)` SET `name` = "($name)",`podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->execute($sql); ) funzione addItem() ( $name=$this->PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="INSERT INTO `($this->table)` (`id`,`podcat`,`name`) VALORI ("", "$podcat" , "$nome");"; $this->DB->esegui($sql); ) funzione deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >execute($sql); header("Posizione: ?component=($this->component)"); ) funzione PHP_slashes($string,$type="add") ( if ($type == "add") ( if (get_magic_quotes_gpc()) ( return $stringa; ) else ( if (function_exists("addslashes")) ( return addslashes($string); ) else ( return mysql_real_escape_string($stringa); ) ) ) else if ($type == "strip") ( return stripslashes($string); ) else ( die("errore in PHP_slashes (mixed,add | strip)"); ) ) )

L'intera lezione è stata scritta in un'ora e, ovviamente, ha dei difetti, ma tutto questo è risolvibile. Il suo utilizzo è consigliabile per scopi didattici, anche se tra l'altro, dopo averlo finito un po ', puoi incorporarlo in qualsiasi sistema e goderti il ​​\u200b\u200bsuo lavoro)).

Ti sarei grato se nei commenti offrissi le tue opzioni per risolvere questo problema, organizzando categorie di un livello di nidificazione infinito.