Неизмеримый page server pagename. Суперглобальный массив $_SERVER. Требования к серверу

Ищут обычно в массиве элементы типа Number , String или Object . Естественно, самый быстрый способ поиска - по элементам типа Number , сравнение числа, даже очень большого, происходит очень быстро, гораздо проще проверить один элемент, чем лексиграфически сравнивать строки, а с объектами вообще другая история. Если мы ищем именно тот объект, который мы добавили в массив, то есть сравниваем ссылки - это так же быстро, как и сравнивать числа, а вот если же надо искать по свойствам объекта, то это может весьма и весьма затянуться. В особо сложных случаях, советую составлять какой-нибудь хэш объекта и строить отдельным массив-карту, в которой уже спокойно искать всё, что надо найти.

Разберем 6 способов сделать это на нативном JS разной новизны и 3 способа с их разбором на популярных фреймворках: jQuery , underscore и lodash .

Часть первая, нативная, в стиле аллегро

Для начала надо пройтись по родным возможностям языка и посмотреть, что можно сделать самим.

Поиск в лоб

Попробуем просто идти по элементам массива, пока мы не встретим то, что нам нужно. Как всегда самое простое решение является в среднем самым быстрым.

Function contains(arr, elem) { for (var i = 0; i < arr.length; i++) { if (arr[i] === elem) { return true; } } return false; }

Работает везде. Сравнивает строго, с помощью === . Легко можно заменить на == , бывает полезно, когда элементы массива разных типов, но может замедлить поиск. Его можно и модифицировать, добавив возможность начинать поиск элемента с конца. Шикарно ищет цифры, строки. Немного расширив, можно добавить возможность поиска элемента по своему условию (это поможет нам искать по свойствам объекта или, например, первый элемент, который больше 100500):

Function contains(arr, pred) { for (var i = 0; i < arr.length; i++) { if (typeof pred == "function" && pred(arr[i], i, arr) || arr[i] === elem) { return true; } } return false; }

Array.prototype.indexOf()

Array.prototype.indexOf(searchElement[, fromIndex = 0]) - старый добрый метод, заставляющий всех мучиться со своей -1 в случае, когда элемента нет.

Function contains(arr, elem) { return arr.indexOf(elem) != -1; }

Поддерживается он везде, кроме IE <= 7, но это уже давно забытая шутка. Данный метод выполняет поиск элемента строго от меньшего индекса к большему, применяя при сравнении === . Увы, по свойствам объекта мы так искать не сможем. arr.indexOf(searchElement, fromIndex) принимает два аргумента, первый searchElement - это элемент который ищем, а второй, fromIndex , индекс с которого начнем искать (отрицательный говорит интерпретатору начинать поиск с arr.length + fromIndex индекса). Аккуратней, если вы укажете fromIndex больше длины массива, метод нераздумывая вернёт -1 .

Function contains(arr, elem, from) { return arr.indexOf(elem, from) != -1; }

Array.prototype.lastIndexOf()

Array.prototype.lastIndexOf(searchElement[, fromIndex = arr.length - 1]) - справедливости ради надо рассказать и про него. Работает полностью аналогично Array.prototype.indexOf() , но только полностью наоборот (поиск идет в обратном порядке и fromIndex изначально отсчитывается с конца). Заменил конструкцию ret != -1 на!!~ret ради забавы.

Function contains(arr, elem, from) { return !!~arr.lastIndexOf(elem, from); }

Array.prototype.find()

Array.prototype.find(callback[, thisArg]) - модный стильный и молодежный ES6, со всеми вытекающими:

Function contains(arr, elem) { return arr.find((i) => i === elem) != -1; }

Возвращает элемент или -1 , если ничего не найдено. Ищет с помощью callback(elem, index, arr) , то есть, если эта функция вернет true , то это именно тот самый, искомый элемент. Конечно, эту функцию можно задавать самому, поэтому метод универсален.

