Functions.php в wordpress

/mu-plugins — обязательные плагины

В WordPress есть также «Обязательные плагины», они находится в директории wp-content/plugins. О них я писал отдельную стать, обязательно ознакомьтесь. А тут я скажу о них коротко:

Обязательные к использованию плагины (Must-use plugins), известные также под названием  — это плагины, которые устанавливаются в специальную папку  в каталоге контента и активируются автоматически (всегда активны) для сайта и сайтов сети. Эти плагины не видно среди обычных плагинов. В админ-панели они отображаются в верхней информационной строке и их невозможно отключить, кроме как удалить файл плагина из каталога wp-content/mu-plugins.

Директива Clean-param

Если адреса страниц сайта содержат динамические параметры, которые не влияют на их содержимое (идентификаторы сессий, пользователей, рефереров и т. п.), вы можете описать их с помощью директивы Clean-param.

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

Например, на сайте есть страницы:

Параметр ref используется только для того, чтобы отследить с какого ресурса был сделан запрос и не меняет содержимое, по всем трем адресам будет показана одна и та же страница с книгой book_id=123. Тогда, если указать директиву следующим образом:

робот Яндекса сведет все адреса страницы к одному:

Если на сайте доступна такая страница, именно она будет участвовать в результатах поиска.

Синтаксис директивы

В первом поле через символ & перечисляются параметры, которые роботу не нужно учитывать. Во втором поле указывается префикс пути страниц, для которых нужно применить правило.

Примечание. Директива Clean-Param является межсекционной, поэтому может быть указана в любом месте файла robots.txt. В случае, если директив указано несколько, все они будут учтены роботом.

Префикс может содержать регулярное выражение в формате, аналогичном файлу robots.txt, но с некоторыми ограничениями: можно использовать только символы A-Za-z0-9.-/*_. При этом символ * трактуется так же, как в файле robots.txt: в конец префикса всегда неявно дописывается символ *. Например:

означает, что параметр s будет считаться незначащим для всех URL, которые начинаются с /forum/showthread.php. Второе поле указывать необязательно, в этом случае правило будет применяться для всех страниц сайта.

Регистр учитывается. Действует ограничение на длину правила — 500 символов. Например:

How to Access wp-content

Unless you have made major changes to your file structure or renamed wp-content to something else (more on that below), you should find it smack dab in the middle of your WordPress installation.

Like wp-admin and wp-includes, wp-content is part of every standard WordPress installation and will automatically be created whenever you install the CMS on a server.

So, in order to access it, all you need to do is log in to your FTP server (for example, via FileZilla). Depending on your host’s setup, you might have to click through to another folder like public_html to get to your site, however, once you are there, that’s exactly where you will find the wp-content directory.

/languages — переводы

Каталог wp-content/languages присутствует только в том случае, если вы устанавливаете не английскую версию WordPress. В нем содержаться все файлы локализации (перевода) WordPress. Такие файлы имеют расширения:

  • .mo — сжатая версия аналогичного .po файла, которая используется при переводе;
  • .po — исходный файл перевода. Этот файл можно использовать для редактирования перевода. После редактирования его нужно скомпилировать в сжатую версию с расширением .mo.

Также в languages могут находиться специальные поддиректории:

  • /pliugns — содержит переводы плагинов. Файл перевода должен иметь формат: название плагина-локаль.mo, например: akismet-ru_RU.mo. Перед загрузкой своего файла перевода, плагин проверяет наличие файла перевода в этой папке и если он там есть, то используется этот файл перевода, а не родной перевод плагина.

  • /themes — содержит переводы тем. Файл перевода должен иметь формат: название темы-локаль.mo, например: twentyfifteen-ru_RU.mo. Также как и с плагинами — эти файлы имеют больший приоритет перед родными файлами перевода темы.

One-click Update # One-click Update

WordPress lets you update with the click of a button.  You can launch the update by clicking the link in the new version banner (if it’s there) or by going to the Dashboard > Updates screen. Once you are on the “Update WordPress” page, click the button “Update Now” to start the process off. You shouldn’t need to do anything else and, once it’s finished, you will be up-to-date.

One-click updates work on most servers. If you have any problems, it is probably related to permissions issues on the filesystem.

File Ownership

WordPress determines what method it will use to connect to the filesystem of your server based on the file ownership of your WordPress files. If the files are owned by the owner of the current process (i.e., the user under which the web server is running), and new files created by WordPress will also be owned by that user, WordPress will directly modify the files all by itself, without asking you for credentials.

WordPress won’t attempt to create the new files directly if they won’t have the correct ownership. Instead, you will be shown a dialog box asking for connection credentials. It is typical for the files to be owned by the FTP account that originally uploaded them. To perform the update, you just need to fill in the connection credentials for that FTP account.

Whether your files are owned by the web server user, or not, will depend on how you installed WordPress and how your server is configured. On some shared hosting platforms, it is a security risk for the files to be owned by the web server user and not a FTP user. See the tutorial on Changing File Permissions for more information, including how to configure file permissions so that multiple FTP users are able to edit the files.

Failed Updates

If you see a “failed update” nag message, delete the file .maintenance from your WordPress directory using FTP. This will remove the “failed update” nag message.

If the one-click upgrade doesn’t work for you, don’t panic! Just try a manual update.

Плагин как альтернатива файлу functions.php

Существует более правильный способ добавлять новые функции для вашего сайта. Необходимо добавить пустой плагин для WordPress и активировать его. Затем в него можно добавлять новые функции, как раньше делали это c файлом functions.php.

Создайте новый файл с расширением .php, например: «functionsphp.php» с кодом:

<?php
/* ====================================
 * Plugin Name: Functions.PHP
 * Description: Мой новый functions.php
 * Version: 1.0
 * ==================================== */

