Построение дерева категорий на PHP. Рекурсия. PHP Категории (Дерево категорий) Посты определённой категории

Сегодня я расскажу, как на и MySQL создавать иерархическое дерево.

Такие деревья используются при построении категорий динамического сайта, например в интернет-магазине или при выводе комментариев к посту.

Вообще они строятся где только возможно. Главное правильно его построить и применить.

Самое главное, когда строишь иерархическое дерево — это правильная структура базы данных! Для примера рассмотрим структуру базы данных, где хранятся категории сайта. Для простого примера, таблица будет иметь 3 поля:

  1. id — ключ категории
  2. parent_id — id родительской категории
  3. name – название раздела

Создадим таблицу, выполнив SQL-запрос в PHPMyAdmin:

CREATE TABLE `categories` (`id` INT NOT NULL AUTO_INCREMENT , `parent_id` INT NOT NULL , `name` VARCHAR(50) NOT NULL , PRIMARY KEY (`id`));

Теперь нужно заполнить нашу таблицу записями. В результате, должна получится примерно такая таблица:

Можно заполнить тестовую таблицу запросом:

INSERT INTO `categories` (`id`, `parent_id`, `name`) VALUES (1, 0, "Раздел 1"), (2, 0, "Раздел 2"), (3, 0, "Раздел 3"), (4, 1, "Раздел 1.1"), (5, 1, "Раздел 1.2"), (6, 4, "Раздел 1.1.1"), (7, 2, "Раздел 2.1"), (8, 2, "Раздел 2.2"), (9, 3, "Раздел 3.1");

И сейчас внимание! Дальше по логике нужно делать выборки из БД в цикле для выбора каждой категории и её подкатегории. НО! Ладно, если в БД несколько категорий, что тоже в принципе не правильно. А если сайт — интернет-магазин и у него сотня категорий и столько же подкатегорий? Тогда беда! Неведомое количество запросов к базе данных приведет к замедлению работы сайта или же к полному краху mysql-сервера.

Можно используя только один запрос к БД выбрать все категории и ихние подкатегории.

Сделаем запрос и сформируем удобный массив для дальнейшей работы.

//Выбираем данные из БД $result=mysql_query("SELECT * FROM categories"); //Если в базе данных есть записи, формируем массив if (mysql_num_rows($result) > 0){ $cats = array(); //В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории while($cat = mysql_fetch_assoc($result)){ $cats_ID[$cat["id"]] = $cat; $cats[$cat["parent_id"]][$cat["id"]] = $cat; } }

Выбираем все данные из таблицы categories и формируем ассоциативный массив $cats , ключем будет id родительской категорий.

Сейчас будем строить дерево. Для построения будем использовать рекурсивную функцию .

Иерархическое дерево будет иметь такую структуру:

  • Раздел 1
    • Раздел 1.1
      • Раздел 1.1.1
    • Раздел 1.2
  • Раздел 2
    • Раздел 1.1
    • Раздел 1.2
  • Раздел 3
    • Раздел 3.1

Создадим рекурсивную функцию build_tree() . Она будет строить наше иерархическое дерево абсолютно любой вложенности.

