Привязываем генератор sitemap.xml к движку

 

Всем привет! Добро пожаловать на Блог RS! Сегодня мы продолжим создавать блога с нуля, если быть точнее, то продолжим создавать список настроек, для постов. В прошлом уроке мы создавали функцию, которая генерировала, с помощью базы данных, файл sitemap.xml. Сегодня мы прикрутим эту функцию к админ панели, и добавим новый пункт, в листе настроек, который позволит добавлять новые ссылки в карту, и редактировать уже занесенные.

 

 

Цель

 

Мной был, основательно, переработан код файла configpost.php. Я уже говорил ( в посте "Убираем выбранные посты с главной страницы" ) о том, что скорее всего придется переписать функцию queCFG(). Перепись этой функции повлекли за собой изменения некоторых строк кода в функции configpost(). Не пугайтесь я поясню че да как

Че нам необходимо сделать сегодня?

  • Перенести функцию, sitemap() из файла sitemap.php в файл configpost.php.
  • Переправить путь к файлу sitemap.xml в функции sitemap()
  • Добавить новый пункт в шаблон configpos.html
  • Отредактировать обработчик добавление постов, в файле addcontent.php
  • Переписать функцию queCFG() в файле configpost.php
  • Отредактировать функцию configpost() в файле configpost.php
  • Отредактировать обработчик в файле configpost.php

Что то как то страшно, от объема работа

 

Предисловие

 

Прежде чем мы приступим к работе, хочу обратится к тем, кто на блоге в первые. Так как этот пост, как и почти все на этом блоге, является часть цикла "Создать блог с нуля", то материал изложенный на этой странице может показаться Вам совершенно бесполезным. Если Вы хотите научится создавать свои сайты на практике, то переходите по ссылке, что я дал Вам выше

Если мой блог показался Вам интересным, то подпишитесь на RSS ленту блога через ридер, или же по почте.

 

Функция sitemap()

 

Открываем файл configpost.php, и в самом низу вставляем нужную нам функцию. При это можете прямо сейчас поменять путь к файлу sitemap.xml

function sitemap($site)//Генератор карты сайта
{
$header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";//Шапка xml документа
$timeNOW = date("Y-m-d",time());//регестрируем время последнего обновление главной страницы
//начальный xml код, то есть блок с главной странице
$xmlcode = "\t<url>\n\t\t<loc>".$site."</loc>\n\t\t<lastmod>".$timeNOW."</lastmod>\n\t\t<changefreq>daily</changefreq>\n\t\t<priority>1.0</priority>\n\t</url>\n";

$smRESULT = mysql_query("SELECT id,date_b,xmlsm FROM blog WHERE sm='1' ORDER BY id DESC");//Вытаскиваем все посты из БД
$myrow = mysql_fetch_array($smRESULT);
if($myrow != "")//если посты есть в БД
{
do//запускаем цикл
{
//приобразуем дату из БД в вид ГГГГ-ММ-ДД ( у нас в БД вот такой вид ДД/ММ/ГГГГ ЧЧ:ММ )
$datePOST = explode(" ",$myrow[date_b]);//делим дату на массив. В первом элементе массива будет ДД/ММ/ГГГГ а во втором ЧЧ:ММ
$datePOST = explode("/",$datePOST[0]);//Делим первый элемент массива на другой массив. В новом массиве будет 3 элемента. Первый содержит ДД, второй ММ и третий ГГГГ
$datePOST = $datePOST[2]."-".$datePOST[1]."-".$datePOST[0];//склеиваем элементы массива в нужном нам порядке ( ГГГГ-ММ-ДД -> третий элемент массива + второй + первый )

$link = "index.php?blog=".$myrow[id];//генерируем ссылку
$xmlsm = explode("|",$myrow[xmlsm]);//режим настройку из БД (колонка xmlsm) на массив. Первый элемент будет временем обновления, второй - приоритетом

//подставляем сформированную дату и ссылку в xml код
$xmlcode .= "\t<url>\n\t\t<loc>".$site.$link."</loc>\n\t\t<lastmod>".$datePOST."</lastmod>\n\t\t<changefreq>".$xmlsm[0]."</changefreq>\n\t\t<priority>".$xmlsm[1]."</priority>\n\t</url>\n";
}
while($myrow = mysql_fetch_array($smRESULT));
$end = "</urlset>";//закрывающийся тег xml документа

$map = $header.$xmlcode.$end;//склеиваем весь xml код в одну переменную

$smFILE = fopen("../sitemap.xml", "w+");//открываем файл карты
fwrite($smFILE,$map);//записываем в нее полученный xml код
fclose($smFILE);//закрываем файл карты
}
}

Обратите внимание на путь, был

../../sitemap.xml

стал

../sitemap.xml

Так как функция будет вызываться из папки admin, то файл, который функция будет править, найдется в корне нашего блога, что собственно нам и нужно

 

Редактируем шаблон configpost.html

 

Для начала покажу Вам как этот пункт будет выглядеть

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

<p align="right"><a href="index.php?page=all_content">К списку постов</a></p><br/>
<form action="index.php?page=cfgpost&id=[_id]" method="post" name="form">
<table width="700px" cellpadding="5" cellspacing="0" border="0" align="center">
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Видим пост в ленте новостей?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewindex">
[_cfgvi]
</select>
</td>
</tr>
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Разрешить комментировать пост?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewcomm">
[_cfgcomm]
</select>
</td>
</tr>
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Разместить в файле sitemap.xml?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="sm">
[_cfgsm]
</select>
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="xmlsmup">
[_cfgsmup]
</select>
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="xmlsmpr">
[_cfgsmpr]
</select>
</td>
</tr>
<tr>
<td valign="top" colspan="2" align="center">
<br/><br/><input type="submit" value="Сохранить настройки">
</td>
</tr>
</table>
</form>
<br/><br/>

Три новых списка, три новых атрибут name и три новых код слова: [_cfgsm], [_cfgsmup] и [_cfgsmpr]. Так же я изменил ширину таблицы. Вроде это все что я сделал с шаблоном

 

Редактируем обработчик добавление постов

 

Нам необходимо, что бы при добавление нового поста в базу данных, в таблице blog уже имелась настройка, карты сайта, по умолчанию. Открываем файл addcontent.php и редактируем запрос в базу данных

    //ДОБАВЛЯЕМ ПОСТ В БАЗУ ДАННЫХ
$result_add_cont = mysql_query ("INSERT INTO blog (text,title,author,date_b,cat,meta_d,meta_k,viewindex,viewcomm,sm,xmlsm)
VALUES ('$txt_post','$name_post','$author_post','$date_cont','$menu_post','$metad_post','$metak_post','0','1','0','monthly|0.2')");
//ДОБАВЛЯЕМ ПОСТ В БАЗУ ДАННЫХ

По умолчанию будут следующие настройки:

  • Появление ссылки в карте сайта - отключено ( колонка sm будет содержать ноль )
  • Частота изменение содержимого страницы - monthly ( то есть каждый месяц ), приоритетность
  • URL - 0.2 ( то есть 20% ) ( колонка xmlsm будет содержать "monthly|0.2" )

Надеюсь тут все понятно

 

Функция queCFG()

 

Почему эту функцию необходимо переписать? Если Вы читали пост, где мы писали ее, то Вы должны помнить, что она умеет генерировать лишь ответы "Да", "Нет" для администратора, и ответы "1" и "0" для атрибута value тега option. А теперь взгляните на содержание вариантов ответа для пункта "Разместить в файле sitemap.xml?"

Как видите, вариантов больше двух. Я пришел к такому варианту работы функции queCFG()

function queCFG($sel,$queTXT,$queINT)//Функция генерации ответов
{
$wh = count($queTXT);//Узнаем сколько вариантов ответа
for($i=0;$i<$wh;$i++)//запускаем цикл формирования
{
//определяем какой вариант сейчас выбран
if($sel == $queINT[$i])$result .= "<option value='".$queINT[$i]."' selected>".$queTXT[$i]."</option>";//нашли выбранный вариант и приписали selected в тег option
else $result .= "<option value='".$queINT[$i]."'>".$queTXT[$i]."</option>";//остальные варианты будут без атрибута selected
}
return $result;//выводим с генерированный html код
}

Что у нас тут имеется? Для начала обратите внимание на стартовые переменные функции

function queCFG($sel,$queTXT,$queINT)//Функция генерации ответов
{
...
}

Переменные queTXT и queINT являются массивами. В первом содержатся все варианты выбора, которые увидит администратор ( пример "Да", "Нет" ). Во втором будут содержаться варианты для атрибута value тега option ( пример "1", "0" )

Далее встала необходимость узнать сколько раз циклить цикл for. На помощь пришла функция php - count(). Она позволяет узнать сколько элементов в массиве. Если взять в пример два варианта выбора, то цикл будет проводится два раза, потому, что в массиве будет два варианта ( элемента ) ответа.

В самом цикле, мы в нужных местах подставляем содержимое массива, в случае если вариант ответа в массиве совпал с вариантом ответа из базы данных, то к тегу option пристыковывается атрибут selected, что позволит администратору видеть какой вариант выбран.

Теперь давайте перепишем строчки в функции configpost() для уже реализованных пунктов

//формирование вариантов выбора настроек
//-----Видим пост в ленте новостей?----
$viQUEtxt = array("Нет","Да");//Вариант для человека
$viQUEint = array(0,1);//Вариант для скрипта
$vi = queCFG($myrow_index[viewindex],$viQUEtxt,$viQUEint);//формируем option для пункта "Видим пост в ленте новостей?"
//-----Видим пост в ленте новостей?----

//-----Разрешить комментировать пост?----
$vcQUEtxt = array("Нет","Да");//Вариант для человека
$vcQUEint = array(0,1);//Вариант для скрипта
$vc = queCFG($myrow_index[viewcomm],$vcQUEtxt,$vcQUEint);//формируем option для пункта "Разрешить комментировать пост?"
//-----Разрешить комментировать пост?----
//Замена код-слов

Как видите мы создаем для каждого пункта по два массива ( $viQUEtxt, $viQUEint и $vcQUEtxt, $vcQUEint ). В одном варианты для тега option, во втором варианты для атрибута value тега option. Так же переписан вызов функции queCFG().

...
$vi = queCFG($myrow_index[viewindex],$viQUEtxt,$viQUEint);
...
$vc = queCFG($myrow_index[viewcomm],$vcQUEtxt,$vcQUEint);
...

В остальном все работает так же как и работало

 

Прикручиваем новый пункт

 

Ну что ж, давайте доработаем нашу функцию configpost(), она ведь должна уметь обрабатывать новый пункт. Я дам Вам полный код этой функции. Еще раз напомню, что эта функция находится в файле configpost.php.

function configpost($id)//Функция вывода списка настроек поста
{
$result_index = mysql_query("SELECT viewindex,viewcomm,sm,xmlsm FROM blog WHERE id='$id'");//Выводим из базы данных конфигурации поста
$myrow_index = mysql_fetch_array($result_index);

$sm_read = file("templates/configpost.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его

//формирование вариантов выбора настроек
//-----Видим пост в ленте новостей?----
$viQUEtxt = array("Нет","Да");//Вариант для человека
$viQUEint = array(0,1);//Вариант для скрипта
$vi = queCFG($myrow_index[viewindex],$viQUEtxt,$viQUEint);//формируем option для пункта "Видим пост в ленте новостей?"
//-----Видим пост в ленте новостей?----

//-----Разрешить комментировать пост?----
$vcQUEtxt = array("Нет","Да");//Вариант для человека
$vcQUEint = array(0,1);//Вариант для скрипта
$vc = queCFG($myrow_index[viewcomm],$vcQUEtxt,$vcQUEint);//формируем option для пункта "Разрешить комментировать пост?"
//-----Разрешить комментировать пост?----

//-----Разместить в файле sitemap.xml?----
//--Подключение/отключение---
$smQUEtxt = array("Нет","Да");//Вариант для человека
$smQUEint = array(0,1);//Вариант для скрипта
$sm = queCFG($myrow_index[sm],$smQUEtxt,$smQUEint);//формируем option для пункта "Разместить в файле sitemap.xml?" ( да или нет )
//--Подключение/отключение---
//-----
//--Частота смены содержания страницы---
$xmlsm = explode("|",$myrow_index[xmlsm]);//Делим запись в БД на массив
$smupQUEtxt = array("Страница меняется всегда",
"Страница меняется каждый час",
"Страница меняется каждый день",
"Страница меняется еженедельно",
"Страница меняется каждый месяц",
"Страница меняется каждый год",
"Страница не меняется");//Вариант для человека
$smupQUEint = array("always","hourly","daily","weekly","monthly","yearly","never");//Вариант для скрипта
$smup = queCFG($xmlsm[0],$smupQUEtxt,$smupQUEint);//формируем option для пункта "Разместить в файле sitemap.xml?" ( обновление )
//--Частота смены содержания страницы---
//-----
//--Приоритетность URL---
$smprQUEtxt = array("Приоритетность URL 0%",
"Приоритетность URL 10%",
"Приоритетность URL 20%",
"Приоритетность URL 30%",
"Приоритетность URL 40%",
"Приоритетность URL 50%",
"Приоритетность URL 60%",
"Приоритетность URL 70%",
"Приоритетность URL 80%",
"Приоритетность URL 90%",
"Приоритетность URL 100%");//Вариант для человека
$smprQUEint = array("0.0","0.1","0.2","0.3","0.4","0.5","0.6","0.7","0.8","0.9","1.0");//Вариант для скрипта
$smpr = queCFG($xmlsm[1],$smprQUEtxt,$smprQUEint);//формируем option для пункта "Разместить в файле sitemap.xml?" ( Приоритетность URL )
//--Приоритетность URL---
//-----Разместить в файле sitemap.xml?----

//Замена код-слов
$sm_read = str_replace("[_id]",$id,$sm_read);//ID поста
$sm_read = str_replace("[_cfgvi]",$vi,$sm_read);//видимость поста на главной странице
$sm_read = str_replace("[_cfgcomm]",$vc,$sm_read);//комм в постах
$sm_read = str_replace("[_cfgsm]",$sm,$sm_read);//поместить в sm файл, да или нет?
$sm_read = str_replace("[_cfgsmup]",$smup,$sm_read);//вариант обновления
$sm_read = str_replace("[_cfgsmpr]",$smpr,$sm_read);//приоритет
return $sm_read;//Выводим с генерированный html код
}

Функция большая, но не сложная, необходимо лишь присмотреться к ее коду Я разделил весь код на блоки, надеюсь Вам это поможет разобраться в ней быстрее. Пробегусь по тем строкам которые я добавил в этой функции.

Самое первое что подверглось изменению, это выборка информации из базы данных

$result_index = mysql_query("SELECT viewindex,viewcomm,sm,xmlsm FROM blog WHERE id='$id'");//Выводим из базы данных конфигурации поста
$myrow_index = mysql_fetch_array($result_index);

Запрос выводит из таблицы blog еще две колонки sm и xmlsm

Изменению двух первых пунктов

//-----Видим пост в ленте новостей?----
$viQUEtxt = array("Нет","Да");//Вариант для человека
$viQUEint = array(0,1);//Вариант для скрипта
$vi = queCFG($myrow_index[viewindex],$viQUEtxt,$viQUEint);//формируем option для пункта "Видим пост в ленте новостей?"
//-----Видим пост в ленте новостей?----

//-----Разрешить комментировать пост?----
$vcQUEtxt = array("Нет","Да");//Вариант для человека
$vcQUEint = array(0,1);//Вариант для скрипта
$vc = queCFG($myrow_index[viewcomm],$vcQUEtxt,$vcQUEint);//формируем option для пункта "Разрешить комментировать пост?"
//-----Разрешить комментировать пост?----

я пояснял выше

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

  • Первый массив первого списка содержит два элемента - "Нет" и "Да"
  • Второй массив первого списка содержит тоже два варианта - "0" и "1"
  • Первый массив второго списка содержит семь элементов - "Страница меняется всегда" ... "Страница не меняется"
  • Второй массив второго списка содержит тоже семь элементов - "always" ... "never"
  • Первый массив третьего списка содержит 11 элементов - "Приоритетность URL 0%" ... "Приоритетность URL 100%"
  • Второй массив третьего списка, как Вы уже догадались , содержит 11 элементов - "0.0" ... "1.0"

Не считая этих массивов, обратите внимание на строчку

...
$xmlsm = explode("|",$myrow_index[xmlsm]);//Делим запись в БД на массив
...

Я думаю Вы уже догадываетесь. У функции queCFG() первая стартовая переменная это информация извлеченная из базы данных. Для третьего пункта настроек, настройка храниться в базе данных в виде "monthly|0.2". Нам необходимо эту строчку превратить в массив с двумя элементами. После чего каждый из элементов отправится в свою функцию, что бы выполнить свое предназначение

...
$smup = queCFG($xmlsm[0],$smupQUEtxt,$smupQUEint);//формируем option для пункта "Разместить в файле sitemap.xml?" ( обновление )
...
$smpr = queCFG($xmlsm[1],$smprQUEtxt,$smprQUEint);//формируем option для пункта "Разместить в файле sitemap.xml?" ( Приоритетность URL )
...

Последние добавления в функцию configpost() это замены код слов на генерированный код

$sm_read = str_replace("[_cfgsm]",$sm,$sm_read);//поместить в sm файл, да или нет?
$sm_read = str_replace("[_cfgsmup]",$smup,$sm_read);//вариант обновления
$sm_read = str_replace("[_cfgsmpr]",$smpr,$sm_read);//приоритет

Собственно это все изменения в функции

 

Обработчик списка настроек

 

Вот полный код обработчика

//ОБРАБОТЧИК
//определяем переменные
if(isset($_POST['viewindex']))$viewindex = $_POST['viewindex'];
if(isset($_POST['viewcomm']))$viewcomm = $_POST['viewcomm'];
if(isset($_POST['sm']))$sm = $_POST['sm'];
if(isset($_POST['xmlsmup']))$xmlsmup = $_POST['xmlsmup'];
if(isset($_POST['xmlsmpr']))$xmlsmpr = $_POST['xmlsmpr'];

//обращение к БД
if(isset($viewindex) AND isset($viewcomm) AND isset($sm) AND isset($xmlsmup) AND isset($xmlsmpr))//если переменная форма была заполнена и отправленна
{
$smCONFIGresult = mysql_query("SELECT sm,xmlsm FROM blog WHERE id='$id'");//Выводим из базы данных некоторые данные для проверки
$smCONFIG = mysql_fetch_array($smCONFIGresult);

$newXMLconfig = $xmlsmup."|".$xmlsmpr;//Склеиваем инфу об обновление и приоритете в одну переменную ( monthly|0.2 )

$newCONFIG = mysql_query ("UPDATE blog SET viewindex='$viewindex',viewcomm='$viewcomm',sm='$sm',xmlsm='$newXMLconfig' WHERE id='$id'");//обнавляем настройки

if($smCONFIG[sm] != $sm OR $smCONFIG[xmlsm] != $newXMLconfig) sitemap($server_root);//Если настройки карты сайты изменились, то записываем их в файл

header("location: ".getenv('HTTP_REFERER'));//Переносим пользовотеля на страницу с списком настроек
exit;
}
//ОБРАБОТЧИК

Первое, что я тут добавил это перевод post переменных в обычные.

Далее идет выборка, из базы данных, настроек для карты сайта. Для чего я это делаю? Все довольно просто. Обработчик запускается каждый раз когда мы вносим какие либо изменения в настройки поста. Данные, касающиеся карты сайта, которые хранятся в базе, помогут распознать, были ли внесены какие либо изменения именно в пункте "Разместить в файле sitemap.xml?". Если администратор изменил что либо в этом пункте, то запустится функция sitemap() которая отредактирует файл sitemap.xml. Если же администратор ничего не менял в пункте "Разместить в файле sitemap.xml?" то функция sitemap() не будет запускаться. В общем выборка из базы данных не даст нам лишний раз править файл sitemap.xml!

После выборки создается переменная newXMLconfig, которая будет хранить в себе настройки ( в виде monthly|0.2 ) посланные администратором при нажатие на кнопку "Сохранить настройки" в списке настроек. Эта переменная нужна будет для определение внес ли администратор какие либо изменения в пункт "Разместить в файле sitemap.xml?" или нет.

Обновляем колонки в базе данных

Сравниваем присланную информацию администратором, и хранящуюся информацию в базе данных. Если данные не совпадают, запускается функция sitemap(). В противном случае, ничего не делается

 

Заключение

 

Подводя итог, хочу заметить, что такого списка настроек нет у движка на котором работает мой блог. А так хочется но так лень сделать!

После такого нововведения Вы, после добавление новой записи на блоге, можете разместить ссылку в файле sitemap.xml, если вам оно конечно нужно

Если у Вас есть что сказать, или у Вас есть какой либо вопрос, то пользуйтесь формой ниже!

Если мой блог показался Вам интересным, то подпишитесь на RSS ленту блога через ридер, или же по почте.

Всего Вам наилучшего! У меня все!

Исходник

______

P.S.: Если Вам интересно развитие компании Apple, развитие ее продукции и не только, то читайте новости Apple на блоге mrtomas.com

 

Возможно Вам будут интересны следующие заметки

Комментарии (3)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Viktor, 19 Февраля 2012 г. 07:21 пишет:
Гость
Алексей, давно пытаюсь установить контакт, присылаю
разные адреса ящиков. Видимо с инопланетянами связаться
легче.
Суть проблемы. На моем сайте на первой странице громче,
чем нужно играет музыка, надо уменьшить громкость, пока
у меня не получается...
Rio-Shaman, 19 Февраля 2012 г. 08:41 пишет:
Автор
Я никогда не работал с движком wordpress, поэтому понятие не имею как Вам помочь. Узнайте какой у Вас стоит плагин, и ищите как решить Вашу проблему через поисковик
Ответ для пользователя: Viktor
AigGocha, 24 Января 2015 г. 23:49 пишет:
Читатель
Доброго времени Всем!
Все отлично работает. Спасибо Алексей.
Есть один вопросик, может я конечно тороплю события, как всегда :), какой есть такой есть прошу прощения коль что не так. И так вопросик, мы будем прикручивать свой favicon, может конечно есть такой пост, а если нет такого поста не подскажете как это реализовать? У вас то вон симпатичный, интересный, оригинальный я бы сказал :).