Categoría inútil php. Clase PHP para un trabajo cómodo y seguro con MySQL. Más información sobre marcadores de posición escritos

Hoy nuestro objetivo es crear una estructura jerárquica de categorías. Es importante para nosotros que sea conveniente almacenar categorías y que sea fácil mostrarlas donde las necesitemos.

A veces lo simple parece complicado, es por eso que mostraré algunos fragmentos de código que espero te sean útiles para implementar categorías de php en forma de árbol.

Por lo tanto, la estructura debe consistir en la identificación de la categoría (id), el nombre de la categoría (nombre) y, por supuesto, la identificación de la categoría principal (parent_id). En MySQL se ve así:

CREAR TABLA SI NO EXISTE `categoría` (`id` int(10) sin firmar NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `parent_id` int(11) NOT NULL, PRIMARY KEY (`id`)) MOTOR =INNODB CONJUNTO DE CARACTERES POR DEFECTO=utf8 AUTO_INCREMENTO=0;

Estructura de tabla mínima y comprensible para almacenar categorías.

INSERTAR EN `categoría` (`id`, `nombre`, `parent_id`) VALORES (1, "Teléfonos y tabletas", "0"), (2, "Automóviles", "0"), (3, "Samsung ", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, " pestaña galaxia 4", "3"), (10, "Galaxy S6", "3");

Donde parent_id=0, esta categoría no tiene categoría principal.

Todo es claro y simple aquí. Ahora pasemos a enumerar las categorías. Pero para la salida correcta de la lista, primero necesitamos obtener la lista completa de categorías de php, y solo entonces, usando la recursividad, formamos nuestro árbol. La siguiente función es obtener esta lista:

