Создание мобильного навигационного заголовка с интеграцией настроек

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

Я предполагаю, что должен использовать wp_is_mobile(); для тестирования на мобильных устройствах. Я просто немного о том, как это реализовать в WordPress. Мои основные вопросы заключаются в следующем:

  1. Я считаю, что мне нужно подключиться к wp_head или активированному action_wp_head, это правильно?
  2. Я хочу установить цвета для фона и шрифтов в области настроек панели. Как мне это сделать?
  3. Это плагин? Это функция? Этот вопрос касается терминологии, которую я должен использовать.
  4. Заключительный вопрос, где я должен поместить этот код? Я уверен, что это зависит от нескольких предыдущих ответов, поэтому я и просил его последний раз!

    Последнее, что нужно сделать, я знаю, что могу это сделать, изменив get_header() функции get_header() напрямую, но из небольшого числа чтения, которое я сделал, я не думаю, что хочу это сделать. Поправьте меня если я ошибаюсь!


Спасибо за помощь. Я не ищу, чтобы это было написано для меня. Я просто потерялся в море WordPress прямо сейчас и ищу компаса!


Итак, теперь я знаю, что мне это нужно как плагин, так как я бы быстро пересмотрел свой вопрос, как написать плагин, который может изменить заголовок шаблона, без возможности его перезаписывания новой версией wordpress или новой тема или детская тема?

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

Я предполагаю, что должен использовать wp_is_mobile ();

wp_is_mobile() – хороший способ пойти. По моему опыту он признает большинство мобильных устройств, и если вам не все равно, что ipotetic и очень низкий процент устройств не распознаются, вы можете взять его и продолжить.

Последнее, что нужно сделать, я знаю, что могу это сделать, изменив вызов функции get_header () напрямую, но из небольшого числа чтения, которое я сделал, я не думаю, что хочу это сделать. Поправьте меня если я ошибаюсь!

Вы совершенно правы. Если вы измените get_header() , в следующий раз, когда WordPress получит обновление, ваше редактирование будет потеряно. И я уверен, вы этого не хотите.

Я считаю, что мне нужно подключиться к 'wp_head' или 'activate_wp_head' , это правильно?

Ну, нет. Последний полностью не связан, поскольку он запускается на странице активации сайта. Первые пожары на обычных страницах с интерфейсом, но внутри тега <head> (обычно перед закрытием), но вы хотите что-то выводить, поэтому он выходит внутрь <body> , так что крюк не может вам помочь.

К несчастью, нет стандартного способа реализовать вещи в теле шаблонов, то есть полностью территории темы.

Однако в подавляющем большинстве тем WordPress используется get_header() и из OP кажется, что ваша тема не является исключением.

Возможность действовать по этим функциям более чем одна, первая и самая простая – это прямое редактирование файла шаблона, и там, где есть get_header() измените его:

  if ( wp_is_mobile() ) { get_header( 'mobile' ); } else { get_header(); } 

как вы можете видеть в документах , get_header() принимает необязательный аргумент, который изменяет get_header() файл. На самом деле, get_header() вызываемый без аргументов, требует файла с именем header.php в теме root, но если вы передаете строку, для этого требуется файл с именем header-{$name}.php .

Передавая строку, вы можете заставить ее загрузить пользовательский файл, и там помещается все, что вы хотите выводить (возможно, копирование в основном из header.php ); и все готово.

Этот подход требует, чтобы вы действовали непосредственно в файле шаблона. Если вы разработчик темы, чем вы можете рассмотреть этот подход, но если ваша тема происходит откуда- то (скачан, куплен ..), то я предлагаю не делать этого, потому что тема может быть обновлена ​​разработчиком, и если вы отредактировали исходные файлы, что является большой проблемой.

Помимо проблемы обновления, для этого подхода необходимо, чтобы вы get_header() все шаблоны, вызывающие get_header() , например index.php , single.php … и все остальные шаблоны, предоставляемые вашей темой.

Как опытный программист, вы наверняка знаете, что повторение вещей не очень хорошо.

Разумеется, лучше подходить к детской теме .

Несколько строк выше, я сказал, что get_header() требует header.php из корневой папки темы.

Это не совсем так.

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

Это означает, что если вы if ( wp_is_mobile() ) тему, вы можете создать пользовательский header.php , и там, благодаря if ( wp_is_mobile() ) , вы можете делать разные вещи для мобильных устройств: таким образом, любой шаблон вызовет get_header() потребует ваш файл вместо исходного.

Кроме того, если родительская тема обновлена, вы можете получить обновление без проблем. Связанная страница в Codex должна содержать достаточно информации, чтобы вы могли создать дочернюю тему: это очень просто.

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