Function build_tree($cats,$parent_id,$only_parent = false){ if(is_array($cats) and isset($cats[$parent_id])){ $tree = "

    "; if($only_parent==false){ foreach($cats[$parent_id] as $cat){ $tree .= ""; } }elseif(is_numeric($only_parent)){ $cat = $cats[$parent_id][$only_parent]; $tree .= "
  • ".$cat["name"]." #".$cat["id"]; $tree .= build_tree($cats,$cat["id"]); $tree .= "
  • "; } $tree .= "
"; } else return null; return $tree; }

Функция принимает массив разделов и id раздела. В цикле перебираем подкатегории и если в них есть еще разделы, тогда функция запускается еще раз с новыми параметрами (новый массив разделов и id раздела, который нужно построить). Так формируется дерево любой вложенности!

Для построения дерева, в коде прописываем:

Echo build_tree($cats,0);

Так вот в два шага мы создали иерархическое дерево разделов сайта и не важно сколько там разделов!

UPD Если нужно дерево категорий в обратном порядке зная id категории, тогда нужно воспользоваться функцией:

Function find_parent ($tmp, $cur_id){ if($tmp[$cur_id]["parent_id"]!=0){ return find_parent($tmp,$tmp[$cur_id]["parent_id"]); } return (int)$tmp[$cur_id]["id"]; }

Данная функция принимает массив категорий, ключом которой есть id рубрики, и id категории от которой нужно идти вверх.

Для построения такого дерева запускаем функцию build_tree c такими параметрами:

Echo build_tree($cats,0,find_parent($cats_ID,ВАШ_ID_КАТЕГОРИИ));

Есть вопросы? Задавайте в комментариях

Сегодня наша цель, создать иерархическую структуру категорий. Нам важно чтобы было удобно хранить категории и чтобы было легко выводить их там где нам надо.

Иногда простое кажется сложным, именно по этому выложу несколько фрагментов кода, которые я надеюсь вам пригодятся для реализации php категорий в виде дерева.

Итак, структура должна состоять из id категории (id), из названия категории (name) и конечно id родительской категории (parent_id). В MySQL это выглядит так:

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

Минимальная и понятная структура таблицы для хранения категорий.

INSERT INTO `category` (`id`, `name`, `parent_id`) VALUES (1, "Телефоны и планшеты", "0"), (2, "Автомобили", "0"), (3, "Samsung", "1"), (4, "Apple", "1"), (5, "LG", "1"), (6, "Ford", "2"), (7, "Lexus", "2"), (8, "BMW", "2"), (9, "Galaxy Tab 4", "3"), (10, "Galaxy S6", "3");

Там где значение parent_id=0, у данной категории нет родительской категории.

Тут все понятно и просто. Теперь присутпим к выводу списка категорий. Но для правильного вывода списка, нам нужно сначала получить весь список php категорий, а уже потом с помощью рекурсии сформировать наше дерево. Следующая функция предназначена для получения этого списка:

Function get_cat() { //запрос к базе данных $sql = "SELECT * FROM category"; $result = mysql_query($sql); if(!$result) { return NULL; } $arr_cat = array(); if(mysql_num_rows($result) != 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; } }

//получаем массив каталога $result = get_cat();

Теперь нужна функция с рекурсией

Function view_cat($arr,$parent_id = 0) { //Условия выхода из рекурсии if(empty($arr[$parent_id])) { return; } echo "

    "; //перебираем в цикле массив и выводим на экран for($i = 0; $i < count($arr[$parent_id]);$i++) { echo "
  • " .$arr[$parent_id][$i]["name"].""; //рекурсия - проверяем нет ли дочерних категорий view_cat($arr,$arr[$parent_id][$i]["id"]); echo "
  • "; } echo "
"; }

Теперь осталось только вывести каталог на экран с помощью рекурсивной функции

View_cat($result);

И в общем то и всё. Таким образом мы можем получить полное дерево категорий с бесконечными подкатегориями.

Category subcategory tree view provides a user-friendly way to list the parent and child categories. The category and their subcategory are easily separated by a tree structure. The categories tree view is always recommended to display an infinite level of categories and subcategories.

In this tutorial, we will show you how to create dynamic category subcategory tree using PHP and MySQL. The recursive category tree is very useful to list n level categories in a dropdown. The example code helps you to build n level category subcategory dropdown in PHP. The dynamic categories data will be retrieved from the MySQL database and listed in a parent-child category tree format.

Create Database Table

To store categories and subcategories, a table needs to be created in the database. The following SQL creates a categories table in the MySQL database.

CREATE TABLE `categories ` (`id` int (11 ) NOT NULL AUTO_INCREMENT, `parent_id` int (11 ) NOT NULL DEFAULT "0" , `name` varchar (100 ) COLLATE utf8_unicode_ci NOT NULL , `created` datetime NOT NULL , `modified` datetime NOT NULL , `status` enum("1" ,"0" ) COLLATE utf8_unicode_ci NOT NULL DEFAULT "1" COMMENT "1:Active, 0:Inactive" , PRIMARY KEY (`id` )) ENGINE= InnoDB DEFAULT CHARSET= utf8 COLLATE= utf8_unicode_ci;

The parent_id column specifies whether the category is parent or child. If parent_id is 0, it will be a parent category. Otherwise, it will be a child category and the ID is the parent of this category.

Database Configuration (dbConfig.php)

The dbConfig.php file is used to connect and select the database. Specify the database host ($dbHost), username ($dbUsername), password ($dbPassword), and name ($dbName) as per your MySQL credentials.

// Database configuration
$dbHost = "localhost" ;
$dbUsername = "root" ;
$dbPassword = "root" ;
$dbName = "codexworld" ;// Create database connection
$db = new mysqli ($dbHost , $dbUsername , $dbPassword , $dbName );// Check connection
if ($db -> connect_error ) {
die("Connection failed: " . $db -> connect_error );
}
?>

PHP Recursive Function to Generate Parent/Child Tree

The categoryTree() function generates an n level category subcategory tree using PHP. It will create the dropdown options for categories tree.

  • $parent_id – Optional. Specify the parent ID to get the child categories of this parent category.
  • $sub_mark – Optional. Mark that will append at the beginning of the child category name.
// Include the database configuration file
require "dbConfig.php" ;categoryTree ($parent_id = 0 , $sub_mark = "" ){
global $db ;
$query = $db -> query ("SELECT * FROM categories WHERE parent_id = $parent_id ORDER BY name ASC" );$query -> num_rows > 0 ){
while($row = $query -> fetch_assoc ()){
echo "" ;
categoryTree ($row [ "id" ], $sub_mark . "---" );
}
}
}

Category Subcategory Dropdown in PHP

Use categoryTree() function to build dynamic categories tree dropdown in PHP with MySQL.

Are you want to get implementation help, or modify or extend the functionality of this script?

Фанатов WordPress становится больше с каждым днём, и многие используют этот движок уже просто как CMS. Он настолько прост, что понятен даже новичку-не-программисту. Ниже я покажу несколько приёмов, которые используются многими продвинутым блоггерами, в основном приёмы эти направлены на юзабилити;

1) Динамичная подсветка меню

Как сделать динамичную подсветку меню,как, пример, . Пишем условие: если это первая страница Home / Category / Archive / Search / Single, добавим class=current к тегу li (он будет подсвечиватся как Gallery). Если второй элемент будет «About», добавьте класс «current». и т.д.

2) Динамичные теги в заголовке

Для того, чтобы использовать динамичные заголовки для страниц, пишем в header.php.

<?php if (is_home() ) { echo bloginfo("name" ) ; } elseif (is_404() ) { echo "404 Not Found" ; } elseif (is_category() ) { echo "Category:" ; wp_title("" ) ; } elseif (is_search() ) { echo "Search Results" ; } elseif ( is_day() || is_month() || is_year() ) { echo "Archives:" ; wp_title("" ) ; } else { echo wp_title("" ) ; } ?>

<?php if (is_home()) { echo bloginfo("name"); } elseif (is_404()) { echo "404 Not Found"; } elseif (is_category()) { echo "Category:"; wp_title(""); } elseif (is_search()) { echo "Search Results"; } elseif (is_day() || is_month() || is_year()) { echo "Archives:"; wp_title(""); } else { echo wp_title(""); } ?>

3) Динамичный контент:

Если хотите, чтобы какой-то контент находился только на первой странице, пишем:

5) Как сменить тему отдельной категории

Допустим, вы хотите сменить тему для постов какого-то отдельной категории. Для этого можно воспользоваться функцией in_category.
Если по-умолчанию стоит single.php, используйте этот код. Если пост в категории 1 используем single1.php, для категории 2, — single2.php, ну и для других single_other.php.

post; if ( in_category("1" ) ) { include (TEMPLATEPATH . "/single1.php" ) ; } elseif ( in_category("2" ) ) { include (TEMPLATEPATH . "/single2.php" ) ; } else { include (TEMPLATEPATH . "/single_other.php" ) ; } ? >

post; if (in_category("1")) { include(TEMPLATEPATH . "/single1.php"); } elseif (in_category("2")) { include(TEMPLATEPATH . "/single2.php"); } else { include(TEMPLATEPATH . "/single_other.php"); } ? >

Буквально недавно в одном из блогов также поднималась похожая тема, пришлось с ее помощью избавиться от внешних ссылок блога .

6) Уникальная тема категории

Что если вы хотите особенную тему для определённой категории? Просто сохраним тему этой категории под именем category-2.php (именно по таком шаблону!). Так, category-2.php будет использоваться категорией categoryID 2, category-3.php — категорией categoryID 3 и т.д.

Довольно просто решаема задача. Для этого нам нужно задать переменную ($loopcounter) в цикл. Если $loopcounter меньше или равно 1, подключается код google-ad.php.

// the loop stuffs

// the loop stuffs

Query Posts

Query Posts используется для контроля над выводом постов внутри цикла. С его помощью можно управлять тем, что выводить, когда выводить и как выводить.

8) Выводим последние посты

последние 5 постов:

  • ">

  • ">

9) Посты определённой категории

  • ">

  • ">

Допустим, нам нужно исключить отображение какой- либо категории (categoryID 2):

//the loop here

//the loop here

Произвольные поля (Custom Field)

Custom Field — очень полезная вещь, довольно часто используется для вывода информации после поста. Используется, например, для вывода информации об авторе поста.

Для начала добавим Произвольное поле в пост.

Чтобы отобразить изображение и прикрепить к нему ссылку на пост, помещаем следующий код в цикл (перед самим текстом поста):

//получаем картинку (custom field) ?> ID , "article_image" , true ) ; ?> "> " alt=" " />

ID, "article_image", true); ?> ">" alt="" />

Не забывайте, что произвольных полей после поста может быть несколько. Похожий эффект можно увидеть на Best Web Gallery , где подобным образом отображены миниатюры, ссылки URL и подсветка информации. Также о произвольных полях можно почитать в данной статье — использование custom fields в WordPress .

WP List Pages

Тег wp_list_pages используется для отображения списка страниц в хедере и сайдбаре

12)Site map

Для того, чтобы отобразить Site map, достаточно добавить этот код в страницу sitemap.php

Замечу, что pageID 12 исключена, т.к. это страница — сама sitemap.php, и её не нужно отображать…
Метод работает, хотя, наверное, лучше воспользоваться более стандартным методом и построить карту сайта с помощью плагина .

13) Динамичное субстраничное меню

Добавьте этот код в sidebar.php и он отобразит субстраничное меню, если субстраницы есть на этой странице:

ID . "&echo=0" ) ; if ($children ) { ?>

ID."&echo=0"); if ($children) { ?>

14) Тема страницы

Хорошо бы не упускать и такую функцию как Page Template, которая позволяет задавать новую тему для вашего блога. Для начала, нужно создать саму тему, затем нужно обозначить странице своб собственную тему. Вот как она выглядит (напр., portfolio.php)

/* Template Name: Portfolio */ ?> //the loop here

//the loop here

При написании или редактировании страницы, справа можно будет увидеть “Page Template”, и там указать нужную тему.

Опции WordPress

Последнее, что мы рассмотрим, будут опиции самого WordPress и блога в целом.

15) Стартовая страница

По умолчанию, WordPress располагает блог на стартовой странице сайта. Но если вы хотите какую-то другую страницу, например, приветствие, то зайдите Admin > Options > Reading.

16) Адреса страниц

По умолчанию, WordPress использует ссылки вида Permalinks www.yoursite.com/?p=123, которе не красивы и не понятны поисковикам. Но можно поменять это в Admin > Options > Permalinks (Параметры > Постоянные ссылки). Неплохой вариант записи адресов вот этот: /%category%/%postname%/

По умолчанию, WordPress использует префикс категорий «category» (напр., yoursite.com/category/cat-name/). Но чтобы заменить его на «article» , зайдите в Options > Permalinks (Параметры > Постоянные ссылки), и ссылки будут выглядеть так: yoursite.com/article/cat-name/

Если хотите, то префикс с помощью специальных плагинов.

Вот такие получились эти 17 приемчиков для WordPress, спасибо Михаилу за них. Напоминаю, что много чего полезного вы также сможете найти в его блоге про веб-дизайн , где собрана масса интересной информации. В принципе, некоторые хаки уже рассматривались, но такого своего рода повторение, не помешает. Где это было возможным я добавил ссылки на полноценные (более подробные) с детальным рассмотрением вопроса. Хотя это больше для новичков, опытным разработчикам хватит приведенного в статье кода, вы, думаю, сможете сами добавить туда, что нужно:)

P.S. Постовой. Для тих, хто планує серйозно зайнятися дизайном будуть корисні Відеоуроки з веб-дизайну – українською! — приєднуйтесь до читачів сайту.
Интернет магазин ЛинзМастер предлагает контактные линзы , цветные контактные линзы, а также растворы и аксессуары.