Array.prototype.findIndex()

Array.prototype.findIndex(callback[, thisArg]) - полностью аналогичный предыдущему метод, за исключением того, что функция возвращает не элемент, а индекс. Забавы ради сделаю её с возможностью передать свою функцию:

Function contains(arr, pred) { var f = typeof pred == "function" ? pred: (i => i === pred); return arr.findIndex(f) != -1; }

Array.prototype.includes()

Array.prototype.includes(searchElement[, fromIndex]) - а это уже ES7, с ещё пока оочень сырой поддержкой. Наконец-то у нас будет специальный метод, чтобы узнать, есть ли элемент в массиве! Поздравляю!

Arr.includes(elem);

Это всё, что нужно, чтобы найти элемент. Аргументы у этой функции полностью аналогичны Array.prototype.indexOf() . А вот вернет он true в случае успеха и false в обратном. Естественно искать по свойствам объектов нельзя, для этого есть Array.prototype.find() . Должен быть самым быстрым, но... Возможно, что он и станет со временем самым быстрым.

Часть вторая, со вниманием, но чужая и в стиле сонаты

Теперь, наконец, можно поговорить об этой же теме, но в контексте парочки фреймворков! Говорят, что всегда хорошо посмотреть сначала, как делают другие, перед тем, как начнешь делать это сам. Может это откроет нам глаза на что-нибудь интересное!

jQuery

jQuery.inArray(value, array [, fromIndex ]) - между прочим весьма быстрый метод, по тестам.

Использует внутри строгое равенство === и возвращает -1 , если ничего не нашел, а если все таки нашёл, то вернет его индекс. Для удобства и одинаковости обернем её в функцию:

Function contains(arr, elem) { return jQuery.inArray(elem, arr) != -1; }

А теперь поговорим, как она работает. Вот, что она представляет из себя в версии 2.1.3:

InArray: function(elem, arr, i) { return arr == null ? -1: indexOf.call(arr, elem, i); }

Где indexOf это вот это:

// Use a stripped-down indexOf as it"s faster than native // http://jsperf.com/thor-indexof-vs-for/5 indexOf = function(list, elem) { var i = 0, len = list.length; for (; i < len; i++) { if (list[i] === elem) { return i; } } return -1; }

Забавный комментарий говорит, что так быстрее, чем родной Array.prototype.indexOf() (могу предположить, что из-за отсутствия всех проверок) и предлагает посмотреть тесты производительности.

По сути - это самый первый способ из первой части.

Underscore

_.contains(list, value) - вот такой метод предлагает нам популярная библиотека для работы с коллекциями. То же самое, что и _.include(list, value) .

Использует === для сравнения. Вернёт true , если в list содержится элемент, который мы ищем. Если list является массивом, будет вызван метод indexOf.

Contains = _.include = function(obj, target) { if (obj == null) return false; if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; return any(obj, function(value) { return value === target; }); };

Где nativeIndexOf - штука, которая говорит, что Array.prototype.indexOf() существует, а obj.indexOf === nativeIndexOf говорит, что list - массив. Теперь понятно, почему этот метод медленнее, чем jQuery.inArray() , просто обертка над Array.prototype.indexOf() . Ничего интересного.

Lodash

_.includes(collection, target, ) - вот последняя надежда на новые мысли, от второй знаменитейшей библиотеки для работы с коллекциями. То же самое, что _.contains() и _.include() .

Возвращает true , если содержит и false если нет. fromIndex индекс элемента, с которого начинаем поиск.

Function includes(collection, target, fromIndex, guard) { var length = collection ? getLength(collection) : 0; if (!isLength(length)) { collection = values(collection); length = collection.length; } if (typeof fromIndex != "number" || (guard && isIterateeCall(target, fromIndex, guard))) { fromIndex = 0; } else { fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); } return (typeof collection == "string" || !isArray(collection) && isString(collection)) ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1) : (!!length && getIndexOf(collection, target, fromIndex) > -1); }