function functionsphp_head_info(){
 echo "\n<!-- Плагин Functions.PHP активен -->\n";
}
add_action('wp_head', 'functionsphp_head_info');

Скопируйте любые функции, которые обычно помечаются как «вставить в functions.php» в ваш новый плагин. После внесение изменений активируйте плагин. Не забудьте выключать плагин при добавлении новых строчек кода. Если после очередной функции сайт выдает ошибки, возможно вы нарушали синтаксис кода или данный код не актуален для вашей версии движка\темы.

Для начинающих разработчиков или для тех кто сам захочет написать функцию для WordPress есть хороший инструмент: Generatewp

Пример

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

Теперь в корне нашей темы (на одном уровне index.php) создадим страницу home.php со следующим кодом (код можно посмотреть на gitHub):

Давайте разберем его по частям.

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

Цикл написан так: if (have_posts()) – он проверяет, есть ли у вас записи, а затем говорит, пока у вас есть запсиси while (have_posts())  – покажите их the_post()!

Оператор if начинается с if, затем дает вам состояние else (не всегда требуется), а затем заканчивается endif.

Оператор while начинается с while и заканчивается endwhile.

В случае цикла вы увидите, что мы начинаем с оператора if, затем идет оператор while, затем мы заканчиваем while с endwhile, затем приходит оператор else и, наконец, endif, чтобы остановить все.

Между оператором while и оператором endwhile мы хотим включить html для структурирования макета сообщений в блоге. В заявлении else всегда лучше предоставить простое предложение, которое говорит что-то вроде “Извините! Сообщений не найдено». Это лучшая практика на случай, если вы еще не добавили записи, и кто-то зайдет на страницу блога.

Внутри цикла есть несколько действительно важных функций, первая из которых-вызов миниатюры изображения записи. Вызывается эта функция the_post_thumbnail(). Хорошая практика перед вызовом миниатюры проверять, существует ли она вообще. Поэтому мы создаем другой оператор if, который использует функцию has_post_thumbnail (). Итак, мы спрашиваем WordPress, есть ли данное изображение? Если это так, покажите его, иначе не показывайте его вообще.

the_title(); — будет вызывать название записи в блоге.

Permalink

Постоянная ссылка — это ваш лучший друг! В приведенном выше коде вы увидите, что ссылка прикреплена к изображению и заголовку и помещена в тег src. Это связано с тем, что the_permalink() динамически создает ссылку на основной пост. Помните, что мы смотрим на список сообщений в блоге, которые не показывают весь текст и имеют кнопку read more. Поэтому, прикрепляя постоянную ссылку к src наших якорных тегов, WordPress делает всю работу для вас, чтобы связать страницу блога, которая содержит все содержимое этого одного сообщения.

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