К несчастью в WordPress вы не можете создать дочернюю тему дочерней темы, поэтому ваш единственный вариант – создать плагин .

Это будет нелегко, не потому, что сборка плагина сложная, но довольно просто, проблема в том, что get_header() не фильтруется, и ваш единственный шанс – создать своего рода «поддельную» тему, поместив все шаблоны в плагин папку и используйте 'template_include' чтобы заставить WordPress загружать шаблоны из вашего плагина, а не из темы.

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


Редактировать 2014/10/09

Что-то о создании плагина для области.

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

Путь к просмотру – это посмотреть на все файлы шаблонов, которые имеют ваши темы (как сказано, этот плагин связан с темой), но вам не нужно смотреть на все файлы, но только на шаблонах первого уровня .

Шаблоны первого уровня – это те, которые непосредственно загружаются WordPress.

Посмотрите на схему иерархии шаблонов , шаблоны первого уровня – те, которые указаны там.

Очень редко, что тема имеет все они, поэтому обратите внимание на то, какие шаблоны использует ваша тема.

Благодаря фильтру 'template_include' упомянутому несколькими строками выше, вы можете заставить WordPress загружать другой файл, а не тот, который он обычно загружает.

Только пример. Предположим, вы посетили url для сингулярного сообщения. WordPress обычно загружает файл single.php в вашей теме, чтобы показывать контент.

Если ваш плагин содержит:

 add_action( 'template_include', function( $template ) { if ( is_single() ) { $template = plugin_dir_path( __FILE__ ) . 'single.php'; } return $template; } ); 

Функция hooking 'template_include' (анонимная функция, выше) получает в качестве аргумента файл шаблона WordPress, который загружается, и все, что он возвращает, будет загружаться WordPress.

В приведенном выше фрагменте я проверил, является ли текущий запрос для отдельной записи, и в этом случае загрузите файл 'single.php' из папки плагина.

Если вам нужно повторить все типы запросов ( is_page() , is_archive() , is_search() и т. Д.), Это потрясающе, но если в вашей папке плагина есть версия всех шаблонов 1-го уровня, используемая вашей темой, вы можете сделать что-то вроде:

 add_action( 'template_include', function( $template ) { $template = plugin_dir_path( __FILE__ ) . basename( $template ); return $template; } ); 

Эти несколько строк кода полностью переопределяют файлы тем и заставляют WordPress всегда загружать шаблоны, названные так же, но в вашей папке плагина, а не в теме один.

Теперь, какие файлы в вашей папке плагина должны содержать? Там вы должны попытаться написать как можно меньше, но это действительно зависит от вашей темы.

Предположим, что single.php из вашей темы содержит только:

 get_header(); get_template_part( 'navigation' ); get_template_part( 'content', get_post_type() ); get_sidebar(); get_footer(); 

Это очень хорошо для вас, потому что вы можете скопировать его в свою папку плагинов и изменить его так:

 if ( wp_is_mobile() ) { require_once . plugin_dir_path( __FILE__ ) . 'mobile-header.php'; } else { get_header(); } get_template_part( 'navigation' ); get_template_part( 'content', get_post_type() ); get_sidebar(); get_footer(); 

Таким образом, почти все содержимое по-прежнему загружается из темы, потому что get_header() get_template_part() , get_sidebar() и get_footer() загружают шаблоны из папки тем, и вы только переопределяете заголовок для мобильных устройств.

Но если ваши файлы шаблонов тем содержат много разметки html, единственный способ пойти – это скопировать и вставить эту разметку в шаблоны плагинов.

Плохие вещи:

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

  • если тема обновлена, ваш плагин не будет тронут каким-либо образом, но, вероятно, если обновление изменило разметку шаблонов тем (это не обязательно, много раз обновления темы для ошибок в functions.php ), вы будете вероятно, необходимо обновить разметку в ваших шаблонах плагинов.

Да, это annoing, и теперь вы знаете причину моего разочарования, о котором я говорил выше.


Заключительный вопрос, где я должен поместить этот код? Я уверен, что это зависит от нескольких предыдущих ответов, поэтому я и просил его последний раз!

Как было сказано выше, если ваша текущая тема не является дочерней темой или является дочерней темой, которую вы разработали сами, простое добавление или редактирование header.php будет выполнять большую часть работы.

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

Я хочу установить цвета для фона и шрифтов в области настроек панели. Как мне это сделать?

Я могу предложить только API-интерфейс WordPress . На связанной странице в Codex вы должны найти достаточную информацию, чтобы иметь возможность начать ее кодирование, также посмотрите на ссылки в параграфе «Внешние ссылки» , вы найдете примеры и пояснения.

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