Función get_cat() ( // consulta la base de datos $sql = "SELECCIONAR * DE categoría"; $resultado = mysql_query($sql); if(!$resultado) ( return NULL; ) $arr_cat = array(); if( mysql_num_rows ($resultado) != 0) ( //Para($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; } }

//obtener la matriz del catálogo $resultado = get_cat();

Ahora necesitamos una función con recursividad.

Función view_cat($arr,$parent_id = 0) ( //Condiciones de salida de la recursión if(empty($arr[$parent_id])) ( return; ) echo "

    "; // recorre la matriz y muestra for($i = 0; $i< count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //recursión: compruebe si hay categorías secundarias view_cat($arr,$arr[$parent_id][$i]["id "]); eco"
  • "; ) eco "
"; }

Ahora solo queda mostrar el directorio en la pantalla usando la función recursiva

View_cat($resultado);

Y en general, eso es todo. De esta forma podemos obtener un completo árbol de categorías con infinitas subcategorías.

) Te mostré un ejemplo del uso de expresiones regulares para encontrar ciertas piezas código fuente paginas Ahora aprenderemos cómo escribirlos usted mismo. Esta habilidad lo ayudará a escribir, borrar texto de fragmentos innecesarios, buscar las partes correctas en grandes volúmenes de texto, etc.

Fecha de publicación: 20.10.2013

Continuamos escribiendo un analizador de estadísticas de visitantes de liveinternet. Si alguien acaba de unirse a nosotros, entonces le aconsejo que comience con donde nos conectamos al servicio sin autorización. Allí aprendimos cómo obtener contenido de páginas abiertas que no están protegidas con contraseña. Pero, de hecho, el acceso a la mayoría de los sitios está cerrado, por lo que hay muy poco uso para un script que no sabe cómo iniciar sesión, como comprenderá. Pero no te preocupes, lo arreglaremos ahora.

Fecha de publicación: 08.10.2013

¡Buenas tardes, lectores! Es hora de conseguir un poco de práctica. Ya tienes los conocimientos suficientes para empezar a escribir guiones útiles que te facilitarán el trabajo. Uno de estos puede ser un analizador. Lo que es, lo describí en detalle por mi cuenta, así que si no lo sabes, te aconsejo que lo leas. Brevemente, la esencia del analizador es buscar y aislar Información necesaria de un texto grande. En el caso de Internet, lo más frecuente es extraer los datos requeridos de las páginas de los sitios. En nuestro caso, será Liveinternet. ¡Entonces vamos!

Fecha de publicación: 10/03/2013

Este artículo se centrará en una herramienta tan poderosa como cURL, así como en una biblioteca php que brinda acceso a esta herramienta: libcurl. ¿Para qué es todo esto? Para comunicarse con el servidor a través de protocolos de transferencia de datos, como http o ftp. El resto de los protocolos no son de especial interés para nosotros, si alguien quiere profundizar en este tema, entonces tendrá que buscar recursos en idioma inglés, y este artículo contendrá los conceptos básicos y ejemplos de uso.

Fecha de publicación: 24.11.2012

Fecha de publicación: 05.11.2012

Y ahora habrá una lección bastante grande, pero no complicada, sobre cómo trabajar con archivos en php. En primer lugar, ¿para qué sirven los archivos? Después de todo, puede almacenar todo en la base de datos. datos mysql o PostgreSQL o lo que sea. Pero a veces hay tales tareas cuando el uso de la base de datos, con todo el procesamiento y la preocupación por la seguridad de la conexión, no es recomendable. Por ejemplo, necesita hacer un contador regular y antes de eso, no usamos una base de datos en nuestro proyecto. Entonces, ¿por qué deberíamos, por el bien de un pequeño contador, iniciar una base de datos y almacenar solo un par de líneas en ella? es mucho más fácil usar archivos. Además, a veces el alojamiento no admite bases de datos en absoluto, entonces los archivos generalmente siguen siendo la única salida.

Fecha de publicación: 04.11.2012

Siempre que permita que sus usuarios envíen texto a su sitio (nombre o cualquier otra información), debe tener cuidado. Debe asegurarse de no tener agujeros de seguridad en el sitio que los atacantes puedan usar para piratear. Si aún necesita recibir datos del usuario, asegúrese de usar la función htmlentities para evitar ejecutar código HTML o scripts que pueden ser dañinos y peligrosos.

Fecha de publicación: 04.11.2012

En esta lección, veremos técnicas para pasar datos entre formularios y páginas. Estos métodos son POST y GET. Hablaremos de cada uno por separado y con más detalle. En términos generales, es necesario para la comunicación entre formularios. Por ejemplo, completamos algunos campos en la página y necesitamos transferirlos a otra página para su procesamiento.

Fecha de publicación: 03.11.2012

De hecho, como ya habrás adivinado, el bucle do while es una versión ligeramente modificada del bucle while que vimos en tutoriales anteriores. Si recuerda cómo funciona el while normal, le resultará más fácil comprender el nuevo bucle. Repitamos: el cuerpo del bucle while se ejecuta si la condición es verdadera y no se ejecuta si no lo es, pero no se puede ejecutar ni una sola vez si la condición es falsa desde el principio. ¿Cómo funciona while?

Fecha de publicación: 03.11.2012

Imagine que tiene una matriz asociativa sobre la que desea iterar. PHP proporciona una manera fácil de usar cada elemento de una matriz a su vez utilizando la construcción Foreach.

Devuelve una matriz de objetos que contienen información de categoría.

Los parámetros que se pasan a esta función son muy similares a los parámetros que se pasan a la función wp_list_categories() y se pueden pasar como una matriz o como una cadena de consulta: type=post&order=DESC .

✈ 1 vez = 0.005625s = Muy lento| 50000 veces = 11.98s = despacio| PHP 7.1.11, WP 4.9.5

Uso

$categorias = get_categories($argumentos);

patrón de uso

$categorías = 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 llena parámetros, consulte la descripción de la función http://wp-kama.ru/function/get_terms)); if($categorías)( foreach($categorías as $gato)( // Datos en el objeto $gato // $gato->term_id // $gato->nombre (Categoría 1) // $gato->slug (rubrika - 1) // $gato->term_group (0) // $gato->term_taxonomy_id (4) // $gato->taxonomía (categoría) // $gato->descripción (Texto descriptivo) // $gato-> padre (0) // $cat->count (14) // $cat->object_id (2743) // $cat->cat_ID (4) // $cat->category_count (14) // $cat-> category_description (Texto de descripción) // $cat->cat_name (Categoría 1) // $cat->category_nicename (rubrika-1) // $cat->category_parent (0) ) ) taxonomía (línea) El nombre de la taxonomía a procesar. Añadido desde la versión 3.0.
Valor predeterminado: "categoría" escribe (línea)
  • post - categorías de post (predeterminado);
  • enlace - secciones de enlaces.
    Predeterminado: "publicar"
niño de (línea) Obtenga categorías secundarias (incluidos todos los niveles de anidamiento) de la categoría especificada. El parámetro especifica el ID de la categoría principal (la categoría cuyas categorías anidadas desea mostrar). padre (número) Obtiene las categorías cuya categoría principal es igual al parámetro de ID especificado. La diferencia con child_of es que se mostrará un nivel de anidamiento.
Por defecto: "" ordenar por (línea)

Ordenar los datos recibidos según ciertos criterios. Por ejemplo, por el número de publicaciones en cada categoría o por el nombre de la categoría. Están disponibles los siguientes criterios:

  • ID: clasificación por ID;
  • nombre - ordenar por nombre (predeterminado);
  • slug - clasificación por alt. nombre (babosa);
  • contar - por el número de entradas en la categoría;
  • term_group - por grupo.

Predeterminado: "nombre"

Ordenar (línea)

La dirección de clasificación especificada en el parámetro "orderby":

  • ASC: en orden, de menor a mayor (1, 2, 3; a, b, c);
  • DESC - en orden inverso, de mayor a menor (3, 2, 1; c, b, a).

Valor predeterminado: "ASC"

Hide_empty (lógico)

Ya sea para obtener o no categorías vacías (sin entradas):

  • 1 (verdadero) - no recibir vacío,
  • 0 (falso) - quedar vacío.

Valor predeterminado: verdadero

Jerárquico (lógico) Si el parámetro se establece en verdadero, el resultado incluirá categorías secundarias vacías cuyas categorías secundarias tengan entradas (no vacías).
Valor predeterminado: verdadero excluir (cadena/matriz) Excluye cualquier categoría de la lista. Debe especificar los ID de categoría separados por comas o en una matriz. Si se especifica este parámetro, se anulará el parámetro child_of.
Por defecto: "" incluir (cadena/matriz) Enumere solo las categorías especificadas. Debe especificar los ID de categoría separados por comas o en una matriz.
Por defecto: "" número (número) Límite. El número de categorías a recuperar. De forma predeterminada, sin restricciones: se recuperarán todas las categorías. pad_counts (lógico) Si es verdadero, entonces el número que muestra el número de entradas en las categorías principales será la suma de sus propias entradas y las entradas de las categorías secundarias.
Predeterminado: falso

Ejemplos

#1 lista desplegable

Para crear una lista desplegable de categorías, podemos usar otra función especial wp_dropdown_categories() :

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

sin embargo, con este enfoque, perderemos cierta flexibilidad al configurar la lista, ya que terminaremos con una lista completamente formada.

Por lo tanto, en algunos casos será más lógico crear una lista desplegable usando la función obtener_categorías(). Aquí hay un ejemplo (suponiendo que queremos mostrar las subcategorías (hijos) de la categoría 10):

#2 Lista de categorías y su descripción

Este ejemplo nos mostrará cómo enumerar enlaces a categorías, donde inmediatamente después de cada enlace habrá una descripción de la categoría (especificada al crear/editar una categoría):

"nombre", "pedido" => "ASC")); foreach($categorías as $categoría)( echo "

Categoría: term_id) . ""título="" . sprintf(__("Ver todas las publicaciones en %s"), $categoría->nombre) . "" " . ">" . $categoría->nombre."

