Реализация предварительной выборки DNS с помощью WordPress
Я не уверен, звучит ли мой вопрос многообещающе или нет, но то, что я собираюсь спросить, очень актуально. Поэтому, пожалуйста, прочитайте полный вопрос перед голосованием или флагом.
Я пытаюсь реализовать предварительную выборку DNS в моем mu wordpress, как подход к сайту за сайтом. На моем основном сайте я использую дочернюю тему, поэтому я планировал добавить следующий код в function.php
, чтобы получить то, что я ищу.
function dns_prefetch() {
echo '<link rel="dns-prefetch" href="//cdn.mysite.com" />';
echo '<link rel="dns-prefetch" href="//fonts.googleapis.com" />'
}
add_action('wp_head', 'dns_prefetch');
Теперь, как работает wordpress и работает хук, это место этот код в раздел <head>
сгенерированного html, где wp_head()
был вызван в теме (родительской или дочерней) header.php
Но в соответствии с лучшей практикой кодирования Google, лучше всего использовать код предварительной выборки DNS как можно лучше. Согласно Google, лучше использовать его как
<html>
<head>
<link rel="dns-prefetch" href="//cdn.mysite.com" />
<link rel="dns-prefetch" href="//fonts.googleapis.com" />
<!-- rest of my the code -->
</head>
Но я понятия не имею, как это сделать, потому что все темы сначала помещают код в header.php
перед вызовом wp-head
.
Итак, мой вопрос, есть ли какой-либо способ разместить этот код предварительной выборки dns просто после запуска тега <head>
? Пожалуйста, помогите.
3 answers
Начиная с WordPress 4.6.0, существует API подсказок ресурсов, который автоматически добавляет все уникальные домены в очереди, которые вы можете переопределить с помощью wp_resource_hints
- вы должны использовать следующий ответ только в том случае, если вы застряли с
Все, что вы можете сделать, это повысить приоритет вашего крючка:
add_action( 'wp_head', 'dns_prefetch', 0 /* Highest priority */ );
Но помещает ли это мой код сразу после начала тега?
Нет, но он будет выводиться перед любой другой функцией, присоединенной к wp_head
, т.Е. Другой <link />
, большинство таблиц стилей, скриптов плагинов и т.д.
Чтобы поместить его сразу после <head>
, вам, скорее всего, потребуется напрямую отредактировать header.php
вашей темы.
Неужели действительно нет другого пути?
Вы можете взломать его с помощью небольшой буферизации вывода:
function wpse_177395_start_buffering( $template ) {
ob_start();
return $template;
}
add_filter( 'template_include', 'wpse_177395_start_buffering' );
function wpse_177395_flush() {
$content = ob_get_clean();
$content = preg_replace( '/<head[^>]*>/', '$0
<link rel="dns-prefetch" href="//cdn.mysite.com" />
<link rel="dns-prefetch" href="//fonts.googleapis.com" />',
$content
);
echo $content;
}
add_action( 'wp_head', 'wpse_177395_flush', 0 );
Просто небольшие крупицы информации, которые могут помочь в простых настройках (особенно в тех, в которых не используются плагины, использующие ob_start):
1) Вам не нужно помещать вызовы dns-предварительной выборки в качестве первых элементов. Что вам нужно, так это поместить их как можно скорее перед любым другим элементом, вызывающим внешние ресурсы.
2) На самом деле возможно использовать отрицательные числа в качестве приоритета на add_action
.
Следовательно, можно использовать add_action( 'wp_head', 'dns_prefetch', -1 );
и почти гарантированно работать над указанным простые настройки.
На самом деле, мы делали это на https://clinicawp.2aces.com.br работа и надеюсь, что это поможет вам, ребята.
Дочерние темы могут иметь свои собственные header.php файл, верно? Так почему бы просто не бросить ребенка header.php файл в папку дочерней темы, а затем добавьте туда код?
Если я чего-то не упускаю, это действительно кажется самым простым решением.