Contactos

ID de pago del menú propio de Inurl php. Menú multinivel en PHP y MySQL. #7 Agrega clases de CSS a todos los menús

En el penúltimo artículo del blog, escribí sobre una innovación interesante en la última versión de WordPress: un mecanismo especial para crear y administrar archivos . Ahora se ha vuelto mucho más conveniente y fácil para los usuarios comunes crear menús de diversa complejidad, que pueden consistir no solo en páginas o categorías de blogs, sino también tener enlaces a cualquier URL. Para mostrar el menú en la plantilla, se utiliza una función especial wp_nav_menu; te lo contaré hoy.

Si no hay una sección de menú en el administrador de WordPress, entonces se puede activar agregando un código especial al archivo funciones.php

Aquí primero está el nombre del menú que creamos. Este es el uso de una función en el caso general sin widgets, allí necesitarás trabajar con ellos de manera un poco diferente. Sin embargo, la función wp_nav_menu también se puede mostrar sin argumentos, como resultado de lo cual se “verán” diferentes situaciones: primero, una coincidencia por el nombre del menú, si se especifica al menos un elemento de menú para él; -Se mostrará un menú vacío, etc. Pero nuevamente, le aconsejo que simplemente use el código anterior y no averigüe qué debería generar la función sin argumentos. Su sintaxis se ve así:

Aquí se utilizan los siguientes parámetros:

$menú- el identificador seleccionado para el menú - ID, slug o nombre del menú.

$contenedor- el menú UL predeterminado está "envuelto" en un contenedor DIV usando esta configuración.

$ clase_contenedor- indica la clase del contenedor, por defecto su valor es menú-(menu slug)-contenedor, es decir, en nuestro caso, por ejemplo, habrá una clase menú-primer-contenedor.

$id_contenedor- puede agregar una ID al contenedor, no está especificada de forma predeterminada.

$menú_clase es la clase para el elemento del menú UL, su valor es menú.

$id_menú- ID del elemento ul, por defecto menú-(slug)

$ eco- si no desea mostrar el menú, pero devolver el valor de la función, utilice el valor 0 para esta configuración.

$fallback_cb- si el menú no existe, se llama a la función wp_page_menu.

$ antes- establece el texto que se muestra antes del enlace A.

$enlace_antes— muestra una frase antes del texto del enlace, no configurada.

$enlace_después- se muestra después del texto del enlace, también vacío.

$profundidad- establece el número de niveles de jerarquía para mostrar el menú; el valor predeterminado de 0 muestra el menú completo.

$caminante- algún tipo de "objeto caminante" de usuario incomprensible, probablemente los desarrolladores más avanzados lo necesitarán.

$ubicación_tema- La ubicación del tema donde se utilizará el menú debe activarse mediante Register_nav_menu() para que el usuario pueda seleccionarlo. También algún tipo de configuración no del todo clara, aparentemente, cuando se trabaja con widgets.

Ejemplos de uso de la función wp_nav_menu

El código más simple dado en el códice:

Quitar el contenedor DIV del menú

"")); ?>

En principio, no hay nada complicado en crear y gestionar menús de WordPress 3.0. Los desarrolladores han simplificado enormemente el procedimiento de trabajo y ampliado las capacidades de este elemento de navegación. La solución se utiliza a menudo en muchas tareas de plantillas, por ejemplo, al crear versiones para dispositivos móviles y de escritorio. Un poco más tarde agregaré un par de fragmentos más sobre el tema.

PD Guardia. Interesante y útil para webmasters Blog sobre SEO, donde encontrarás respuestas a tus dudas sobre SEO.
La empresa Aweb se ha consolidado desde hace mucho tiempo en el campo de la promoción, optimización y promoción de sitios web en Internet.

Si está interesado en la respuesta a la pregunta de cómo crear un menú para un sitio web, ha venido al lugar correcto.

Veremos cómo crear un menú dinámico en PHP, escrito específicamente para principiantes en programación, así como para aquellos que todavía están en el tanque.

Lección 3

Creemos el diseño futuro de nuestro sitio. Para hacer esto, dibuja un sitio web súper hermoso en Photoshop y córtalo en pedazos. Imaginemos que el encabezado, el logotipo, el menú y el pie de página no están escritos con palabras, como en este ejemplo, sino que son elementos del sitio diseñados de forma exquisita y colorida.

Por ejemplo, creemos tres páginas y llamémoslas Sección 1, Sección 2, Sección 3.

Este texto será diferente para diferentes páginas, pero no nos molestaremos con él y lo dejaremos como está en todas las páginas.

Comencemos a crear un sitio web en php.

1. Separe los bloques de encabezado, logotipo, menú y pie de página en archivos separados con la extensión php o html.

encabezado.html

logotipo.html

menú.html

pie de página.html

Agreguemos un archivo con este texto para verlo en todas las páginas. llamémoslo texto.html

Nota. A partir de ahora guardaré más registros directamente en el expediente. texto.html

2. Creemos una plantilla para nuestro sitio en php.

Para hacer esto, hagámoslo simplemente: guarde el archivo real, pero con la extensión php y borre todo el contenido del texto. Que no sea profesional, pero es comprensible, y luego complicaremos todo. Ahora lo principal es comprender el principio de diseño.

3. Ahora no necesitamos el archivo template.html.

Gracias a él tenemos una idea de cómo será nuestro sitio.

4. Nuestra plantilla es el archivo template.php.

Ahora insertaremos todos los elementos del sitio usando el comando de inclusión.

5. Creemos tres páginas, como pretendíamos originalmente.

Sección 1, llamemos 1.php

Sección 2, llamemos 2.php

Seccion 3, llamemos 3.php

Para hacer esto, puedes usar el comando más simple. guardar como...

Para los más pequeños os lo explico: abre el archivo. plantilla.php, entonces presione guardar como... y guardar bajo el nombre 1.php, repita el procedimiento y guarde secuencialmente las páginas del sitio 2.php, 3.php