"; eco "

Descripción:". $categoría->descripción".

"; eco "

Recuento de publicaciones: ". $categoría->recuento".

"; } ?>

notas

  • Ver: get_terms() Tipo de argumentos que se pueden cambiar.

Lista de cambios

Desde la versión 2.1.0 Introducido.

El código obtener categorías: wp-incluye/categoría.php WP 5.3.2

"categoría"); $argumentos = wp_parse_args($argumentos, $predeterminados); /** * Filtra la taxonomía utilizada para recuperar términos al llamar a get_categories(). * * @since 2.7.0 * * @param string $taxonomy Taxonomía para recuperar términos. * @param array $args Una matriz de argumentos. Ver get_terms(). */ $args["taxonomy"] = apply_filters("get_categories_taxonomy", $args["taxonomy"], $args); // Compatibilidad inversa si (isset($args["type"]) && "link" == $args["type"]) ( _deprecated_argument(__FUNCTION__, "3.0.0", sprintf(/* traductores: 1: " type => link", 2: "taxonomy => link_category" */ __("%1$s está en desuso. Use %2$s en su lugar."), " tipo => enlace", "taxonomía => link_category")); $args["taxonomy"] = "link_category"; ) $categories = get_terms($args); if (is_wp_error($categories)) ($categories = array(); ) else ($categories = (array ) $categorías; foreach (array_keys($categorías) as $k) ( _make_cat_compat($categorías[ $k ]); ) ) return $categorías; )

En este artículo (nivel de webmaster - avanzado), hablaremos, intersectando de diferentes maneras, de los llamados. navegación por facetas. Para simplificar la asimilación del material, recomiendo revisar el artículo de Wikipedia "Clasificación de facetas" y las publicaciones en inglés (¡pero con imágenes!) "Diseña una mejor navegación por facetas para tus sitios web".

La navegación facetada filtrada por color o rango de precios puede ser útil para sus visitantes, pero a menudo perjudicial para la búsqueda al crear múltiples combinaciones de direcciones con contenido duplicado. Debido a los duplicados, los motores de búsqueda no podrán rastrear rápidamente el sitio en busca de actualizaciones de contenido, lo que en consecuencia afecta la indexación. Para minimizar este problema y ayudar a los webmasters a facilitar la búsqueda de navegación por facetas, nos gustaría:

Ideal para usuarios y búsqueda de Google.

Limpiar la ruta a las páginas de productos/artículos:

Representando la URL de la página de categoría:
http://www.example.com/category.php?category=caramelos-gomosos

Representando una URL para un producto específico:
http://www.example.com/product.php?item=swedish-fish

Duplicados no deseados causados ​​por la navegación por facetas

La misma página es accesible desde diferentes direcciones web:

página canónica



URL: ejemplo.com/producto.php? item=pescado-sueco

Página duplicada



URL:ejemplo.com/producto.php? item=pescado-sueco&category=caramelos-gomosos&price=5-10


categoría=caramelos-gomosos&gusto=agrio&precio=5-10

Errores:

  • No tiene sentido para Google, ya que los usuarios rara vez buscan [mermelada de $9:55].
  • No tiene sentido que los rastreadores encuentren el mismo artículo ("ensalada de frutas") en las páginas de categorías principales (ya sea "Gummi" o "Sour Gummy").
  • Un punto negativo para el propietario del sitio, porque las solicitudes de indexación se diluyen con múltiples versiones de la misma categoría.
  • Un punto negativo para el propietario del sitio, porque es una carga inútil e innecesaria en el ancho de banda del sitio.
Paginas en blanco:


URL: ejemplo.com/categoría.php? categoría=caramelos-gomosos&gusto=agrio&precio=más-10

Errores:

  • Código mal dado para buscadores (en este caso, la página debería dar el código 404)
  • Página en blanco para los usuarios


Las peores soluciones (amigables con la búsqueda) para la navegación por facetas

Ejemplo 1: En la URL se utilizan parámetros no estándar: comas y corchetes, en lugar de clave=valor&:

  • ejemplo.com/categoría? [ categoría: caramelos de goma ] [ ordenar: precio de menor a mayor ] [ sid: 789 ]
  • ejemplo.com/categoría?categoría , caramelos de goma , ordenar , bajo a alto , sid , 789
Cómo:
ejemplo.com/categoría? categoría=caramelos de goma&sort=de menor a mayor&sid=789

Ejemplo #2: Uso de directorios o rutas de archivos en lugar de opciones en listas de valores que no cambian el contenido de la página:
ejemplo.com/c123/s789/product?swedish-fish
(donde /c123/ es la categoría, /s789/ es el ID de sesión, que no cambia el contenido de la página)

Buena decisión:

  • ejemplo.com /caramelos-gomosos/ product?item=swedish-fish&sid=789(el directorio, /gummy-candy/, cambia el contenido de la página de manera significativa)
La mejor solucion:
  • ejemplo.com/product?item=swedish-fish& categoría=caramelos de goma&sid=789 (Los parámetros de URL brindan más flexibilidad a los motores de búsqueda para determinar cómo rastrear de manera eficiente)
Es difícil para los rastreadores diferenciar los valores útiles (por ejemplo, "caramelo de goma") de los valores inútiles (por ejemplo, "SESSIONID") cuando estos valores se colocan directamente en la ruta del enlace. Por otro lado, los parámetros de URL brindan la flexibilidad para que los motores de búsqueda verifiquen y determinen rápidamente cuándo un valor dado no requiere acceso del rastreador a todas las variaciones.

Los valores comunes que no cambian el contenido de la página y deben enumerarse como parámetros de URL incluyen:

  • ID de sesión
  • Seguimiento de identificación
  • Identificadores de referencia
  • Marcas de tiempo
Ejemplo #3: Convierta los valores generados por el usuario (posiblemente infinitos) en parámetros de URL que se pueden rastrear e indexar pero que no sirven para la búsqueda.
Usar datos menores generados por los usuarios del sitio (como longitud/latitud o "hace días") en URL rastreadas e indexadas:
  • ejemplo.com/buscar-un-doctor? radio=15&latitud=40.7565068&longitud=-73.9668408
  • ejemplo.com/articulo?categoria=salud& hace días = 7
Cómo:
  • ejemplo.com/buscar-un-doctor? ciudad=san-francisco&barrio=soma
  • ejemplo.com/articulos?categoria=salud& fecha=10-enero-2014
En lugar de permitir que el usuario genere valores para generar URL rastreables (lo que da como resultado infinitas posibilidades con muy poco valor para los visitantes), es mejor publicar una categoría de página para los valores más populares y se puede incluir información adicional para hacer que la página sea más valiosa que la página de búsqueda normal con resultados. Alternativamente, podría considerar colocar los valores generados por el usuario en un directorio separado y luego usar robots.txt para deshabilitar el rastreo desde ese directorio.
  • ejemplo.com /filtración/ buscar-un-doctor?radius=15&latitude=40.7565068&longitude=-73.9668408
  • ejemplo.com /filtración/ artículos?categoría=salud&días-ago=7
Y en robots.txt:
Agente de usuario: *
Rechazar: /filtración/

Ejemplo #4. Agregar parámetros de URL sin lógica.

  • ejemplo.com /caramelos-de-goma/piruletas/caramelos-de-goma/ caramelos de goma/producto?pescado-sueco
  • ejemplo.com/producto? cat=caramelos de goma&cat=chupetines&cat=caramelos de goma&cat=caramelo-gomoso&item=pez-sueco
Buena decisión:
  • example.com /caramelo-gomoso/ product?item=pez-sueco
La mejor solucion:
  • ejemplo.com/producto? item=pez-sueco&category=dulces-de-goma
Los parámetros de URL extraños solo aumentan la duplicación y, como resultado, el sitio se rastrea e indexa de manera menos eficiente. Por lo tanto, es necesario deshacerse de los parámetros de URL innecesarios y limpiar periódicamente los enlaces basura antes de generar nuevas URL. Si se necesitan muchos parámetros para la sesión del usuario, es posible ocultar la información en las cookies, en lugar de agregar valores constantemente, como gato=caramelo-de-goma&gato=chupetines&gato=caramelo-de-goma& ...

Ejemplo #5: sugerir más refinamientos (filtrado) cuando hay resultados nulos.

Gravemente:
Permita que los usuarios seleccionen filtros cuando haya elementos nulos para refinar.


Refinamiento a una página con cero resultados (por ejemplo, precio = más de 10), lo que frustra a los usuarios y genera consultas innecesarias para los motores de búsqueda.

Cómo:
Cree enlaces solo cuando haya elementos para que el usuario seleccione. Si el resultado es cero, marque el enlace como "gris" (es decir, no se puede hacer clic). Para mejorar aún más la usabilidad, considere incluir un indicador de recuento de elementos junto a cada filtro.


No se permite mostrar una página con cero resultados (por ejemplo, precio = más de 10), además está prohibido que los usuarios hagan clics innecesarios y que los motores de búsqueda rastreen esta página no útil.

Es necesario evitar direcciones URL innecesarias y minimizar el espacio para visitantes generando direcciones URL solo cuando los productos están disponibles. Esto ayudará a mantener a los usuarios interesados ​​en su sitio (menos clics en el botón Atrás cuando no se encuentra ningún producto), reducirá la cantidad de posibles URL conocidas por los motores de búsqueda. Además, si la página no solo está "temporalmente agotada", sino que es poco probable que alguna vez contenga información relevante, considere darle un código de respuesta 404. En la página 404, puede diseñar un mensaje útil para los usuarios con más opciones de navegación o un cuadro de búsqueda para que los usuarios puedan encontrar productos relacionados.

Para los sitios nuevos cuyos webmasters están considerando implementar la navegación por facetas, hay varias opciones para optimizar el rastreo (la recopilación de direcciones en su sitio conocidas por Googlebot) de páginas de contenido único y reducir la indexación de páginas duplicadas en los motores de búsqueda (consolidación de señales de indexación).

Determine qué parámetros de URL se requieren para que los motores de búsqueda rastreen cada página individual de contenido (es decir, determine qué parámetros se requieren para crear al menos una ruta de clic para cada elemento). Los parámetros requeridos pueden incluir item-id , category-id , página, etc.

Determine qué parámetros serán útiles para los visitantes con sus consultas y cuáles es más probable que causen duplicación en el rastreo y la indexación. En el ejemplo de confitería (mermelada), el parámetro de URL "sabor" podría ser valioso para los usuarios con las consultas del ejemplo. sabor=agrio . Sin embargo, es lógico considerar que el parámetro "precio" provoca una duplicación innecesaria categoría=caramelos-gomosos&sabor=agrio& precio = más de 10 . Otros ejemplos comunes:

  • Parámetros valiosos para los motores de búsqueda: id-artículo, id-categoría, nombre, marca...
  • Parámetros innecesarios: session-id, precio-rango...
Considere implementar una de varias opciones de configuración para direcciones URL que contienen parámetros innecesarios. ¡Solo asegúrese de que los parámetros de URL "innecesarios" no sean realmente necesarios para que los rastreadores rastreen o para que el usuario encuentre cada producto individual!

Opción 1: y enlaces internos

Marque todas las URL innecesarias con el . Esto reducirá los costos de mano de obra del robot de búsqueda y evitará una disminución en la frecuencia de escaneo. Debe administrar globalmente el rastreo a través de robots.txt (Nota del traductor: consulte el artículo "").
Use el atributo rel="canonical" para separar las páginas del índice de búsqueda de las páginas que no se necesitan allí (por ejemplo, en la página precio=5-10 puede escribir el atributo rel="canonical", indicando la categoría de toda la mermelada agria ejemplo.com/category.php?category=caramelos-gomosos&gusto=agrio& página = todo ).

Opción 2: Robots.txt y Disallow

Las URL con parámetros innecesarios se incluyen en el directorio /filtering/, que se cerrará en robots.txt (prohibir no permitir). Esto permitirá que todos los motores de búsqueda rastreen solo el intravínculo (contenido) "correcto" del sitio, pero bloqueará el rastreo de las URL no deseadas a la vez. Por ejemplo ( ejemplo.com/category.php?category=caramelos-gomosos), si los parámetros valiosos fueran artículo, categoría y gusto, y el ID de sesión y el precio fueran redundantes, entonces la URL para gusto sería:
ejemplo.com/category.php?category=caramelos-gomosos& sabor=agrio, pero todos los parámetros innecesarios, como el precio, la URL incluirá en un directorio predefinido - /filtrado/:
ejemplo.com /filtración/ category.php?category=caramelos-gomosos&price=5-10,
que luego será prohibido a través de robots.txt:
Agente de usuario: *
No permitir: /filtrado/

Opción 3: hosts separados

Asegúrese de que las mejores soluciones enumeradas anteriormente (para direcciones basura, por ejemplo) aún se apliquen. De lo contrario, los motores de búsqueda ya han formado una gran masa de enlaces en el índice. Por lo tanto, su trabajo tendrá como objetivo reducir el crecimiento adicional de páginas innecesarias vistas por Googlebot y consolidar las señales de indexación.

Utilice parámetros con codificación estándar y formato clave=valor.

Asegúrese de que los valores que no cambien el contenido de la página, como los ID de sesión, se implementen como clave=valor, no como directorios.

No permita clics y no genere URL cuando no haya elementos para filtrar.

Agregue lógica al mapeo de parámetros de URL: elimine parámetros innecesarios en lugar de agregar valores todo el tiempo (por ejemplo, evite generar un enlace como este: example.com/product?cat=caramelos-de-goma&cat=piruletas &cat=caramelos-de-goma&item=pez-sueco).

Almacene parámetros valiosos en la URL enumerándolos primero (porque las URL son visibles en los resultados de búsqueda) y los parámetros menos relevantes al final (como la ID de sesión).
Evite esta estructura de enlace: ejemplo.com/categoria.php? sesión-id=123&seguimiento-id=456&category=caramelos-gomosos&sabor=agrio
Ajuste la configuración de URL en las Herramientas para webmasters de Google si tiene una comprensión clara de cómo funcionan los enlaces en su sitio.

Asegúrese de que cuando use JavaScript para administrar contenido dinámicamente (ordenar/filtrar/ocultar) sin actualizar la URL, haya direcciones web reales en su sitio que tengan valor de búsqueda, como categorías principales y páginas de productos, que se puedan rastrear e indexar. Trate de no usar solo la página de inicio (es decir, una URL) para todo su sitio, pero cambie dinámicamente el contenido de la navegación a través de JavaScript; esto, desafortunadamente, le dará a los usuarios solo una URL en la búsqueda. Además, asegúrese de que el rendimiento no afecte negativamente al filtrado dinámico, ya que impedirá que el usuario trabaje con el sitio.

Mejore la indexación de diferentes páginas del mismo contenido especificando el atributo rel="canonical" en la versión privilegiada de la página. El atributo rel="canonical" se puede utilizar dentro de uno o más dominios.

Optimice la indexación de contenido "paginado" (por ejemplo, página = 1 y página = 2 de la categoría "caramelos de goma") por (ya sea):

  • Agregue un atributo rel="canonical" a una serie de páginas especificando la categoría canónica con el parámetro "ver todo" (por ejemplo, página=1, página=2 y página=3 de la categoría "caramelos de goma" con rel=” canónico” en categoría=caramelos-gomosos&página=todos), asegurándose de que la página sea relevante para los usuarios y se cargue rápidamente.
  • Utilice el marcado de paginación rel="next" y rel="prev" para indicar la relación entre páginas individuales (consulte "Paginaton with rel="next" y rel="prev" ").
Incluya solo enlaces canónicos en los mapas de sitio.

Entonces, para empezar, describiré con qué trabajaremos y qué necesitaremos.
Sistema: PHP 5 y superior, mySQL 4 y superior
clases de ayuda: dbsql.class.php (clase de base de datos)
Clase de categoría anidada: classTreeCategory.php (directamente la clase principal, su listado y explicaciones se dan a continuación.

Cree una tabla en la base de datos con la siguiente estructura:

Ver código MySQL

Esta tabla contiene un campo. IDENTIFICACIÓN- número de serie de la categoría, vaina- tiene un valor de cero para las categorías de primer orden o el ID de la categoría principal, nombre- nombre de la categoría.

Un ejemplo de la clase, que muestra las categorías como una lista con subcategorías:

Ver código PHP

include("dbsql.class.php") ; include("classTreeCategory.php" ); $DB = new DB_Engine("mysql" , $configuraciones [ "dbHost" ] , $configuraciones [ "dbUser" ] , $configuraciones [ "dbPass" ] , $configuraciones [ "dbName" ] ); // conectarse a la base de datos, especificando los datos de acceso$categoría = new TreeCategory ($DB); // pasar a la clase de categoría, el objeto de trabajo con la base de datos$categoria -> tabla = "categoria" ; // nombre de la tabla en la base de datos con categorías$matriz = $categoría -> getCategory() ; // obtener todas las categorías de la base de datos en forma de una matriz de varios niveles, ordenada y anidada ya en el orden que necesitamos$categoría -> outCategory ($array, "opción"); // preparando la salida de categorías (formando HTML), pasando una matriz con categorías echo $categoria -> html ; // categorías de salida como HTML

Como puede ver en el ejemplo anterior, todo es extremadamente simple, creamos un nuevo objeto $categoría, establecemos con qué tabla de base de datos trabajaremos: 'categoría', luego obtenemos de la tabla una lista de todas las categorías ya formateadas como una matriz y descompuesto en un orden jerárquico, teniendo en cuenta todas las subcategorías. luego pasamos la matriz al método outCategory(), que genera un código HTML listo para usar, que solo queda para mostrarlo en el navegador.

El método outCategory(), como podemos ver, toma dos parámetros @array y @string en el primer parámetro una matriz con todas las categorías, y en el segundo una cadena que contiene un valor opción o mesa, este valor especifica qué tipo de código HTML generar.
Sentido opción

Ver código HTML

Para insertar el código HTML dado en el campo de selección de cualquier formulario.

Sentido mesa- genera el siguiente código HTML:

Ver código HTML

Este código HTML es útil para pegarlo en una tabla que muestra todas las subcategorías de nuestras categorías.

La clase también tiene los siguientes métodos:
eliminarElemento($id);- elimina una categoría, a pesar de las anidadas
delCategory($matriz, $id);- elimina una categoría con todas las subcategorías anidadas, $array - una matriz con todas las categorías preparadas por el método $category->getCategory(), $id - número de la categoría que se eliminará
añadir artículo();- se debe llamar a este método si desea agregar una categoría, mientras que este método lee los valores de los datos transmitidos por el método POST, es decir de la matriz $_POST.
$nombre=$esto->PHP_slashes(strip_tags($_POST['nombre'])); // nombre de la categoría
$podcat=intval($_POST['podcat']); // ID de la categoría principal, si se especifica 0, la categoría estará en la raíz.
actualizar elemento (); - similar al método anterior, excepto que este método actualiza la categoría, su nombre y el nivel de anidamiento.

tabla="categoría"; // solicitud para seleccionar una lista de categorías, nombre de la tabla * $categoría->outCategory($categoría->getCategory()); // preparar la salida de la categoría (solicitar una matriz de categorías) * echo $categoría->html; // mostrar categorías en nombre HTML * */ /** * Volcar la tabla en la que se está trabajando * * 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`), * CLAVE `id` (`id`) *) MOTOR=MyISAM DEFAULT CHARSET=utf8; * */ class TreeCategory ( /** * Cadena de consulta de la base de datos */ var $table; /** * Interfaz de la base de datos */ var $DB; /** * Matriz de categorías con subcategorías anidadas */ var $arrayCat; / ** * Cuenta automáticamente el número de guiones antes del nombre de la categoría cuando se muestra */ var $countPodcat; /** * Código HTML para mostrar categorías con subcategorías */ var $html; /** * Obtén la interfaz para trabajar con la base de datos y ponerlo en una variable local */ function __construct($DB) ( $this->DB=$DB; $this->component=$_GET["component"]; ) /** * Obtiene una lista de categorías, ordena y lo coloca en una matriz con matrices anidadas, etc. * @return categoría de matriz */ function getCategory () ( $all = $this->DB->getAll("SELECT * FROM `($this->table)` ORDER BY `id` ASC"); $ruta = matriz(); if(contar($todos)>0) ( foreach($todos como $elemento): if($elemento["podcat"]==0)$ordenar[ $elemento[ "id"]]=$elemento; if($elemento["podcat"]>0) ( if(isset($ruta[$elemento["podcat"]])) ( $str="$sort" ; foreach ($ruta[$elemento["podcat"]] as $elemento): $rep =$elemento["podcat"]; $str.="[$pitem]"; endforeach; $str.="[($elemento["podcat"])]"; $str.="[($elemento["id"])]"; $str.="=$elemento;"; evaluar ($ cadena); foreach($ruta[$elemento["podcat"]] as $pitem): $ruta[$elemento["id"]]=$pitem; endforeach; $ruta[$elemento["id"]]=$elemento["podcat"]; ) else ( $ordenar[$elemento["podcat"]]["sub"][$elemento["id"]]=$elemento; $ruta[$elemento["id"]]=$elemento["podcat" ]; ) ) endforeach; ) $this->arrayCat=$sort; devuelve $this->arrayCat; ) /** * Imprime las categorías, coloca el HTML terminado en $this->html * @param array Array con categorías y subcategorías anidadas * @param string Tipo de código HTML generado para salida, opción o tabla */ 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--; ) ) /** * Método auxiliar para preparar código HTML * @param array Array con categoría * @param string Tipo de código HTML generado para salida, opción o tabla */ function outItem($sub, $type="option", $idSel=0) ( for($i=0;$ icountPodcat;$i++) ($out. ="-"; ) if($idSel==$sub["id"])$se="seleccionado"; más $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="ELIMINAR DE ($esta->tabla) 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="ELIMINAR DE ($this->table) WHERE id = "($sub["id"])" LIMIT 1"; $this-> DB->execute($sql); if(isset($sub["sub"]))$this->delCategory_process($sub["sub"]); ) ) función updateItem() ( $name=$this- >PHP_slashes(strip_tags($_POST["name"])); $podcat=intval($_POST["podcat"]); $id=intval($_POST["id"]); $sql="ACTUALIZAR `( $this->table)` SET `name` = "($name)",`podcat` = "($podcat)" WHERE `id`="($id)" LIMIT 1; "; $this->DB ->ejecutar($sql); ) función addItem() ( $nombre=$esto->PHP_slashes(strip_tags($_POST["nombre"])); $podcat=intval($_POST["podcat"]); $ id=intval($_POST["id"]); $sql="I NSERT INTO `($this->table)` (`id`,`podcat`,`name`) VALORES ("", "$podcat", "$nombre");"; $esto->BD->ejecutar($sql); ) function deleteItem($id) ( $id=intval($id); $sql="DELETE FROM `($this->table)` WHERE `id` = "($id)" LIMIT 1"; $DB- >ejecutar($sql); encabezado("Ubicación: ?component=($este->componente)"); ) función PHP_slashes($cadena,$tipo="agregar") ( if ($tipo == "agregar") ( if (get_magic_quotes_gpc()) ( return $string; ) else ( if (function_exists("addslashes")) ( return addedlashes($string); ) else ( return mysql_real_escape_string($string); ) ) ) else if ($type == "strip") ( return stripslashes($string); ) else ( die("error en PHP_slashes (mixto, agregar | strip)"); ) ) )

Toda la clase se escribió en una hora y, por supuesto, tiene fallas, pero todo esto tiene arreglo. Su uso es recomendable con fines educativos, aunque por cierto, habiéndolo terminado un poco, puedes incrustarlo en cualquier sistema y disfrutar de su trabajo)).

Le agradecería que en los comentarios ofreciera sus propias opciones para resolver este problema: organizar categorías de un nivel de anidamiento infinito.