Чтоб не потерять.
Автора оригинала не ведаю, но помню, что в оригинале был какой-то глюк, исправили. Вроде работает, и даже правильно. 🙂
Вставлять в начало файла functions.php
шаблона темы.
Чтоб не потерять.
Автора оригинала не ведаю, но помню, что в оригинале был какой-то глюк, исправили. Вроде работает, и даже правильно. 🙂
Вставлять в начало файла functions.php
шаблона темы.
Чуть не забыл, ко вчерашнему разговору с товарищем, который про это спрашивал. Ну я тебя, товарищ, немного надул, ибо не погуглил. Не надо никаких костылей с header ('Location: http://natribu.org')
, если по каким-то причинам надо делать редирект со страниц WordPress, то есть стандартная функция
wp_redirect( $location, $status );
где:
$location
— адрес, куда посылаем.
$status
— код HTTP, статус перенаправления.
Подробности, например, тут [Копия]
Вот тестовый шорткод, работает, но где-то реально использовать тупым копипастом не сильно рекомендую, тому ще, во-первых, нет ни единой проверки, во-вторых, если он будет доступен нечестному юзеру, то юзер таким образом может перенаправить хороших пользователей на какую-нибудь бяку, а в-третьих, в мануале написано, что оно из шорткода вроде как работать не должно. Но у меня работает. Так что использовать просто как пример вызова функции wp_redirect
и внимательно читать мануал.
Если перейти в блоге WordPress по ссылке на любой тег, то попадем на страничку, содержащую анонсы постов по данному тегу, адрес странички будет примерно такой:
http://tolik-punkoff.com/tag/manuals/
Где manuals
— собственно, выбранный тег, а tag
— префикс для URL-адреса меток, который можно настроить в консоли WordPress в разделе Настройки — Постоянные ссылки.
Идея такого формата адреса достаточно очевидна, убираешь из строки адреса выбранный тег и попадаешь в список всех тегов, как например это сделано в ЖЖ или LJR
Вообще-то в профессиональной теме WordPress это дело должно бы работать из коробки, потому что вообще-то плохо, если раздел сайта, который логически существовать должен, не существует. И так думаю не я один, а как выяснилось из логов, и роботы. Правда это оказался робот какого-то мелкого поисковика, не Google или Яндекса, но все равно неприятно.
Так вот, если тема не сильно профессиональная, или разработчик забыл о такой мелочи, то посетитель сайта попадет по такой ссылке на страницу 404.
Исправляем досадную неприятность.
В WordPress откровенно не хватает ката в стиле ЖЖ, собственно кат-то там есть, но он монументален, как египетская пирамида и неумолим, как топор палача.
Тег <!--more-->
можно использовать лишь один раз в посту, и все что после него уходит в подкат.
Итак, необходим следующий функционал:
1. Кат в стиле живого журнала, поддерживающий изменение текста ссылки на содержимое под катом, с возможностью использоваться несколько раз в одном посту для скрытия определенных его фрагментов.
2. Сделано это должно быть без javascript и CSS.
<lj-cut>
и </lj-cut>
заменяется на ссылку вида http://blog.livejournal.com/1234567.html#cutid1
со стандартным текстом Read more… или текстом, заданным пользователем. Где1234567.html
— страница, содержащая полный текст постаcutid1
— якорь [4], указывающий на начало скрываемого текста на странице поста.cutid1, cutid2... cutidN
).
Ну ладно, писать, так писать, подумал я и решил добавить возможность задавать осмысленные имена якорей, например, #code, #function, #ioann_grozny_killing_son_2666_x_6666
и т.д.
В директории wp-content
создаем поддиректорию lj-cut
, а в ней файл lj-cut.php
со следующим содержимым:
<?php /* Plugin Name: LJ-cut style cut Description: Add Livejournal-like Cut Shortcode */ function ljcut_shortcode($atts, $content=null) { } add_shortcode ('lj-cut','ljcut_shortcode'); ?>
Информация в комментариях после Plugin Name:
и Description:
будет отображена в админ-панели в разделе плагинов. Plugin Name:
и информация далее должна быть указана обязательно.
Функция ljcut_shortcode($atts, $content=null)
обрабатывает шорткод, ей передаются движком массив с параметрами $atts
и содержимое между открывающим и закрывающим тегом $content
Функция add_shortcode
добавляет шорткод с указанным именем (1 параметр) и устанавливает функцию его обрабатывающую (2 параметр).
Функция обработки шорткода будет вызвана каждый раз, как будет встречена в посту. Ей будут переданы параметры из массива $atts
, указанные в тексте как [shortcodename param1="value1", param2="value2"]
.
1. Заведем 2 статических переменных:
static $cutid=0; //номер текущего cutid в посту
Первая будет хранить номер текущего
static $oldplink=''; //предыдущий permalink
cutid
в посту, а вторая сохранять предыдущую постоянную ссылку на пост. Переменные обязательно должны быть объявлены при помощи ключевого слова static
, иначе их значения будут сброшены при каждом вызове функции.
2. Вытащим из массива $atts
параметры и запишем их в соответствующие переменные. Если параметр не будет определен, то ему будет присвоено значение, указанное в кавычках после =>
extract(shortcode_atts(array( 'text' => 'Read more...', 'unicancor' => '', ), $atts));
4. Получим URL поста, откуда была вызвана функция обработки шорткода, используя внутреннюю функцию WordPress get_permalink()
[2]:
5. $plink=get_permalink(); //получаем URL текущего поста
6. Получим URL текущей страницы:
$clink=get_bloginfo('url').$_SERVER["REQUEST_URI"]; //URL текущей страницы
Функция get_bloginfo('url')
получит адрес блога [3], а в элементе REQUEST_URI
массива $_SERVER
будет находиться значение вида /blog/post.html
если пользователь читает пост на странице поста и значения вида /page/2/
(/author/tolik-punkoff/
, /tag/it/
), если пост читают с какой-то из страниц сайта. В первом случае необходимо показывать весь текст, во втором — заменять скрытую под катом часть на соответствующую ссылку.
7. Далее необходимо проверить, какой раз функция обработки шорткода ката вызывается из поста. Делается это путем сравнения заранее сохраненной постоянной ссылки на пост и только что полученной.
Если ранее сохраненная ссылка не такая же, как и полученная во время вызова функции, значит, мы начали обрабатывать новый пост. В таком случае отсчет текущих фрагментов, скрытых под катом, необходимо начать заново, а постоянную ссылку на новый пост сохранить в соответствующей переменной. Иначе функция была очередной раз вызвана из текущего поста, соответственно, нужно просто увеличить счетчик фрагментов под катом:
if ($oldplink!=$plink) //пост новый, надо начать отсчет cutid заново (с 1) { $cutid=1; $oldplink=$plink; //и сохранить текущий } else //мы все еще обрабатываем старый пост { $cutid++; //прибавляем значение cutid }
8. Далее необходимо сравнить постоянную ссылку на пост (premalink) со ссылкой на той странице, на которой находится пользователь и если пользователь на странице поста — установить якорь [4] и вывести контент, скрытый под катом. Если пользователь на одной из страниц блога со списком постов, то выводится ссылка на пост, дополняемая указателем на якорь (http://tolik-punkoff.com/tag/it/post#ancor
).
Если имя якоря задано пользователем в соответствующем параметре шорткода, то оно и используется, иначе, якорь принимает вид cutidN
, где N
— заранее посчитанный в переменной $cutid
номер.
if ($plink==$clink) { //мы в теле поста, cut надо раскрыть и вставить якорь if ($unicancor=='') //если якорь не задан, используем cutidn { $ret='<a name="cutid' . $cutid . '"></a> ' .$content; } else { $ret='<a name="' . $unicancor . '"></a> ' .$content; } } else { //мы на одной из страниц, но не в самом посту //надо установить ссылку на пост и на нужный якорь в посту if ($unicancor=='') //если якорь не задан, используем cutidn { $ret='<a class="more-link" ' . 'href="' . $plink . '#cutid' . $cutid . '">' . $text . '</a>'; } else { $ret='<a class="more-link" ' . 'href="' . $plink . '#' . $unicancor . '">' . $text . '</a>'; } }
Сохраняем сгенерированный HTML-код в переменной $ret
9. Возвращаем сгенерированный код и завершаем функцию обработки шорткода:
return $ret;
С Pastebin
С Mega.nz
Страничка плагина на сайте HexProject
Страничка плагина на GitHub
Скачать с tolik-punkoff.com
1. Шорткоды в WordPress
2. get_permalink()
3. get_bloginfo()
4. Якорь (HTML)
На полноценную инструкцию особо не претендующая, скорее так, некие примочки и припарки от кулхацкеров и всяких говноботов, да ссылки на найденные в сети материалы.
1.Защищаемся от спама. В комплекте с WordPress идет плагин Akismet, настраивается он довольно просто и от спама защищает хорошо. Вот краткая инструкция, например.
2.Ставим капчу на вход в админ-панель, а заодно и на добавление комментариев, форму восстановления пароля с помощью плагина Securimage-WP. Настраивается он тоже несложно, хотя я особо ничего и не настраивал. Поставил, активировал, зашел в Настройки — Securimage-WP и поставил четыре галочки. Ах да, еще матан-капчу включил.
3.Можно установить плагин WP Security Audit Log и отслеживать различные действия, которые производят как пользователи сайта, так и пытаются произвести вредители. Говорят, что плагин тяжелый, но я особо этого не заметил. А вот боты в форму логина wp-login.php
реально ломились нехилыми пачками и это с учетом того, что у меня не сильно известный и популярный блог. Заодно плагин отслеживает и 404 ошибки, что позволяет вовремя заметить косяки в теме оформления, тегах, структуре сайта и т.д.
4.С помощью плагина Jeba Limit Login Attempts можно ограничить количество попыток ввода логина/пароля до трех штук, после чего вход в админку будет заблокирован на 30 минут. Правда, если количество вредителей, ломящихся в админку, превышает разумные пределы, может статься, что туда будет не попасть самому. Хотя есть способ и рыбку съесть, и ног не намочить. О нем далее.
В принципе, если сайт/блог админится одним человеком или даже небольшой командой и не предусматривает регистрацию пользователей, то вполне можно сделать. В противном случае это особого смысла не имеет, ибо форму логина вредители все равно найдут через виджет Мета, или вам придется каждому новому пользователю объяснять, как входить на сайт.
Шаг 1. Оригинальный wp-login.php переименуем в любое другое название, хоть в «s4gr3gerh6hb.php».
Шаг 2. Затем заменим все слова wp-login.php на новое имя, в нашем случае на s4gr3gerh6hb.php, в файле s4gr3gerh6hb.php (старый wp-login.php) и в файле wp-includes/general-template.php [Копия в PDF]
Можно еще в .htaccess
доступ закрыть, либо устроить редирект куда-нибудь, например на http://www.cia.gov или на http://natribu.org
Способ с изменением .htaccess
считается самым надежным и самым ненагружающим сервер, но если не хочется/нет возможности/лень менять что-то на сервере, то можно сделать редирект и вручную средствами php [Копия в PDF]
Например так:
<?php header('Location: http://natribu.org', true, 301); ?>
Или вообще поизвращаться, написать свой скрипт, который будет демонстрировать визитеру рептилоидов, играющих на баяне OST X-files и вести учет IP и количества обращений к скрипту. Но это все-таки дополнительная нагрузка на сервер.
ДОЧИТАЙТЕ ДО КОНЦА, КАК НЕЗНАНИЕ ИЛИ ПРЕНЕБРЕЖЕНИЕ К МАНУАЛАМ, ЗАСТАВЛЯЕТ ИЗОБРЕТАТЬ ВЕЛОСИПЕДЫ
Столкнулся я с проблемой, а как отобразить в посте не результат работы шорткода, а его вид в редакторе, т.е. его синтаксис. Для шорткодов, в том же самом блоге не используемых — все нормально. Но для тех шорткодов, которые в блоге используешь — возникает понятная проблема. Вставляешь шорткод в блог, и движок на место шорткода вставляет результат функции, его обрабатывающий. А задача стоит отобразить написание шорткода.
Отобразить синтаксис html-тегов проще, достаточно заменить угловые скобки «<» и «>» на эскейп-последовательности html. Для символов «[» и «]», заменяющих «<» и «>» для шорткода, я не нашел эксейп-последовательностей.
functions.php
, хоть в отдельный плагин.<?php
/**
* Plugin Name: shortcodes display
*/
function display_shortcode($atts, $content=null)
{
$ret=$content;
return $ret;
}
add_shortcode ('shortcode','display_shortcode');
?>
ВНИМАНИЕ! Переменную $atts
нужно добавить обязательно, хотя она фактически не используется, т.к. у данного шорткода параметров нет, но так уж устроен движок WordPress, что без наличия первого параметра не обработается и параметр $content
Результат работы:
Благодарю злого анонимуса, который хотел постебаться, и случайно помог, хехе.
Т.е. в виде ссылки с «головастиком», как в тестовом посте
Плюс добавим возможность открывать страницу пользователя ЖЖ/LJR в отдельном окне (вкладке)
<ljr user="username">
или <lj user="username">
, данный псевдотег заменяется на ссылку с дополнительной картинкой-головастиком перед ней, клик по картинке ведет к открытию страницы userinfo пользователя ЖЖ и LJR, а клик по имени пользователя — к открытию главной страницы пользователя блогосервиса. Если вставить в пост на LJR псевдотег <lj user="username">
, то к имени пользователя будет добавлена дополнительная строка — username@lj, указывающая, что дневник пользователя находится в Живом Журнале.
[ljr user="username"] или [lj user="username"]
,blank=1
, например [ljr user="hex_laden" blank=1]
, то ссылки на userinfo (при клике по «головастику») или ссылка на главную страницу блога, откроются в новом окне/вкладке.
wp-content/plugins
, создаем отдельный каталог lj-ljr-users
, в нем подкаталог img
, и загружаем туда графические файлы «головастиков» http://lj.rossia.org/img/userinfo.gif и http://lj.rossia.org/img/userinfo-lj.gif lj-ljr-users.php
в каталоге wp-content/plugins/lj-ljr-users
и вставляем в него нижеследующий код.
styles.css
Правда мы не стали заморачиваться, сообщество это или пользователь, поэтому иконка и для того, и для другого одинакова, например:
Пользователи:
rutopist@lj
tiphareth@ljr
Сообщества:
potsreotizm@lj
durdom@ljr
Наш шорткод имеет замечательную возможность — открывать нужного юзера/сообщество в новой вкладке, например:
ketmar@ljr
veniamin1@lj
cat@ljr
brigada_hella@lj
simple_html_dom.php
Read more…
Для того, чтобы вставить в свой блог на WordPress опрос с LJ.ROSSIA.ORG, останется добавить в пост следующий шорткод:
[ljrpoll id="<poll_id>"]
Где <poll_id>
идентификатор опроса, например 1307
Тестовый пост с отображенным опросом здесь:
http://tolik-punkoff.com/2016/07/26/opros-s-lj-rossia-org-otobrazhaemyj-v-wordpress/
Код плагина доступен на PasteBin:
getpoll.php
Основной файл плагина
Или можно скачать архив с плагином с mega.nz
Папку из архива надо поместить в директорию wp-content/plugins
вашего сайта, после чего зайти в консоль на страницу плагинов (или обновить ее) и активировать плагин LJR-pollDisplay
Позже напишу, как я такой финт ушами сделал (ну не совсем я, финны с китайцами, точнее с камбоджийцами даже, я только идею подал и над процессом руками водил, то бишь советовал):
ERROR: CONNECTION ERROR [http://lj.rossia.org/poll/?id=1307&mode=results]
Пришедшие вчера за помощью студенты натолкнули на мысль окончательно завершить данную тему.
Итак, чего не так в нашем скрипте для определения IP и местоположения пользователя?
А не так то, что мы анализируем лишь один содержащий IP параметр: REMOTE_ADDR
. Т.е. на самом деле это правильно, как сказано в замечательной статье. Но всей информации мы можем не увидеть, и даже у пользователя из какой-нибудь Сызрани, сидящего через не анонимный прокси, вместо Сызрани будет гордо высвечиваться какой-нибудь Вашингтон. Исправим это, поступив точно так, как рекомендуют поступить в вышеозначенной статье. Поле REMOTE_ADDR
будем анализировать в качестве первичного и основного источника информации, а потом пробежимся по всем заголовкам HTTP_
(VIA, X_FORWARDED_FOR, X_CLIENT_IP
и т.д., сколько найдем), достанем из них все, что соответствует шаблону IP, скормим определялке географического положения и выдадим в качестве дополнительной информации.
Пользователь может сидеть не через единственный прокси, а через каскад (тоже не анонимный, хехе). В таком случае, в одном или нескольких заголовках HTTP_
могут быть перечислены несколько прокси, причем тут нет никаких стандартов. Вполне возможна ситуация «кто в лес, кто по дрова»: прокси будут перечислены через запятую, пробел, через знак |, двоеточие. Это тоже нужно учесть.
Read more…
Получился скрипт, выдающий данные об IP пользователя в виде, удобном для машинной обработки (например приложению или скрипту для ведения логов).
header('Content-type: text/plain; charset=utf8');
изменим text/plain
на text/html
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/330304.html
Прокомментировать заметку можно по ссылке выше.
Умницы-карелы прислали последнюю версию движка.
Скачать можно здесь.
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/299287.html
Прокомментировать заметку можно по ссылке выше.
Основан на какой-то галерее, сделали друзья-карелы сто лет назад. На этом движке работает ChaosSoft.
По-умолчанию админский пароль хранится в открытом виде, и передается тоже, посему для безопасности требуется снести с сервера admin.php
и passlogin.php
, после того как все настроили и заполнили сайт информацией. Можно включить нормальную авторизацию.
Требует php, но основан на файлах (MySQL не нужен)
Установка проста:
-Распаковываем архив
-Копируем все файлы в директорию на сервере
-Настраиваем сайт, вносим информацию
-Сносим admin.php
и passlogin.php
Скачать можно здесь (все версии сразу в одном архиве)
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/298530.html
Прокомментировать заметку можно по ссылке выше.
Продолжаем модифицировать скрипт, точнее ответить на вопрос:
Q: Можно ли объединить первую и последнюю версию скрипта, чтоб без параметра скрипт проверял IP, передаваемый сервером, а если указан параметр GET — переданный в параметре IP?
A:
Да, и опять же довольно просто. Надо лишь условие проверки переменной модифицировать соответственно. Условие у нас было:
//проверка наличия переменной if (!isset($_GET['ip'])) { echo 'ERROR|NOT DATA'; //не нашли - вывели сообщение об ошибке и прекратили работу die(); }
Модифицируем условие следующим образом:
$ip=""; //проверка наличия переменной if (isset($_GET['ip'])) { $ip=$_GET['ip']; } else { $ip = $_SERVER['REMOTE_ADDR']; }
Сначала инициализируем переменную $ip
, далее проверяем, если в запросе GET есть параметр ip
, то его значение присваиваем переменной $ip
, иначе берем ее значение из $_SERVER['REMOTE_ADDR'];
Далее, все как в 3 серии
Скачать можно здесь, Посмотреть как работает — здесь.
Картинки — такие же как и в предыдущих выпусках. Посему дублировать не буду.
Предыдущая серия Окончание
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/269411.html
Прокомментировать заметку можно по ссылке выше.
Вот анон задает справедливый вопрос, до которого из парней догадался лишь умник-Ильюша, четырнадцатилетний переросток из Харькова. Из девок — никто.
Итак.
Q: Что будет, если нашему скрипту подсунуть валидный ip, но не с какой точки зрения смысла не имеющие: адреса частных сетей, адреса для «обратной петли» (LOOPBACK)
A: Будет нечто некрасивое: в геобазе закономерно нет частных ip, коих одинаковых миллионы на Земле, но вообще разработчики, конечно, недоработали. Надо штатный ответ на такой запрос.
Т.е. если просто передать частный IP геобазе, то она выдаст что-то типа такого:
0.0.0.0 - 0.255.255.255
, заодно это закрыло дырку в регулярном выражении (пропускались конструкции вида 1.1.1.1.1). Надо было бы подправить регулярку, но мне влом, кто хочет — помогите и подправьте. Дам я вам за это ничерта, спасибо скажу только лишь.
$ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";
function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон
{
return ( ip2long($user_ip)>=ip2long($ip_from) && ip2long($user_ip)<=ip2long($ip_to) );
}
function get_spec_diap ($user_ip) //определение, попал ли IP в специальный диапазон
{
$ret=1;
//Частные IP
if (chkdiapip ($user_ip,'10.0.0.0','10.255.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 10.0.0.0-10.255.255.255";
return $ret;
}
if (chkdiapip ($user_ip,'172.16.0.0','172.31.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 172.16.0.0-172.31.255.255";
return $ret;
}
if (chkdiapip ($user_ip,'192.168.0.0','192.168.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 192.168.0.0-192.168.255.255";
return $ret;
}
//Wrong IP
if (chkdiapip ($user_ip,'0.0.0.0','0.255.255.255'))
{
$ret="WRN|IP WRONG ADDRESS 0.0.0.0-0.255.255.255" ;
return $ret;
}
//IP LOOPBACK
if (chkdiapip ($user_ip,'127.0.0.0','127.255.255.255'))
{
$ret="WRN|IP LOOPBACK ADDRESS 127.0.0.0-127.255.255.255";
return $ret;
}
return $ret;
}
//проверяем, не попал ли IP в особый диапазон
$check_diap = get_spec_diap($ip);
if ($check_diap!=1)
{
echo "IP|".$ip."n";
echo $check_diap;
die();
}
die();
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/269169.html
Прокомментировать заметку можно по ссылке выше.
Мне сегодня в почту поступило довольно закономерных вопросов от моих читателей.
Итак, отвечаю
Q: Как модифицировать скрипт, чтоб можно было проверить любой IP, который захочется задать?
A:
Очень просто. Достаточно передать скрипту нужный IP (здесь я сделаю это с помощью метода GET
)Сначала модифицируем скрипт таким образом:
После
// Подключаем SxGeo.php класс
include("SxGeo.php");
Вставляем код проверки наличия соответствующей переменной GET
пусть у нас она будет ip
//проверка наличия переменной if (!isset($_GET['ip'])) { echo 'ERROR|NOT DATA'; //не нашли - вывели сообщение об ошибке и прекратили работу die(); }
Далее, нам потребуется проверить IP на валидность, мало ли что нам в GET сунули.
Я обычно организую вначале файла «Область функций», хотя с точки зрения PHP это необязательно, но мне так удобно.
После
//Область заголовков
header('Content-type: text/plain; charset=utf8');
Добавляю функцию проверки IP на валидность
// ---------Область функций --------- function isip($ip_str) //проверка соответствия данных формату IP { $ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#"; $ret=FALSE; if (preg_match($ip_pattern,$ip_str)) { $ret=TRUE; } return $ret; } // ---------Конец области функций ---------
Далее, после проверки наличия переменной, вставляем проверку на валидность IP
$ip=$_GET['ip']; // проверка на соответствие формату if (!isip($ip)) { echo 'ERROR|NOT IP'; //не IP - вывели сообщение об ошибке и прекратили работу die(); }
Далее, все как в предыдущей серии. Создаем объект SxGeo и скармливаем ему айпишник, да выводим данные в удобной форме.
Скачать можно здесь, Посмотреть как работает — здесь. Для примера в ссылку вставлен IP прокси анончика из комментария к предыдущей заметке.
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/268782.html
Прокомментировать заметку можно по ссылке выше.
В сети по этому поводу довольно много материала, но я расскажу как это сделал я.
Понадобилось мне написать серверный back-end к одной программе (о ней я при случае расскажу позже), определающей ip клинта и его местоположение.
Задачи определить, сидит ли клиент через неанонимный прокси не было. Если кого-то интересует этот момент, рекомендую статью [Скачать PDF]
Итак, для определения IP нам понадобится собственно IP клиента, который нам обычно любезно предоставляет сервер в переменной $_SERVER['REMOTE_ADDR']
(о других случаях где можно если нужно искать IP — смотрите вышеуказанную статью).
Теперь о б определении местоположения по IP. Для сего действия необходима база геолокации (база, где сопоставлены диапазоны IP и страны, опционально города). Такие базы бывают платные/бесплатные, автономные (можно унести себе на сайт) и не автономные (сидят у кого-нибудь на сервере и выдают информацию по запросу) и т.д.
Для моей задачи нужна была автономная и бесплатная БД. Я воспользовался SxGeo: статья о ней на Хабре, Еще одна и сайт проекта.
Там все довольно просто. Скачиваем нужные базы, скрипт, который ими управляет, ставим на сайт. В комплекте есть небольшой пример.
Чтобы не тыкать по ссылкам, я собрал все в один архив, который можно скачать здесь
А теперь скрипт. Моя задача была небольшая, потому мне хватило просто изменить скрипт примера:
// Переделано из примера [8^12]
header('Content-type: text/plain; charset=utf8');
// Подключаем SxGeo.php класс
include("SxGeo.php");
// Создаем объект
// Первый параметр - имя файла с базой (используется оригинальная бинарная база SxGeo.dat)
// Второй параметр - режим работы:
// SXGEO_FILE (работа с файлом базы, режим по умолчанию);
// SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз)
// SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти)
$SxGeo = new SxGeo('SxGeoCity.dat');
//$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим, если нужно обработать много IP за раз
1. Выдаем нужный заголовок, подключаем основной скрипт SxGeo.php
2. $ip = $_SERVER['REMOTE_ADDR'];
— получаем IP клиента, и записываем информацию в переменную $ip
3. $add_info = $SxGeo->getCityFull($ip); // Вся информация о городе
— передаем IP объекту
$main_info = $SxGeo->get($ip); // Краткая информация о городе или код страны (если используется база SxGeo Country)
SxGeo
, записываем всю полученную информацию в переменные $main_info
и $add_info
(соответственно, основную и дополнительную информацию)
3. Выводим данные в удобном для дальнейшей обработки виде:
echo "IP|".$ip."n";
echo "ISO_CODE|".$main_info['country']['iso']."n";
echo "CITY|".$main_info['city']['name_en'].'|'.
$main_info['city']['lat'].'|'.
$main_info['city']['lon']."n";
echo "COUNTRY_INFO|".$add_info['country']['name_en'].'|'.
$add_info['country']['lat'].'|'.
$add_info['country']['lon']."n";
echo "REGION_INFO|".$add_info['region']['iso'].'|'.
$add_info['region']['name_en']."n";
Посмотреть, как работает скрипт, можно на HexProject, скачать его здесь, а пакет из необходимых баз, скрипта API SxGeo и вышеуказанного скрипта здесь
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/267126.html
Прокомментировать заметку можно по ссылке выше.
Понадобилось. Погуглил — в видимых пределах народ говорит, что это невозможно, либо предлагает всяческое шаманство с CSS и JavaScript, чего ради такой задачи не очень хотелось. Ларчик открылся довольно просто, во всяком случае в Firefox оно сработало. Оказалось, что достаточно в нужное место добавить перенос строки n
, вот так, например:
‘;
echo ‘
‘.»n»;
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/180712.html
Прокомментировать заметку можно по ссылке выше.
с помощью php + javascript
Если надо не назад, а куда-нибудь, то делаем так:
Необходимо помнить, что при вызове history.back()
назад, конечно, вернется, но страничка не обновится, т.к. скорее всего загрузится из кэша браузера. Это надо учитывать, если при возврате назад, необходимо обновить какие-то данные. Вот в таком случае (удаление файла), например:
где:
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/180432.html
Прокомментировать заметку можно по ссылке выше.
Оказывается, если элемент в форме disabled, то в $_POST он не попадает.
Поэтому если что-то disabl’ить — данные надо передавать в скрытых полях.
Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/180221.html
Прокомментировать заметку можно по ссылке выше.