Tenemos 3 páginas con el mismo diseño. Basta con insertar en lugar de un archivo. texto.html otro, complementarlo con diferentes imágenes o códigos html, scripts y el contenido de cada página será único.

¡Atención!

Si el archivo no se crea index.php para la página principal, luego en el navegador, al escribir la dirección del sitio, no veremos el sitio en sí, sino solo la estructura del directorio (lista de carpetas).

Puedes buscar en Denver y comprobarlo por ti mismo. Arreglemos la situación: cree un archivo index.php y llama durante mucho tiempo sin más hogar. Creemos un archivo texto-inicio.html y con el comando incluir Pegue en la página principal del sitio recién creada.

6. ¿Cómo ver un sitio en php?

Lo que pasó, así que simplemente no lo veas. Esta ya no es una plantilla con extensión html.

Pero tampoco es un problema. Necesitamos el nuestro, es decir. servidor local en la computadora. Para ello instalaremos Denver y miraremos el resultado de nuestro trabajo en el navegador sin necesidad de conectarnos.

Ahora aquí está el orden. Escribí la dirección del sitio y vi todo lo que acababa de crear en forma normal con un diseño.

Ahora tomemos el menú del sitio php.

1. Abra el archivo menu.html y convierta las secciones 1, 2 y 3 en enlaces a sitios. Los enlaces en PHP se crean de diferentes maneras.

Nuestra tarea es aprender a sentir el sitio creado en PHP. Por lo tanto, crearemos enlaces, como en un sitio estático normal, Sección 1, etc.

Me gusta mucho este procedimiento de creación de enlaces en Macromedia Dreamweaver. Tener tiempo para cosechar DE ACUERDO y tomar café.

2. Cómo hacer que un enlace en el menú esté inactivo si el visitante está en esta página.

Será más conveniente para el visitante navegar por el sitio sabiendo en qué página se encuentra.

Si ha completado todos los pasos estrictamente punto por punto, podrá ver que todos los enlaces del menú están constantemente activos con nosotros. ¿Como arreglarlo?

Primero, recordemos la definición de lo que es Declaraciones condicionales

- esto es cuando alguna acción se realiza o no dependiendo de las condiciones.

Hagamos lo siguiente:

  • Necesitaremos variables y uno operador condicional:

si ($maestro == "Maestro")// esta condición. Si se ejecuta, en este lugar del menú, usando el comando echo, se insertan etiquetas HTML ordinarias en las que se muestra la inscripción "Inicio".

eco "

hogar

";

demás//significa "de lo contrario": qué sucede si no se cumple la condición. En este caso, si no se cumple la condición, la inscripción "Principal" será un enlace que conducirá a la página principal.

eco "

hogar

";

  • Se nos ha ocurrido una condición, pero para verificar variablenecesitas preguntarlo.

Para hacer esto, coloque los siguientes bloques de código en todas las páginas:

$maestro ="Maestro";

$master ="Sección 1";

$master ="Sección 2";

$master ="Sección 3";

Como puedes ver, cada página tiene su propio código.

Entonces, nuestros pasos prácticos para crear un menú php serán los siguientes:

1) Abriendo el archivo index.php

y pega el codigo

$maestro ="Maestro";

al punto de inserción del código que muestra el menú del sitio incluir "menú.html";
?>

2) Abriendo el archivo menú.html e inserte el código con la condición en lugar de un simple enlace html a la página principal.

¡Miramos en el navegador y admiramos! Si vamos a la página principal, ¡el enlace ya no está activo!

3) Repita los pasos 1 y 2 con las páginas. 1.php, 2.php, 3.php

Repetición 1:

1) Abra el archivo 1.php y pegue antes del código que muestra el menú un bloque con una variable determinada

$master ="Sección 1";

2) Abra el archivo menu.html y pegue el código con la condición en lugar de un simple enlace Sección 1 realizando los siguientes cambios:

if ($master == "Sección 1")// esta condición. Si se ejecuta, en este lugar del menú, usando el comando echo, se insertan etiquetas HTML ordinarias que muestran la inscripción "Sección 1".

eco "

Sección 1

";

demás//significa "de lo contrario": qué sucede si no se cumple la condición. En este caso, si no se cumple la condición, la inscripción "Sección 1" será un enlace que conducirá a la página principal.

eco "

Sección 1

";

¡El milagro ocurrió otra vez! Ahora si estamos en la pagina. Sección 1, el enlace en el menú no está activo.

¡La repetición es la madre del aprendizaje! ¡O para los que están en el tanque! De nuevo

repetición 2

1) abierto archivo 2.php y pega el código.

$master ="Sección 2";

2) Abra nuevamente el archivo menu.html y pegue el código con la condición

if ($master == "Sección 2")// esta condición. Si se ejecuta, en este lugar del menú, usando el comando echo, se insertan etiquetas HTML ordinarias que muestran la inscripción "Sección 2".

eco "

Sección 2

";

demás//significa "de lo contrario": qué sucede si no se cumple la condición. En este caso, si no se cumple la condición, la inscripción "Sección 2" será un enlace que conducirá a la página principal.

eco "

Sección 2

";

repetición 3

1) Nosotros abrimos archivo 3.php y establecer la variable.

$master ="Sección 3";

2) En el archivo menu.html, inserte el código con la condición en lugar del enlace Seccion 3, los cambios son:

if ($master == "Sección 3")// esta condición. Si se ejecuta, en este lugar del menú, usando el comando echo, se insertan etiquetas HTML ordinarias que muestran la inscripción "Sección 3".

eco "

Seccion 3

";

demás//significa "de lo contrario": qué sucede si no se cumple la condición. En este caso, si no se cumple la condición, la inscripción "Sección 3" será un enlace que conducirá a la página principal.

eco "

Seccion 3

";