guard - служебный аргумент. Сначала находится длина коллекции, выбирается fromIndex , а потом... нет, не Array.prototype.indexOf() ! Для поиска в строке используется String.prototype.indexOf() , а мы идем дальше в _.getIndexOf() и в результате попадём в ло-дашскую имплементацию indexOf() :

Function indexOf(array, value, fromIndex) { var length = array ? array.length: 0; if (!length) { return -1; } if (typeof fromIndex == "number") { fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; } else if (fromIndex) { var index = binaryIndex(array, value); if (index < length && (value === value ? (value === array) : (array !== array))) { return index; } return -1; } return baseIndexOf(array, value, fromIndex || 0); }

Она интересна тем, что fromIndex может принимать значения как Number , так и Boolean и если это всё таки значение булевого типа и оно равно true , то функция будет использовать бинарный поиск по массиву! Прикольно. Иначе же выполнится indexOf() попроще:

Function baseIndexOf(array, value, fromIndex) { if (value !== value) { return indexOfNaN(array, fromIndex); } var index = fromIndex - 1, length = array.length; while (++index < length) { if (array === value) { return index; } } return -1; }

Интересный ход для случая, когда мы ищем NaN (напомню, что из-за досадной ошибки он не равен сам себе). Выполнится indexOfNaN() , и действительно ни один из всех способов описанных ранее не смог бы найти NaN , кроме тех, естественно, где мы могли сами указать функцию для отбора элементов.

Можно предложить просто обернуть _.indexOf() для поиска элемента:

Function contains(arr, elem, fromIndex) { return _.indexOf(arr, elem, fromIndex) != -1; }

Где fromIndex будет либо индексом откуда начинаем искать, либо true , если мы знаем, что arr отсортирован.

Заключение, хотя и в стиле интермеццо

И да, все эти варианты имеют смысл, только если момент с поиском данных част в вашем алгоритме или поиск происходит на очень больших данных. Вот приведу ниже несколько тестов на поиск элементов типа Number и String в массивах длинной 1000000 (миллион) элементов для трех случаев, когда элемент находится вначале массива, в середине (можно считать за среднюю по палете ситуацию) и в конце (можно считать за время поиска отсутствующего элемента, кроме метода с Array.prototype.lastIndexOf()).

MediaWiki pages name encoding is a complicated topic. MediaWiki magic words PAGENAME, PAGENAMEE and urlencode have distinct implementations, each with their own peculiarities.

A MediaWiki page name can have a leading space but not a trailing space. The ASCII characters that are not allowed in MediaWiki page names are the three types of brackets, sharp sign, underscore and vertical bar, and all control characters (including tabs and newlines).

# < > _ { | } Note that the underscore is not really disallowed, but is treated like a space without distinction in MediaWiki page names, so "A_B" and "A B" are referencing exactly the same page name (pages will be created, searched, and displayed (with their title) using spaces, never using underscores).

This article shall refer to these as the "not-allowed pagename characters". For clarity, we will present other ASCII 7-bit values for characters as the URL-style encoding of percent-hex-hex form known as percent-encoding .

Contents

PAGENAME [ edit ]

Otherwise these dots are left intact by {{urlencode:...}} and {{anchorencode:...}} , but slashes may be converted.

Also the sequence of two successive slashes //) may not be accepted in page names, depending on the configuration of the wiki. Usually this is an indicator that the name is an URL, when it is preceded by a valid URI scheme (or no URI scheme at all where it means a default "http:" or "https:" URI scheme will be used, depending on user"s preference). An URI scheme should then contain a colon (:), but MediaWiki currently recognizes only URI schemes where the colon is final, in a restricted list; otherwise.

For example on this wiki,

"{{PAGENAME|//www.сайт/}}"

"//www.сайт/" .