Таким же образом, как и категории, теги используют функцию the_tags ().

В коде мы видим еще три функции, которые не всегда необходимы, но их нужно знать.

Первая-это функция the_date (), которая вводит дату первоначального размещения сообщения в блоге. Мы передаем функцию get_option () в качестве параметра, чтобы захватить формат даты, который выбрали для использования в настройках панели мониторинга.

Затем у нас есть функция the_time (), которая работает также, но вызывает время публикации сообщения. Затем он передает функцию get_option (), чтобы вытащить формат времени, выбранный в настройках панели мониторинга.

И, наконец, у вас есть функция the_author_posts_link (), которая предоставляет вам имя человека, написавшего статью (если вы настроили его как пользователя, и он заполнил свой профиль) и ссылку на отдельную страницу автора.

Последние две функции, которые я хочу показать вам, являются важными!

Второй-the_content (), который я не использую в коде выше, но идет рука об руку с the_excerpt(). The_content() вызывает полную статью и будет использоваться в single.php — файле, который является файлом шаблона для отображения полной статьи записи.

Создаем мета блок произвольных полей

Для создания метаблока нам понадобятся всего 2 хука: add_meta_boxes и save_post, функция add_meta_box() и некоторые знания и . Добавляем следующий код в файл темы :

Назовем его «Дополнительные поля»:

// подключаем функцию активации мета блока (my_extra_fields)
add_action('add_meta_boxes', 'my_extra_fields', 1);

function my_extra_fields() {
	add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high'  );
}

Делается это через, указанную в add_meta_box() функцию extra_fields_box_func(). Именно она отвечает за содержание мета блока:

<?php
// код блока
function extra_fields_box_func( $post ){
	?>
	<p><label><input type="text" name="extra" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:50%" /> ? заголовок страницы (title)</label></p>

	<p>Описание статьи (description):
		<textarea type="text" name="extra" style="width:100%;height:50px;"><?php echo get_post_meta($post->ID, 'description', 1); ?></textarea>
	</p>

	<p>Видимость поста: <?php $mark_v = get_post_meta($post->ID, 'robotmeta', 1); ?>
		 <label><input type="radio" name="extra" value="" <?php checked( $mark_v, '' ); ?> /> index,follow</label>
		 <label><input type="radio" name="extra" value="nofollow" <?php checked( $mark_v, 'nofollow' ); ?> /> nofollow</label>
		 <label><input type="radio" name="extra" value="noindex" <?php checked( $mark_v, 'noindex' ); ?> /> noindex</label>
		 <label><input type="radio" name="extra" value="noindex,nofollow" <?php checked( $mark_v, 'noindex,nofollow' ); ?> /> noindex,nofollow</label>
	</p>

	<p><select name="extra">
			<?php $sel_v = get_post_meta($post->ID, 'select', 1); ?>
			<option value="0">----</option>
			<option value="1" <?php selected( $sel_v, '1' )?> >Выбери меня</option>
			<option value="2" <?php selected( $sel_v, '2' )?> >Нет, меня</option>
			<option value="3" <?php selected( $sel_v, '3' )?> >Лучше меня</option>
		</select> ? выбор за вами</p>

	<input type="hidden" name="extra_fields_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" />
	<?php
}

Все названия полей я оформил в массив extra[], чтобы потом проще было обработать эти данные.

Спрятанное поле name=»extra_fields_nonce», нужно для проверки при сохранении данных.

На этом этапе, мы уже создали блок произвольных полей, теперь нужно обработать данные полей при сохранении поста. Обработать, значит записать их в в базу данных или удалить от туда. Для этого используем хук save_post, который срабатывает в момент сохранения поста. В этот момент мы получим данные из массива extra[] и обработаем них:

// включаем обновление полей при сохранении
add_action( 'save_post', 'my_extra_fields_update', 0 );

## Сохраняем данные, при сохранении поста
function my_extra_fields_update( $post_id ){
	// базовая проверка
	if (
		   empty( $_POST )
		|| ! wp_verify_nonce( $_POST, __FILE__ )
		|| wp_is_post_autosave( $post_id )
		|| wp_is_post_revision( $post_id )
	)
		return false;

	// Все ОК! Теперь, нужно сохранить/удалить данные
	$_POST = array_map( 'sanitize_text_field', $_POST ); // чистим все данные от пробелов по краям
	foreach( $_POST as $key => $value ){
		if( empty($value) ){
			delete_post_meta( $post_id, $key ); // удаляем поле если значение пустое
			continue;
		}

		update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически
	}

	return $post_id;
}