Resultado: nosotros en lugar de enlaces en el menú de este tipo

hogar


Sección 1

Sección 2


Seccion 3

Este tutorial de PHP fue escrito por demanda popular de los visitantes del sitio y es una guía práctica para aprender a crear un menú dinámico para un sitio PHP.

La siguiente hoja de referencia para webmasters le indicará cómo crear títulos, descripciones y palabras clave únicos para cada página en php.

Puede descargar el archivo con todas las plantillas del sitio y los archivos de menú php. Recomendado para principiantes en programación.

Si está preparado para un estudio serio de PHP, entonces será difícil encontrar un mejor curso en vídeo de Popov. Tiene mucha experiencia y un buen estilo.

]]> ]]>

Porque expone el contenido del módulo menu.php. A continuación se muestra mi propio desarrollo de menú en PHP, que fue escrito desde cero en un bloc de notas.

Este código será especialmente útil para sitios dinámicos que tienen motores escritos por ellos mismos. Ofreceré dos versiones del código que tienen diferencias menores (diferencia que se explicará más adelante).

Para empezar, daré una estructura aproximada del sitio para el que es adecuado este menú. La estructura del sitio debería verse así (vista clásica):

/index.html /section_1/ /razdel_1/articles_1.html /razdel_1/articles_2.html ... /razdel_2/ /razdel_2/articles_1.html /razdel_2/articles_2.html ... ... ... /razdel_N/articles_2 .html

El sitio también puede contener subsecciones para las secciones:

/section_1/podzaderl_1/ /section_1/podzaderl_1/articles_1.html /section_1/podzaderl_1/articles_2.html ... /section_1/podzaderl_2/articles_1.html /section_1/podzaderl_2/articles_2.html

Esta estructura también funcionará para nuestro menú con sólo pequeñas diferencias.

Sugiero crear un archivo separado para el menú en php. Por ejemplo, menu.php sería un buen nombre para dicho archivo. Para implementar el menú, también se introduce el estilo del menú CSS para hacerlo más o menos hermoso de inmediato. Naturalmente, este estilo se da sólo como referencia, ya que los diseños de los sitios son muy diferentes.

Código de estilo de menú CSS:

.menu (altura:42px; relleno:0 0 0 16px; fondo:url(images/spacer.png) repetir; ) .menu li ( display:block; float:left; ) .menu li.active (fondo: #000011 ; ) .menu a ( color:#FFF; display:block; line-height:42px; text-decoration:none; padding:0 14px; ) .menu a:hover ( background:url(images/spacer.png) repetir ; )

Ahora, echemos un vistazo a la primera implementación del menú en PHP, que es un poco simplificada.

La primera versión del código del menú en PHP.

\n"; para ($i=0;$i ": "
  • "; eco " ".$array_menu[$i]["nombre"]."
  • \n"; ) eco ""; ?>

    El menú se puede dividir en dos partes. El primero contiene una matriz de información $array_menu, que contiene los nombres de nuestras secciones con enlaces a las secciones. Existe la opción de poner estos datos en la base de datos MySQL, pero esto no tiene mucho sentido, ya que la muestra es muy pequeña, por lo que esto no afectará la velocidad del trabajo.

    La segunda parte contiene la salida del menú a través del bucle for. El bucle compara la dirección del sitio web con la dirección de la matriz $array_menu. Si hay una coincidencia, mostramos la siguiente sección del menú con una clase especial activa:

  • , de lo contrario solo
  • . Esto nos permite resaltar con algún color aquella parte del menú en la que se encuentra el usuario. En mi opinión, esto es algo necesario en cualquier sitio para que el usuario pueda entender en qué sección se encuentra.

    El orden en la matriz se conservará al mostrar el menú en el sitio. Es decir, la matriz debe completarse en el orden en que desea mostrar el menú.

    Nota:
    En caso de que las URL (direcciones) del encabezado de las secciones se vean así:
    /sección 1
    o tal
    /sección_1/nombre_razdela.html
    luego en array_menu necesitas escribir la coincidencia exacta:
    $array_menu[$i]["url"]="/sección_1"
    o para el segundo caso:
    $array_menu[$i]["url"]="/section_1/nazvanie_razdela.html";

    ¿Cómo funciona la primera opción del menú?
    Solo resalta el menú si se encuentra en la dirección del encabezado de la sección. Por ejemplo, si la dirección de la página es /section_1/articles_1.html, el menú no se resaltará de ninguna manera.

    La segunda versión del código es una versión modificada de la primera y ofrece la posibilidad de resaltar el menú incluso en artículos que están divididos en secciones.

    La segunda versión del código del menú en PHP.

    "; para ($i=0;$i ": "
  • "; echo "".$array_menu[$i]["título"]."
  • "; ) else ( echo ($URL) == ($array_menu[$i]["url"])? "
  • ": "
  • "; echo "".$array_menu[$i]["título"]."
  • "; ) ) eco ""; ?>

    Muestra un menú personalizado creado en el panel: Apariencia > Menús.

    El menú de navegación que se mostrará (puede haber varios) se especifica en el parámetro theme_location.

    Si no se especifica el parámetro theme_location, el menú para mostrar se seleccionará en el siguiente orden:

      Un menú que coincida con el ID, slug o descripción pasados ​​en el parámetro "menú" y si hay al menos un enlace (un elemento) en este menú;

      de lo contrario, el primer menú no está vacío;

      o muestra el valor devuelto por la función especificada en el parámetro "fallback_cb" (de forma predeterminada, la función wp_page_menu se especifica allí);

    1. si nada coincide, la función no generará nada.

    Para que el tema admita menús, debe habilitar esta función con:
    add_theme_support("menús");

    O puede registrar un lugar para el menú con Register_nav_menu(), luego el soporte del menú del tema se habilitará automáticamente.

    Filtros de cambio de elementos del menú

    • add_filter("wp_nav_menu_args", "my_wp_nav_menu_args"); función my_wp_nav_menu_args($args = ""))( $args["contenedor"] = false; devolver $args; )

      #4.1. Quitemos el contenedor, solo uno, el menú mostrado.

      "" ]); ?>

      #5 Retire el envoltorio ul

      Este ejemplo eliminará el contenedor ul del menú:

      "%3$s" ]); ?>

      #6 Agrega una palabra en la parte superior del menú

      Este ejemplo muestra cómo agregar una palabra al principio de una lista de menú, como el mismo elemento de menú, pero no como un enlace. Agreguemos la palabra "Lista" al principio del menú y también especifiquemos el atributo de identificación para la etiqueta li creada:

      "primario", "items_wrap" => "

      • Lista:
      • %3$s
      " ]); ?>

      #7 Agrega clases de CSS a todos los menús

      Usando un gancho, podemos agregar nuestras propias clases CSS si se cumple la condición que necesitamos.

      Agreguemos una clase CSS si es una publicación y el nombre del elemento del menú es "blog":

      Add_filter("nav_menu_css_class", "special_nav_class", 10, 2); función special_nav_class($clases, $item)( if(is_single() && $item->title == "Blog"){ $classes = "special-class"; } return $classes; } !}

      #8 Usando tu función para crear un menú

      Primero, debe especificar el argumento "walker" => new Your_Walker_Function.

      Your_Walker_Function es nuestra nueva clase que crea el menú. Para no reinventar la rueda, se puede copiar del original, consulte la clase Walker_Nav_Menu. Copiamos el código de la clase y lo arreglamos cuando sea necesario.

      Aquí hay un ejemplo que agrega profundidad de menú y clases CSS pares/impares a los elementos del menú (tanto ul como li):

      // clase de creación de menú personalizado: clase magomra_walker_nav_menu extiende Walker_Nav_Menu ( // agrega clases a la función de submenús ul start_lvl(&$output, $profundidad) ( // clases dependientes de la profundidad $indent = ($profundidad > 0 ? str_repeat("\ t", $profundidad): ""); // sangría del código $display_profundidad = ($profundidad + 1); // porque cuenta el primer submenú como 0 $clases = array("submenú", ($display_profundidad % 2 ? "menú-impar" : "menú-par"), ($display_profundidad >=2 ? "sub-sub-menú" : ""), "menú-profundidad-". $display_profundidad); $class_names = implosionar( " ", $clases); // compilar html $salida .= "\n" . $sangría . "

        " . "\n"; ) // agrega clases principales/sub a la función li"s y enlaces start_el(&$output, $item, $profundidad, $args) ( global $wp_query; $indent = ($profundidad > 0 ? str_repeat("\t", $profundidad): ""); // sangría de código // clases dependientes de la profundidad $profundidad_clases = array(($profundidad == 0 ? "elemento-menú principal" : "submenú- elemento"), ($profundidad >=2 ? "sub-sub-menú-elemento" : ""), ($profundidad % 2 ? "menú-elemento-impar" : "menú-elemento-par"), "menú -item-profundidad-" . $profundidad); $profundidad_clases_nombres = esc_attr(implode(" ", $profundidad_clases)); // clases pasadas $clases = vacía($item->clases) ? matriz() : (matriz) $ elemento->clases; $class_names = esc_attr(implode(" ", apply_filters("nav_menu_css_class", array_filter($clases), $item))); // compilar html $output .= $indent . "
      • ) devolver $artículos; ) función __nav_hasSub($item_id, $items)( foreach($items as $item)( if($item->menu_item_parent && $item->menu_item_parent == $item_id) devuelve verdadero; ) devuelve falso; )

        #11 Agregar una clase a elementos de menú individuales

        A partir de la versión 4.1.

        Hay un enlace especial para esto: nav_menu_css_class. Y ahora se pueden agregar o eliminar clases a través de él. Por ejemplo, agreguemos la clase my__class a todos los elementos del menú:

        Add_filter("nav_menu_css_class", "add_my_class_to_nav_menu", 10, 2); function add_my_class_to_nav_menu($classes, $item)( /* $classes contiene Array( => menu-item => menu-item-type-post_type => menu-item-object-page => menu-item-284) */ $clases = "mi_clase"; devuelve $clases; )

        Hasta la versión 4.1.

        Las clases para los elementos del menú se agregan mediante la función _wp_menu_item_classes_by_context(&$menu_items); . Pero desafortunadamente no proporciona ningún filtro para agregar su clase. Por lo tanto, vamos a usar la muleta str_replace() :

        // obteniendo en lugar de mostrar el menú $menu = wp_nav_menu(array("echo" => 0,)); // agrega la clase my__class a todos los elementos $menu = str_replace("class="menu-item", "class="menu-item my__class", $menu); // mostrar eco $menú;

        #12 Mostrar menú sólo si existe

        De forma predeterminada, si no hay un menú, se mostrarán las páginas del sitio. Pero si desea mostrar el menú solo cuando se crea en el panel de administración, especifique el parámetro fallback_cb como "__return_empty_string":

        wp_nav_menu(array("theme_location" => "menú-primario", "fallback_cb" => "__return_empty_string"));

        #13 Mostrar solo el subelemento del menú

        Digamos que hay un primer nivel y cada uno de los elementos del primer nivel tiene su propio submenú. Necesitamos mostrar dicho submenú para un elemento con la clase menu-item-135:

        ## Recorte todos los LI del submenú deseado y muéstrelos en nuestro bloque UL $menu = wp_nav_menu(array("theme_location" => "header_menu", "container" => "", "echo" => 0,) ); $regex_part = preg_quote("elemento-menú-135"); // muestra el submenú del elemento "gotovye-resheniya" preg_match("~". $regex_part ..*sub-menu[^>]+>(.*?)

      ~s", $menú, $mm); if(!empty($mm)) echo "";

      No es muy óptimo, pero es un ejemplo práctico. A veces puede resultar útil para sitios poco visitados donde necesita obtener resultados rápidamente.

      Clases CSS para elementos de menú

      Las siguientes clases CSS se agregan a los elementos del menú (separadas por las condiciones en las que se encuentra el usuario):

      Para todos los elementos en todas las páginas.

        .opción del menú- a todos los elementos del menú;

        .menú-elemento-objeto-(objeto)- a todos los elementos, donde (objeto) se reemplaza por el nombre del tipo de publicación o taxonomía:
        .menu-item-object-category (para categorías)
        .menu-item-object-tag (para etiquetas)
        .menu-item-object-page (para páginas persistentes)
        .menú-elemento-objeto-(personalizado)

      • .menú-elemento-tipo-(tipo)- a todos los elementos del menú, donde (tipo) se reemplaza por el tipo de enlace (publicación o taxonomía). Agrupa todo tipo de enlaces:
        .menu-item-type-post_type (página permanente, tipo de publicación personalizada)
        .menu-item-type-taxonomy (categoría, etiqueta o taxonomía personalizada)

      Para elementos de la página actual

      • .elemento-de-menú-actual- si el enlace del menú coincide con la dirección de la página que se está viendo. Página actual.

      Para los elementos principales de la página que se está viendo

      • .menú-actual-padre
      • .actual-(objeto)-ancestro
      • .actual-(tipo)-ancestro

      Para elementos relacionados de alguna manera con la página que se está viendo

      • .antepasado-del-menú-actual
      • .actual-(objeto)-ancestro
      • .actual-(tipo)-ancestro

      Para elementos relacionados con la página principal del sitio.

      • .elemento-menú-inicio

      Compatibilidad con la función wp_page_menu()

      • .página_elemento
      • .página-elemento-$ID
      • .elemento_página_actual
      • .current_page_parent
      • .current_page_ancestor

      $ objeto objeto

      $ parámetros del artículo

      Los ejemplos suelen utilizar el elemento de menú $item. Casi todos los parámetros de este elemento se muestran a continuación:

      Campo Descripción
      IDENTIFICACIÓN ID del elemento del menú
      menú_elemento_padre ID del elemento del menú principal
      clases conjunto de clases de elementos de menú
      posfechar Fecha Agregada
      post_modificado fecha de última modificación
      post_autor ID del usuario que agregó este elemento de menú
      título título del elemento del menú
      URL enlace del elemento del menú
      attr_título atributo de título del enlace
      xfn atributo de enlace rel
      objetivo atributo de destino del enlace
      actual es 1 si este es el elemento actual
      antepasado_elemento_actual 1 si el elemento actual es un elemento anidado
      padre_elemento_actual 1 si el elemento actual es el elemento padre
      orden_menú número de serie en el menú
      id_objeto ID de objeto de menú. Registros, términos, etc.
      tipo tipo de objeto de menú (impuesto, entrada)
      objeto nombre del impuesto, tipo de publicación: página, categoría, etiqueta de publicación ...
      etiqueta_tipo nombre de tipo localizado: Categoría, Página
      post_parent Identificación de los padres
      título de la entrada título de la entrada
      Nombre del puesto Etiqueta de registro
      ejemplo de $ elemento
      Objeto WP_Post ( => 10 => 5 => 2019-02-11 13:33:39 => 2019-02-11 13:33:39 => => Nuevo => => publicar => cerrado => cerrado = > => nuevo => => => 2019-02-11 23:10:19 => 2019-02-11 23:10:19 => => 0 => http://dh5.com/?p= 10 => 1 => nav_menu_item => => 0 => raw => 10 => 0 => 10 => personalizado => personalizado => Enlace personalizado => Nuevo => # => => => => Matriz = > submenú extra => elemento-menú => tipo-elemento-menú-personalizado => elemento-objeto-menú-personalizado => => => =>)

      Un ejemplo de uso del parámetro walker

      En Walker, puede especificar un objeto que creará un menú. En este objeto, puede describir el código HTML del menú resultante.

      Si necesita crear un menú para un diseño no estándar, a veces es más fácil rehacer este objeto que rehacer el diseño.

      Como ejemplo de un objeto andador, tomemos la clase Walker_Nav_Menu() , que se utiliza de forma predeterminada. En él, solo nos interesa un método start_el() . Es él quien se encarga del HTML de cada elemento. Como regla general, basta con cambiarlo. Para hacer esto, necesita crear su propia clase que extenderá la clase Walker_Nav_Menu y especificarla en el parámetro walker al llamar al menú.

      Veamos un ejemplo. El código del método start_el() se tomó sin cambios. Usamos como plantilla:

      Clase My_Walker_Nav_Menu extiende Walker_Nav_Menu ( /** * Inicia la salida del elemento. * * @since 3.0.0 * @since 4.4.0 Se agregó el filtro (@see "nav_menu_item_args"). * * @see Walker::start_el() * * @param string $output Pasado por referencia. Se usa para agregar contenido adicional.* @param WP_Post $item Objeto de datos del elemento del menú.* @param int $ Depth Profundidad del elemento del menú. Se usa para el relleno.* @param stdClass $args Un objeto de argumentos wp_nav_menu(). * @param int $id ID del elemento actual. */ función pública start_el(&$output, $item, $profundidad = 0, $args = array(), $id = 0) ( if (isset ($args->item_spacing) && "descartar" === $args->item_spacing) ( $t = ""; $n = ""; ) else ( $t = "\t"; $n = "\n "; ) $sangría = ($profundidad)? str_repeat($t, $profundidad): ""; $clases = vacío($item->clases) ? array() : (matriz) $item->clases; $clases = "elemento-menú-" .$elemento->ID; $args = apply_filters("nav_menu_item_args", $args, $item, $profundidad); $class_names = join(" ", apply_filters("nav_menu_css_class", array_filter($ clases), $item, $args, $profundidad)); $nombres_clase = $nombres_clase ? " class="" .esc_attr($class_names). """ : ""; $id = apply_filters("nav_menu_item_id", "menu-item-". $item->ID, $item, $args, $profundidad); $identificación = $identificación ? " id="" . esc_attr($id) . """ : ""; // crea el código HTML para el elemento del menú $output .= $indent . " "; $atts = array(); $atts["title"] = ! vacío($item->attr_title) ? $item->attr_title: ""; $atts["target"] = ! vacío($item- >objetivo) ? $item->objetivo: ""; $atts["rel"] = ! vacío($item->xfn) ? $item->xfn: ""; $atts["href"] = ! vacío ($item->url) ?$item->url: ""; $atts = apply_filters("nav_menu_link_attributes", $atts, $item, $args, $profundidad); $attributes = ""; foreach ($atts como $atributo => $valor) ( ​​if (! vacío($valor)) ( $valor = ("href" === $atributo) ? esc_url($valor) : esc_attr($valor); $atributos .= " " .$attr ."="" .$valor . """; ) ) $title = apply_filters("the_title", $item->title, $item->ID); $title = apply_filters("nav_menu_item_title" , $ título, $elemento, $args, $profundidad); $item_output = $args->antes; $item_output .= " "; $item_output .= $args->link_before . $title . $args->link_after; $item_output .= ""; $item_output .= $args->después; $output .= apply_filters("walker_nav_menu_start_el", $item_output, $item, $profundidad, $args); ) )

      Ahora, al llamar al menú, especificamos nuestro andador:

      Wp_nav_menu(array("theme_location" => "head_menu", "walker" => new My_Walker_Nav_Menu(),));

      Listo, ahora cada elemento del menú se creará de acuerdo con el esquema HTML que necesitamos.

      Menú BEM con filtros

      El trazado se formará según la metodología BEM:

      Archivo index.php u otro para mostrar el menú

      "menú de encabezado", ]);

      Archivo funciones.php

      "Área superior", "menú de pie de página" => "Área inferior", ]); )); // Cambia las opciones del menú principal add_filter("wp_nav_menu_args", "filter_wp_menu_args"); función filter_wp_menu_args($args) ( if ($args["theme_location"] === "header-menu") ( $args["container"] = false; $args["items_wrap"] = ""; $args[ "menu_class"] = "menú menú--menú principal-horizontal"; ) return $args; ) // Cambiar el atributo de identificación de la etiqueta li add_filter("nav_menu_item_id", "filter_menu_item_css_id", 10, 4); función filter_menu_item_css_id($menu_id, $item, $args, $profundidad) ( return $args->theme_location === "header-menu" ? "" : $menu_id; ) // Cambiar el atributo de clase de la etiqueta li add_filter( "nav_menu_css_class", "filter_nav_menu_css_classes", 10, 4); función filter_nav_menu_css_classes($clases, $item, $args, $profundidad) ( if ($args->theme_location === "menú-encabezado") ( $clases = [ "nodo-menú", "nodo-menú--main_lvl_ " . ($profundidad + 1) ]; if ($item->current) ( $classes = "menu-node--active"; ) ) return $classes; ) // Cambia la clase del ul anidado add_filter(" nav_menu_submenu_css_class", "filter_nav_menu_submenu_css_class", 10, 3); función filter_nav_menu_submenu_css_class($clases, $args, $profundidad) ( if ($args->theme_location === "encabezado-menú") ( $clases = [ "menú", "menú--desplegable", "menú--vertical " ]; ) return $classes; ) // Agregar clases a los enlaces add_filter("nav_menu_link_attributes", "filter_nav_menu_link_attributes", 10, 4); función filter_nav_menu_link_attributes($atts, $item, $args, $profundidad) ( if ($args->theme_location === "header-menu") ( $atts["class"] = "menu-link"; if ($ elemento->actual) ( $atts["clase"] .= "menu-link--active"; ) ) return $atts; )

      Solicite Me gusta a precios muy económicos para una página pública de Facebook en este servicio y tenga la oportunidad de elegir no solo un buen precio, sino también condiciones personales para comprar un recurso. Así, por ejemplo, podrá elegir la velocidad de recepción y la calidad de las páginas firmadas. Además, el servicio brinda garantías a sus clientes.

      Código menú de navegación de wp: wp-includes/nav-menu-template.php WP 5.2.2

      "", "container" => "div", "container_class" => "", "container_id" => "", "menu_class" => "menu", "menu_id" => "", "echo" => verdadero, "fallback_cb" => "wp_page_menu", "antes" => "", "después" => "", "link_before" => "", "link_after" => "", "items_wrap" => "" , "item_spacing" => "preservar", "profundidad" => 0, "walker" => "", "theme_location" => "",); $args = wp_parse_args($args, $valores predeterminados); if (! in_array($args["item_spacing"], array("preserve", "discard"), true)) ( // valor no válido, vuelve al valor predeterminado. $args["item_spacing"] = $defaults[" item_spacing"]; ) /** * Filtra los argumentos utilizados para mostrar un menú de navegación. * * @since 3.0.0 * * @see wp_nav_menu() * * @param array $args Matriz de argumentos de wp_nav_menu(). */ $args = apply_filters("wp_nav_menu_args", $args); $argumentos = (objeto) $argumentos; /** * Filtra si se debe cortocircuitar la salida wp_nav_menu(). * * Devolver un valor no nulo al filtro provocará un cortocircuito * en wp_nav_menu(), haciendo eco de ese valor si $args->echo es verdadero, * devolviendo ese valor en caso contrario. * * @since 3.9.0 * * @see wp_nav_menu() * * @param string|null $output Salida del menú de navegación para cortocircuitar. nulo predeterminado. * @param stdClass $args Un objeto que contiene argumentos wp_nav_menu(). */ $nav_menu = apply_filters("pre_wp_nav_menu", nulo, $args); if (null !== $nav_menu) ( if ($args->echo) ( echo $nav_menu; return; ) return $nav_menu; ) // Obtiene el menú de navegación según el menú solicitado $menu = wp_get_nav_menu_object($args- >menú); // Obtener el menú de navegación según la ubicación_tema if (! $menu && $args->theme_location && ($ubicaciones = get_nav_menu_locations()) && isset($ubicaciones[ $args->theme_location ])) ( $menu = wp_get_nav_menu_object( $ubicaciones[ $args->theme_location ]); ) // obtiene el primer menú que tiene elementos si todavía no podemos encontrar un menú if (! $menu && ! $args->theme_location) ( $menus = wp_get_nav_menus() ; foreach ($menus as $menu_maybe) ( if ($menu_items = wp_get_nav_menu_items($menu_maybe->term_id, array("update_post_term_cache" => false))) ( $menu = $menu_maybe; break; ) ) ) if (empty( $args->menu)) ( $args->menu = $menu; ) // Si el menú existe, obtiene sus elementos.if ($menu && ! is_wp_error($menu) && ! isset($menu_items)) ( $ menu_items = wp_get_nav_menu_items($menu->term_id, array("update_post_term_cache" => false)); ) /* * Si no se encontró ningún menú: * - Retroceder (si se especificó uno), o salir. * * Si no hay menú Se encontraron elementos: * - Retroceder, pero solo si no se especificó ninguna ubicación del tema. * - En caso contrario, libertad bajo fianza. */ if ((! $menu || is_wp_error($menu) || (isset($menu_items) && vacío($menu_items) && ! $args->theme_location)) && isset($args->fallback_cb) && $args ->fallback_cb && is_callable($args->fallback_cb)) ( return call_user_func($args->fallback_cb, (array) $args); ) if (! $menu || is_wp_error($menu)) ( return false; ) $ nav_menu = $elementos = ""; $show_container = falso; if ($args->container) ( /** * Filtra la lista de etiquetas HTML que son válidas para usar como contenedores de menú. * * @since 3.0.0 * * @param array $tags Las etiquetas HTML aceptables para usar como menú contenedores.* El valor predeterminado es una matriz que contiene "div" y "nav".*/ $allowed_tags = apply_filters("wp_nav_menu_container_allowedtags", array("div", "nav")); if (is_string($args->container) && in_array ($args->contenedor, $allowed_tags)) ( $show_container = true; $class = $args->container_class ? " class="" . esc_attr($args->container_class) . """ : " class="menu -" . $menu->slug . "-container""; $id = $args->container_id ? " id="" . esc_attr($args->container_id) . """ : ""; $nav_menu .= "<" . $args->envase. $identificación. $clase. ">"; ) ) // Configurar las variables $menu_item _wp_menu_item_classes_by_context($menu_items); $elementos_menú_ordenados = $elementos_menú_con_niños = matriz(); foreach ((array) $menu_items as $menu_item) ( $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; if ($menu_item->menu_item_parent) ( $menu_items_with_children[ $menu_item->menu_item_parent ] = true; ) ) // Agregue la clase de elemento de menú que tiene hijos cuando corresponda if ($menu_items_with_children) ( foreach ($sorted_menu_items as &$menu_item) ( if (isset($menu_items_with_children[ $menu_item->ID ])) ( $menu_item->classes = "elemento-de-menú-tiene-hijos"; ) ) ) unset($menu_items, $menu_item); /** * Filtra la lista ordenada de objetos de elementos de menú antes de generar el HTML del menú. * * @since 3.1.0 * * @param array $sorted_menu_items Los elementos de menú, ordenados por orden de menú de cada elemento de menú. * @param stdClass $args Un objeto que contiene argumentos wp_nav_menu(). */ $sorted_menu_items = apply_filters("wp_nav_menu_objects", $sorted_menu_items, $args); $elementos .= walk_nav_menu_tree($sorted_menu_items, $args->profundidad, $args); unset($sorted_menu_items); // Atributos if (! vacío($args->menu_id)) ( $wrap_id = $args->menu_id; ) else ( $wrap_id = "menu-" . $menu->slug; while (in_array($wrap_id, $ menu_id_slugs)) ( if (preg_match("#-(\d+)$#", $wrap_id, $matches)) ( $wrap_id = preg_replace("#-(\d+)$#", "-" . ++$ coincidencias, $wrap_id); ) else ( $wrap_id = $wrap_id . "-1"; ) ) ) $menu_id_slugs = $wrap_id; $wrap_class = $args->menu_class ? $args->menu_class: ""; /** * Filtra el contenido de la lista HTML para los menús de navegación. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items El contenido de la lista HTML para los elementos del menú. * @param stdClass $args Un objeto que contiene argumentos wp_nav_menu(). */ $elementos = apply_filters("wp_nav_menu_items", $elementos, $args); /** * Filtra el contenido de la lista HTML para un menú de navegación específico. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $items El contenido de la lista HTML para los elementos del menú. * @param stdClass $args Un objeto que contiene argumentos wp_nav_menu(). */ $elementos = apply_filters("wp_nav_menu_($menu->slug)_items", $elementos, $args); // No imprima ningún marcado si no hay elementos en este momento. if (empty($items)) ( return false; ) $nav_menu .= sprintf($args->items_wrap, esc_attr($wrap_id), esc_attr( $wrap_class), $items); unset($items); if ($show_container) ( $nav_menu .= "envase. ">"; ) /** * Filtra el contenido HTML para los menús de navegación. * * @since 3.0.0 * * @see wp_nav_menu() * * @param string $nav_menu El contenido HTML para el menú de navegación. * @param stdClass $args Un objeto que contiene argumentos wp_nav_menu(). */ $nav_menu = apply_filters("wp_nav_menu", $nav_menu, $args); if ($args->echo) ( echo $nav_menu; ) else ( return $nav_menu; ) )

    Ningún sitio está completo sin navegación, o como también se le llama al "menú del sitio". Por lo tanto, el menú del sitio puede ser de un solo nivel o de varios niveles en forma de árbol. Si no hay dificultades especiales en términos de implementación con un menú de un solo nivel, al crear un menú de varios niveles, debe pensar detenidamente.

    Lo más importante en esta tarea es diseñar una base de datos para nuestro menú multinivel. Creemos una tabla de Categorías con tres campos. identificación, título, padre Dónde:

    • IDENTIFICACIÓN- identificador
    • Título- Nombre del menú
    • padre- Categoría principal predeterminada 0

    El campo es responsable de bifurcar el menú. padre Si padre = 0, entonces esta categoría es la categoría principal. Para agregar niños a la categoría principal, debe especificar en el campo principal IDENTIFICACIÓN el padre deseado. Por ejemplo:

    Tablas con categorías

    Como puede verse en la tabla, la categoría principal Carros hay dos descendientes mazda Y honda relacionado por campo padre. y la categoria motocicletas dos descendientes son kawasaki Y harley. Al mismo tiempo, la categoría Barcos no tiene descendientes. Espero que entiendas cómo vincular categorías.

    A continuación, pasamos de las palabras a la práctica. Creemos la tabla Categorías.

    CREAR TABLA SI NO EXISTE `categorías` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, CLAVE PRIMARIA (`id`)) MOTOR = MyISAM CONJUNTO DE CARACTERES PREDETERMINADO = utf8 AUTO_INCREMENT = 20; -- -- Volcar datos de la tabla `categorías` -- INSERTAR EN `categorías` (`id`, `título`, `padre`) VALORES (1, "Autos", 0), (2, "Motocicletas", 0) , (3, Mazda, 1), (4, Honda, 1), (5, Kawasaki, 2), (6, Harley, 2), (7, Mazda 3, 3 ), (8, "Mazda 6", 3), (9, "Sedan", 7), (10, "Hatchback", 7), (11, "Barcos", 0), (12, "Liftback", 8), (13, "Crossover", 8), (14, "Blanco", 13), (15, "Rojo", 13), (16, "Negro", 13), (17, "Verde", 13), (18, Mazda CX, 3 ), (19, Mazda MX, 3);

    El algoritmo de trabajo consta de lo siguiente:

    Creando una conexión de base de datos

    consulta("ESTABLECER NOMBRES "utf8""); /* * Esta es la forma "oficial" orientada a objetos de hacer esto * sin embargo $connect_error no funcionó hasta PHP 5.2.9 y 5.3.0. */ if ($mysqli->connect_error) ( die("Conexión fallida (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Si quieres estar seguro de la compatibilidad con las versiones antes de 5.2 .9, * mejor código como este */ if (mysqli_connect_error()) ( die("La conexión falló (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

    Escribir una función para obtener datos de la tabla Categorías

    //Obtener nuestra matriz de menú de la base de datos como una función de matriz getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Crear una matriz donde la clave de la matriz es el ID del menú $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; )

    Obtenemos una matriz como esta, donde la clave de la matriz es el ID de la categoría.

    Función de árbol de matriz de Tommy Lacroix

    //La función para construir un árbol a partir de una matriz de Tommy Lacroix function getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Si no hay archivos adjuntos if (!$node[" parent"])( $tree[$id] = &$node; )else( //Si hay hijos, recorre la matriz $dataset[$node["parent"]][" hijos"][$id] = &$ nodo; ) ) devuelve $árbol; )

    Obtener una matriz en forma de árbol

    guión completo

    consulta("ESTABLECER NOMBRES "utf8""); /* * Esta es la forma "oficial" orientada a objetos de hacer esto * sin embargo $connect_error no funcionó hasta PHP 5.2.9 y 5.3.0. */ if ($mysqli->connect_error) ( die("Conexión fallida (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Si quieres estar seguro de la compatibilidad con las versiones antes de 5.2 .9, * es mejor usar este código */ if (mysqli_connect_error()) ( die("Error de conexión (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Obtener nuestra matriz de menú desde la base de datos como una función de matriz getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Crea una matriz donde la clave de la matriz es el menú ID $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $cat; ) //Función para construir un árbol de una matriz mediante la función getTree($dataset) de Tommy Lacroix ( $tree = array(); foreach ($dataset as $id => &$node) ( //Si no hay archivos adjuntos if (!$node["parent" ])( $tree[$id] = &$node; )else( //Si hay hijos, entonces itera sobre la matriz $dataset[$node["parent"]]["childs"][$id] = &$node; ) ) return $tree; ) //Obtener una matriz preparada con datos $cat = getCat($mysqli); //Crear un menú de árbol $tree = getTree($cat); //Plantilla para mostrar el menú en forma de árbol función tplMenu($categoría)( $menu = "
  • ".$categoría["título"].""; if(isset($categoría["niños"]))( $menú .= "
      ".showCat($categoría["niños"])".
    "; ) $menú .= "
  • "; return $menu; ) /** * Leer nuestra plantilla de forma recursiva **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) return $string; ) //Obtener marcado HTML $cat_menu = showCat($tree); //Mostrar echo "
      ". $cat_menu."
    "; ?>

    El resultado del trabajo.

    Menú multinivel en PHP + MySQL para administrador

    Si desea utilizar este menú en el panel de administración de su sitio, deberá reescribir un par de funciones. tplMenú(), mostrarGato().

    ".$categoría["título"].""; )de lo contrario( $menú = " "; ) if(isset($categoría["niños"]))( $i = 1; for($j = 0; $j< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    El resultado del trabajo.

    Seleccionar autos → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ Blanco →→→→ Rojo →→→→ Negro →→→→ Verde →→ Mazda CX →→ Mazda MX → Motos Honda → Kawasaki → Barcos Harley

    ¿Te gustó el artículo? Compártelo