On Wikimedia sites, such as сайт, the double slashes are recognized as URIs, and most valid URIs are disallowed as page names (if an URI scheme is present, it coud be recognized as a name space it it has been configured, otherwise the page name will fall into the main name space of the wiki):

  • Creating a link to these URI-like page names uses:
    • [[ page name in double brackets | with optional displayed text ]] .
  • But links to the effective target of the URI uses either:
    • [ URL-without-spaces-in-single -brackets with optional displayed text ] , or
    • URI-without-spaces (also displayed show verbatim, but the link will be conditionally activated as it is subject to restrictions of recognized URI schemes).

So on this wiki on сайт, the following code

[]

unexpectely creates a direct link to the external URL, surrounded by verbatim single brackets:

URIs are not recognized by URL-encoding and anchor-encoding (this means that valid full URLs cannot be safely created with urlencode!).

Эти шаги выполнять не нужно . Ваша сеть уже активирована. Когда вы обновите WordPress до версии 3.x, вам будет предложено обновить правила в файле.htaccess для режима Multisite.

  • 1 Перед началом
    • 1.1 Требования к администратору
    • 1.2 Требования к серверу
    • 1.3
  • 2
  • 3
  • 4
  • 5 Шаг 4: Установка сети
  • 6 Шаг 5: Активация сети
  • 7 Шаг 6: Управление сетью
  • 8 Это нужно знать
    • 8.1 Постоянные ссылки
    • 8.2 Плагины WordPress
    • 8.3 Рубрики и метки
    • 8.4 Переключение между поддоменами и подкаталогами
    • 8.5 .htaccess и Mod Rewrite

Перед началом

Требования к администратору

Если вы хотите запустить сеть блогов, вам следует иметь представление об основах администрирования UNIX/Linux. Также рекомендуется знание основ WordPress, PHP, HTML и CSS.
Создать и поддерживать сеть сложнее, чем обычный сайт. Эта страница поможет вам понять, действительно ли вам необходима сеть, и с чем вы можете столкнуться при её создании. Если инструкции на этой странице кажутся вам непонятными, сначала проведите тестирование на локальном сайте, не затрагивая основной.

Требования к серверу

Поскольку данная функция требует настройки сервера и некоторых технических навыков, следует проконсультироваться с вашим хостинг-провайдером по поводу поддержки этой функции. Запускать её на виртуальном хостинге не рекомендуется.
На шаге 4: Установка сети можно выбрать режим поддоменов или подкаталогов. Это означает, что каждый новый сайт вашей сети будет создан как виртуальный поддомен или подкаталог.
  • Поддомены
  • Подкаталоги
Помимо этого, на более позднем этапе можно воспользоваться плагином WordPress MU Domain Mapping , чтобы назначить отдельным сайтам собственные доменные имена.
Сайты в подкаталогах Используется расширение mod_rewrite на сервере с возможностью обработки файла.htaccess , в котором будет создана структура ссылок. Если вы уже используете на своём блоге «красивые» постоянные ссылки, то и сайты в подкаталогах будут работать. Сайты на поддоменах Используется маска для поддоменов . Необходимо разрешить её использование в Apache, а также добавить маску в записи DNS. (См. подробности на шаге 2 .) У некоторых хостинг-провайдеров уже разрешено использование маски, и в этом случае остаётся только добавить запись DNS. На тарифах виртуального хостинга этой возможности может не быть, поэтому перед включением этой функции проконсультируйтесь с вашим хостинг-провайдером.

Требования к параметрам WordPress

  • При включённом режиме Multisite в WordPress 3.0 недоступна возможность размещения WordPress в отдельном каталоге . Она конфликтует с поиском дочерних блогов.
  • Создать сеть нельзя в следующих случаях:
    • «Адрес WordPress (URL)» и «Адрес сайта (URL)» отличаются.
    • «Адрес WordPress (URL)» использует номер порта, отличный от ":80" и ":443".
  • Выбрать режим поддоменов нельзя в следующих случаях:
    • WordPress установлен в подкаталог (вместо корневого каталога).
    • «Адрес WordPress (URL)» совпадает с localhost .
    • «Адрес WordPress (URL)» совпадает с IP-адресом наподобие 127.0.0.1 .
  • Выбрать режим подкаталогов нельзя в следующих случаях:
    • Если ваш сайт существует больше месяца, из-за проблем с существующими постоянными ссылками. (Этот недочёт будет исправлен в одной из следующих версий. См. также «Переключение между поддоменами и подкаталогами» .)
(См. подробности в файле .)

Шаг 1: Создание резервной копии WordPress

При создании сети WordPress будет обновлён. Пожалуйста, сделайте резервную копию базы данных и файлов .

Шаг 2: Настройка маски для поддоменов

(Если вы выбрали режим подкаталогов, пропустите этот шаг .)
Сайты на поддоменах работают с использованием маски для поддоменов. Процесс состоит из двух шагов:
  1. Необходимо настроить поддержку маски в Apache.
    1. Откройте файл httpd.conf или подключаемый файл, содержащий запись VHOST для вашего сайта.
    2. Добавьте следующую строку: ServerAlias *.example.com
  2. В записях DNS для вашего сервера добавьте поддомен с маской, указывающий на основной домен. Это выглядит примерно так: A *.example.com
Если на вашем сервере используется панель Plesk. По сравнению с сервером, использующим cPanel (или вообще без панели управления), настройка маски для поддоменов на сервере, использующем панель Plesk, содержит некоторые отличия. Все необходимые шаги описаны в статье «Configuring Wildcard Subdomains for multi site under Plesk Control Panel‎» . Несмотря на то, что указания довольно подробные, процесс занимает всего несколько минут.
Внешние ссылки:
  • Wildcard DNS record (Wikipedia)
  • Apache Virtual Host (Apache HTTP Server documentation)

Шаг 3: Включение режима Multisite

Чтобы появился пункт меню «Сеть», нужно определить константу режима Multisite в файле wp-config.php .
Откройте wp-config.php и добавьте перед комментарием /* Это всё, дальше не редактируем. Успехов! */ следующую строку:
define("WP_ALLOW_MULTISITE", true);

Шаг 4: Установка сети

У вас должен появиться пункт «Сеть» в меню «Инструменты». Перейдите на страницу. См. также секцию «Перед началом» .
  • Поддомены — пример: site1.example.com и site2.example.com
  • Подкаталоги — пример: example.com/site1 и example.com/site2
Параметры сети Эти значения заполняются автоматически.
Адрес сервера Интернет-адресом вашей сети будет example.com . Название сети Как вы хотите назвать свою сеть? E-mail администратора Ваш адрес e-mail. Убедитесь, что все значения введены правильно, затем нажмите кнопку «Установить».
Возможно, вы увидите предупреждение о маске для поддоменов. См. секцию «Настройка маски для поддоменов» .

Внимание! Возможно, маска DNS настроена неправильно!
Скрипт установки попытался открыть случайный адрес (13cc09.example.com) на вашем домене.
Чтобы использовать режим поддоменов, необходимо использовать маску в записях DNS. В общем случае достаточно добавить с помощью инструмента настройки DNS запись с адресом * , указывающую на ваш сервер. доступна для записи . С помощью команд CHOWN и CHMOD нужно установить такие же параметры, как и у каталога wp-content . 2. Добавьте строки, которые выдаст вам WordPress, в файл wp-config.php . Эти строки создаются динамически в зависимости от конфигурации вашей сети. Откройте файл wp-config.php , оставаясь авторизованным в панели управления сайтом. Добавьте созданные строки сразу перед

Depending on the namespace and the settings, a forward slash in the pagename provides special functionality, see subpage feature .

Namespace prefixes [ edit ]

Also, the first part of a page name may not coincide with a project-independent namespace prefix that is automatically converted to another one . As an example, the name Project: A-Kon on Wikipedia is not possible.

The first part of a page name can coincide with a namespace prefix that is not converted. For example, there might be articles in the English Wikipedia about books called Wikipedia: The Big Adventure and Talk: Secrets are Bad (but only without the space after the colon). However, in that case the pages are in the wrong namespace. This may be inconvenient in searching or displaying a list of pages. Also, in the second case there is no link to a Talk page about the book. (As explained above, the second page name is not possible on e.g. the German Wikipedia: see w:de:Talk: Secrets are Bad).

Prefixes referring to other projects or pseudo-namespaces [ edit ]

A page name cannot start with a prefix that is in use to refer to another project, including language codes, e.g. "en:" (list), or one of the pseudo-namespaces "Media:" and "Special:".

Thus e.g. an article about the album "Q: Are We Not Men? A: We Are Devo!" can not have that exact name. An attempt to create the article, whether by a link Q: Are We Not Men? A: We Are Devo! or a URL http://en.wikipedia.org/wiki/Q:Are_We_Not_Men%3F_A:_We_Are_Devo%21 leads to Wikiquote.

With regard to using the prefix of the project itself there is no consistency: a name like en:a cannot be used on en: (try w:en:a and w:en:en:a), while "Q: Are We Not Men? A: We Are Devo!" can exist on Wikiquote: q:Q: Are We Not Men? A: We Are Devo! .

Maximum page name length [ edit ]

The maximum page name length is 255 bytes (excluding the namespace prefix). Be aware that non-ASCII characters may take up to four bytes in UTF-8 encoding, so the total number of characters you can fit into a title may be less than 255 depending on the language it"s in.

Spaces vs. underscores [ edit ]

In page names , a blank space is equivalent with an underscore. A blank space is displayed in the large font title at the top of the page, the URLs show an underscore. See also below.

Case-sensitivity [ edit ]

Currently the first character of the page name is case-in sensitive, except in the following Wiktionaries:

Case where the first character is case-insensitive

The canonical form is with a capital.

Note that in the case of a prefix that is not a namespace for the software, and in the case of a second prefix, the case-insensitivity does not apply to the first character after this prefix, e.g. Template:H:Interwiki linking and Template:H:interwiki linking are distinguished.

Case-sensitivity of the file name extension of an image [ edit ]

Note that even the file name extension of an image is case-sensitive: compare image:Stop_sign_us.jpg and image:Stop_sign_us.JPG 748410449856

Ignored spaces/underscores [ edit ]

Spaces/underscores which are ignored:

  • those at the start and end of a full page name
  • those at the end of a namespace prefix, before the colon
  • those after the colon of the namespace prefix
  • duplicate consecutive spaces

Some show up in the link label, e.g. [[___help__ :_ _template_ _]] becomes ___help__ :_ _template_ _ , linking to Help:Template .

However, a space before or after a "normal" colon makes a difference, e.g. and MediaWiki User"s Guide: Editing overview , and MediaWiki User"s Guide:Editing overview are all distinguished, because "MediaWiki User"s Guide:" is a pseudo-namespace, not a real one.

Coding of characters [ edit ]

A page name can not contain e.g. %41, because that is automatically converted to the character A, for which %41 is the code. [[%41]] is rendered as . Similarly %C3%80 is automatically converted to the character À. [[%C3%80]] is rendered as . The URL of the page is http://meta.wikipedia.org/wiki/%C3%80 . One can argue what is the real name of the page, %C3%80 or À (a user will say the latter), but anyway there can not be distinct pages with these names.

Canonical form [ edit ]

The inclusion tag for a non-existing page shows a link with the canonical form of the page name: {{qwsazx}}, {{:qwsazx}}, {{project:qws azx}} give Template:Qwsazx , Qwsazx , Wikiquote:Qws azx ; compare with ordinary links Template:qwsazx , qwsazx , project:qws azx ; these work like Piped links , e.g. []; in this case the conversion shows up on the referring page only when pointing at it: in the pop-up and in the status bar (if applicable for the browser); whether the target is a redirect, and what the final target is, is not shown at all.

An attempt to include a page from another project results in just displaying the wikitext, e.g. Template:Qwsazx ; ordinary interwiki links do not show existence and do not show a canonical form in the hover box or status bar: en:project:qwsazx . The same applies if interwiki link style is used for a link to a page in the same project: m:project:qwsazx .

A saved redirect page shows the canonical form of the target, even though the preview renders the link in the usual way, compare with the preview of .

Alphabetical order [ edit ]

Thus we have the following partial list showing the order:

!"#$%&"()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_"
abcdefghijklmnopqrstuvwxyz{|}~
¡¢£¤¥¦§¨©ª«­®¯°±²³´µ ¸¹º»¼½¾¿
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋ
ŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ
ǺǻǼǽǾǿ΄΅Ά·ΈΉΊΌΎΏΐ
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰ
αβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ

Note in particular that "Z" comes before "a", and "z" before "é". The blank space within a page name is treated as an underscore, and therefore comes after the capitals, and before the lower case letters. However, a "blank space" after the name comes before any character. Sometimes a special character looks like a regular letter, but has a special code anyway.

Thus we have the order PC, PCX, PC Bruno, PCjr, Κύρια Σελίδα.

Variables PAGENAME and PAGENAMEE [ edit ]

Within localurl, {{PAGENAME}} should be used in the first part (because it is converted by localurl), or {{PAGENAMEE}} in the second part:

  • {{SERVER}}{{localurl:Special:Allpages|namespace=12&from={{PAGENAMEE}}}} gives here:

//сайт/w/index.php?title=Special:Allpages&namespace=12&from=Page_name

  • {{SERVER}}{{localurl:Special:Allpages/{{PAGENAME}}|namespace=12}} gives here:

//сайт/w/index.php?title=Special:Allpages/Page_name&namespace=12

  • {{SERVER}}{{localurl:Special:Allpages|namespace=12&from={{PAGENAME}}}} gives here:

//сайт/w/index.php?title=Special:Allpages&namespace=12&from=Page name (wrong link)

  • {{SERVER}}{{localurl:Special:Allpages/{{PAGENAMEE}}|namespace=12}} gives here:

//en.wikiquote.org/w/index.php?title=Special:Allpages/Page_name&namespace=12 (works here, the underscore, converted from a space, is not affected by the second conversion, but it does not work with special characters).

Flector 5

Обновлено:

При установке структуры постоянных ссылок в виде "/%category%/%postname%.html " все ссылки на записи начинают заканчиваться на ".html ". Однако, этот формат ссылок никак не влияет на ссылки страниц. Что немного раздражает – подобной структурой ссылок мы подчеркиваем, что на нашем сайте является страницей, а что нет. Страница это то, что с ".html " в конце, а все остальное это рубрики, метки или еще какие другие таксономии. Ссылки на страницы в данном контексте выбиваются из общей картины – они кажутся ссылками на рубрики, хотя это и не так. Плагин эту неприятную ситуацию исправляет, добавляя ссылкам на страницы окончание ".html ".

1 Распаковываем архив.

2 Копируем файл в папку /wp-content/plugins/ .

3 Заходим в админку блога на вкладку "Плагины " и активируем плагин.

Настроек в плагине нет и сразу после своей активации он начинает работать. Теперь все ссылки на страницы превратятся из таких:

Вот в такие:

Но как быть в том случае, если вам надо изменить ".html " на ".htm " или вообще на ".php "? В плагине совсем нет никаких настроек, поэтому его придется отредактировать вручную. Для этого откройте файл плагина и измените в нем следующие строчки:

13 $wp_rewrite ->

$wp_rewrite->

18 $wp_rewrite -> page_structure = "%pagename%.html" ;

$wp_rewrite->page_structure="%pagename%.html";

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

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




Top