Вот и все, блок произвольных полей готов!

Теперь, изменяя html код, мы можем редактировать содержимое мета блока. Но не забываем, что названия полей имеют вид массива со значением ключа произвольно поля: name=»extra».

Чтобы не было ошибок, учитывайте 4 момента:

Пример, у нас была такая структура:

<?php
........здесь код.........
?>

Если Вы добавили php код так, то это вызовет ошибку или, что еще хуже, белый экран, когда показ ошибок отключен:

<?php
........здесь код.........
   <?php
   ...... здесь добавленный код ........
   ?>
........здесь код.........
?>

Правильно так:

<?php
........здесь код.........

   ........ здесь добавленный код ........

........здесь код.........
?>

Такой код вызовет ошибку:

<?php
 ...... здесь код ........
?>
<?php
 ...... здесь добавленный код ........
?>

А этот нет:

<?php
 ...... здесь код ........
?><?php
 ...... здесь добавленный код ........
?>

Логичнее его записать так:

<?php
 ...... здесь код ........

 ...... здесь добавленный код ........
?>

Бывает что перенос строки ставят в самом конце functions.php, вот тогда это становится настоящей проблемой, потому что все казалось бы правильно, но сайт не работает. На самом деле после ?> или  до <?php присутствуют невидимый символ переноса строки \n. Выглядит такая ошибка, крайне безобидно, вот так:

<?php
... начало файла ...
  ...... здесь код ........
... конец файла ...
?>
здесь пустая строчка

По этой причине многие разработчики вообще удаляют закрывающий тег ?>, это допустимо для PHP. Рекомендую всегда делать именно так:

<?php
... начало файла ...
  ...... здесь код ........
... конец файла ...

Если в functions.php присутствует функция, то внутри этой функции можно использовать теги и , например, для того, чтобы визуально выделить HTML код внутри функции:

<?php
... начало файла ...

function function_name(){
	?>
		 <div>это html код</div>
	<?php 
}

... конец файла ...
?>

Дело в том, что в этом случае функция только лишь регистрируется и не выполняет никаких действий. Все что внутри функции (между { }) не работает пока эта функция не будет вызвана, а вызываются такие функции обычно из шаблона или через фильтры, уже после того как отправлены HTTP заголовки. Поэтому в данном примере, мы можем игнорировать переносы строк и использовать ?> и <?php как угодно.

Еще одна заметка касательно файла functions.php: устанавливайте файлу кодировку UTF-8 (UTF-8 без BOM). Иначе, если функции в файле будет текст на кириллице, то он выведется непонятными символами: кракозябрами, каракулями — называйте как хотите.

Статьи до этого: Новичкам

Что такое Цикл WordPress — The Loop

Как работает иерархия шаблонов WordPress

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

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

  1. WordPress будет искать файл шаблона под названием category-hosting.php в каталоге текущей темы.
  2. Если файл category-hosting.php не будет найден, WordPress будет искать тот, который использует идентификатор категории, например, category-2.php.
  3. Если WordPress не найдёт ни одного из этих параметров, он будет искать общий файл category.php.
  4. Если же и файл с именем category.php не будет найден, WordPress откатится назад и будет искать шаблон archive.php.
  5. Наконец, если все остальные действия закончатся безуспешно, платформа загрузит файл index.php вашей темы и будет использовать его в качестве шаблона страницы.

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

Список старых неиспользуемых опций

Эти опции удаляются (если они есть) при обновлении WordPress.

Актуальный список находится в переменной в файле :

blodotgsping_url
bodyterminator
emailtestonly
phoneemail_separator
smilies_directory
subjectprefix
use_bbcode
use_blodotgsping
use_phoneemail
use_quicktags
use_weblogsping
weblogs_cache_file
use_preview
use_htmltrans
smilies_directory
fileupload_allowedusers
use_phoneemail
default_post_status
default_post_category
archive_mode
time_difference
links_minadminlevel
links_use_adminlevels
links_rating_type
links_rating_char
links_rating_ignore_zero
links_rating_single_image
links_rating_image0
links_rating_image1
links_rating_image2
links_rating_image3
links_rating_image4
links_rating_image5
links_rating_image6
links_rating_image7
links_rating_image8
links_rating_image9
links_recently_updated_time
links_recently_updated_prepend
links_recently_updated_append
weblogs_cacheminutes
comment_allowed_tags
search_engine_friendly_urls
default_geourl_lat
default_geourl_lon
use_default_geourl
weblogs_xml_url
new_users_can_blog
_wpnonce
_wp_http_referer
Update
action
rich_editing
autosave_interval
deactivated_plugins
can_compress_scripts
page_uris
update_core
update_plugins
update_themes
doing_cron
random_seed
rss_excerpt_length
secret
use_linksupdate
default_comment_status_page
wporg_popular_tags
what_to_show
rss_language
language
enable_xmlrpc
enable_app
embed_autourls
default_post_edit_rows
gzipcompression
advanced_edit

functions.php против плагинов

— «Плагины работают медленнее чем код в файле functions.php», говорят неосведомленные — это не так!

Нет никакой разницы в скорости работы кода, не важно подключается он через плагин или через файл functions.php. Подробнее читайте в отдельной заметке

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

Второй пример выше «Данные о количестве запросов к базе данных в подвале админки». По логике не подходит для использования в файле functions.php. Потому что, если мы сменим шаблон, то мы потеряем этот функционал, а он используется в админке и нужен независимо от того какая тема используется.

Поэтому, давайте удалим его из functions.php и сделаем из него плагин — это просто!

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

<?php
/**
 * Plugin Name: Здесь любое название плагина
 */

// код плагина

add_filter( 'admin_footer_text', 'wp_usage' );
function wp_usage(){
	echo sprintf(
		__( 'SQL: %d за %s сек. %s MB', 'km' ),
		get_num_queries(),
		timer_stop( 0, 3 ),
		round( memory_get_peak_usage()/1024/1024, 2 )
	);
}

Если нет желания видеть еще один плагин в админ-панели, то можно использовать Must-Use плагины.

/uploads — медиафайлы и загрузки

WordPress хранит загруженные файлы в папке wp-content/uploads. Эта директория не существует в дистрибутиве WordPress по умолчанию. Она создается при первой загрузке файла в WordPress. Отдельное создание необходимо, потому что эта папка может быть перемещена в другое место (см. ниже)

По умолчанию WordPress хранит загрузки в папке по месяцам и годам:

/wp-content/uploads/2012/06/image.png

Перед тем как можно будет загружать какие-либо изображения или файлы в WordPress, на сервере необходимо разрешить создание папок в директории /wp-content. При загрузке первого изображения WordPress автоматически создает директорию /uploads и необходимые поддиректории в ней. После того как первый файл загружен, верните права для обратно, обычно 755. Некоторые серверы сразу позволяют скрипту создавать папки и файлы.

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

WordPress НЕ умеет распознавать и импортировать в админку изображения загруженные в напрямую (не через админку). И в библиотеке файлов WordPress такие файлы не отображаются — WordPress о них ничего не знает.

uploads в Multisite

В Multisite установке для основного сайта фалы загружаются как обычно. А для всех дополнительных сайтов, создается папка /wp-content/uploads/sites/2, где 2 — это ID сайта сети.

Так для каждого сайта создается папка с его ID в папке /wp-content/uploads/sites. Далее файлы также располагаются в папках по году и месяцу.

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

До версии WP 3.5 файлы дополнительных сайтов располагались не в /wp-content/uploads/sites, а в /wp-content/blogs.dir.

Так например, директория для сайта с ID 3 выглядит так:

  • WP 3.5 и выше: /wp-content/uploads/sites/3
  • WP 3.4 и ниже: /wp-content/blogs.dir/3
Перемещение папки

Чтобы переместить папку uploads нужно определить константу в так:

define('UPLOADS', 'uploads'); // значит что папка uploads должна лежать в корне сайта

Или можно изменить опции: ‘upload_path’ и ‘upload_url_path’ в таблице опций (см. update_option()).

Перемещать папку uploads не рекомендуется, об этом я писал в статье: Баг с перемещением папки uploads.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector