Добавление кода в <head> для отдельных страниц и записей
Существует ли плагин (или относительно простой способ) для добавления кода в раздел <head>
для отдельных страниц/записей?
У меня многоязычный сайт, и мне нужно реализовать разметку rel="alternate" hreflang, поэтому нужен способ определять rel="alternate"
индивидуально для каждой страницы/записи.
Я искал среди плагинов WordPress, но пока ничего не нашел. Я не особо разбираюсь в программировании, поэтому не могу создать что-то сам, если только это не будет достаточно просто!
ОБНОВЛЕНИЕ
Хорошо, я попробовал сам создать пользовательское поле для этой функциональности, вот что у меня получилось:
<link rel="alternate" href="<?php
while (have_posts()) : the_post();
$alternate = get_post_meta($post->ID, 'alternate', false);
if ($alternate) {
echo $alternate[0];
}
endwhile;
?>" hreflang="<?php
while (have_posts()) : the_post();
$hreflang = get_post_meta($post->ID, 'hreflang', false);
if ($hreflang) {
echo $hreflang[0];
}
endwhile;
?>" />
Это работает нормально, если мне нужно добавить только одну альтернативную страницу. Но когда я пытаюсь добавить больше, добавляется только один экземпляр rel="alternate"
, причем последний добавленный заменяет оригинальный.
Кроме того, на страницах, где я не определил эти пользовательские поля, появляется пустой тег:
<link rel="alternate" href="" hreflang="" />
Может ли кто-нибудь указать мне правильное направление для исправления этих проблем?

Как вы сказали, для каждой страницы/записи это будет работать следующим образом
add_action('wp_head', 'add_link_in_head');
function add_link_in_head()
{
global $post;
if(!empty($post))
{
$alternate = get_post_meta($post->ID, 'alternate', true);
$hreflang = get_post_meta($post->ID, 'hreflang', true);
if(!empty($alternate) && !empty($hreflang))
{
?>
<link rel="alternate" href="<?php echo $alternate; ?>" hreflang="<?php echo $hreflang; ?>" />
<?php
}
}
}
Если нет $alternate и $hreflang, то ссылка не будет добавлена.

Используйте приведенный ниже код в разделе <head>
:
<?php
add_action('wp_head', 'your_function');
function your_function() {
// ваш код будет здесь
}
?>
Для получения дополнительной информации вы можете посетить здесь.

Я не знаю, как именно вы сохраняете данные, но если предположить, что вы используете встроенный метабокс «Произвольные поля», ваши альтернативные страницы должны передаваться в виде массива.
function alternate_pages_links() {
global $post;
if (!is_singular()) {
return;
}
$pat = '<link rel="alternate" href="%s" hreflang="%s" />';
$lang = get_post_meta($post->ID, 'hreflang', true);
$alt = get_post_meta($post->ID, 'alternate');
if (!empty($alt) && !empty($lang)) {
foreach ($alt as $a) {
printf($pat,$a,$lang);
}
}
}
add_action('wp_head','alternate_pages_links');
Однако я вижу потенциальную проблему. Если вам нужно иметь несколько связанных пар alternate
/hreflang
для каждой записи, то их нужно сохранять в базе данных именно парами. В противном случае не будет возможности определить, какой hreflang
относится к какому alternate
. Для этого вам потребуется создать собственный метабокс.

Извините, у меня нет 50 репутации, чтобы добавить комментарий.
Ответ dot1 идеально подходит для добавления альтернативных ссылок в раздел head, получая значения из метаполей записи. Но теперь вам нужно добавить пользовательские метаполя для hreflang и альтернативных значений для каждой страницы/записи через экран редактирования или создать метабокс для этого.
// Хук метабокса для альтернативных ссылок в WordPress
add_action( 'admin_init', 'add_my_link_metabox' );
// Добавляем метабокс
function add_my_link_metabox() {
// Для записей
add_meta_box( 'link_meta_box', __( 'Атрибуты альтернативной ссылки', 'Ваш текстовый домен' ), 'my_link_data_function', 'post', 'side', 'core' );
// Для страниц
add_meta_box( 'link_meta_box', __( 'Атрибуты альтернативной ссылки', 'Ваш текстовый домен' ), 'my_link_data_function', 'page', 'side', 'core' );
}
// Функция для отображения метабокса
function my_link_data_function() {
global $post, $post_id;
$alternate = get_post_meta($post->ID, 'alternate', true);
$hreflang = get_post_meta($post->ID, 'hreflang', true);
// Генерируем HTML для метабокса ?>
<div class="admin-inside-box">
<p>
<input type="hidden" name="my_meta_nonce" value="<?php echo wp_create_nonce( basename(__FILE__) ); ?>" />
</p>
<p>
<label>Альтернативная ссылка</label>
<input type="text" class="widefat" name="alternate" value="<?php echo $alternate; ?>" />
</p>
<p>
<label>Атрибут hreflang</label>
<input type="text" class="widefat" name="hreflang" value="<?php echo $hreflang; ?>" />
</p>
</div>
<?php
}
// Сохраняем данные метабокса при сохранении записи
// Хук в действие save_post
add_action( 'save_post', 'save_my_link_data' );
// Функция для сохранения значений
function save_my_link_data() {
global $post, $post_id;
// Проверяем nonce
if ( !wp_verify_nonce( $_POST['my_meta_nonce'], basename(__FILE__) ) ) {
return $post_id;
}
// Проверяем права пользователя на редактирование
if ( !current_user_can( 'edit_post', $post_id ) ) {
return $post_id;
}
// Сохраняем/обновляем значения в метаполях
update_post_meta( $post_id, 'alternate', $_POST['alternate'] );
update_post_meta( $post_id, 'hreflang', $_POST['hreflang'] );
}
// Хук для добавления альтернативной ссылки в head
add_action('wp_head', 'add_link_in_head');
function add_link_in_head(){
global $post;
if (!empty($post)) {
$alternate = get_post_meta($post->ID, 'alternate', true);
$hreflang = get_post_meta($post->ID, 'hreflang', true);
if (!empty($alternate) && !empty($hreflang)) { ?>
<link rel="alternate" href="<?php echo $alternate; ?>" hreflang="<?php echo $hreflang; ?>" /><?php
}
}
}
Надеюсь, это поможет вам. Вы можете изменить названия функций и т.д.

Это нужно добавлять в functions.php? Я добавил это в начало и получил ошибку: Parse error: syntax error, unexpected '<' in /xxxxxxxxx/functions.php on line 2

отредактировано и теперь работает, добавьте это и код dot1 в functions.php

Хм, я получаю parse error всякий раз, когда добавляю ваш код или код Dots в мой functions.php

@moobot о, ошибка парсинга на какой строке? и тебе нужно добавить оба кода — мой и Dot's

@moobot отредактировал и объединил коды, скопируй и вставь код выше в functions.php своей темы и сообщи мне.

Если вы используете Transposh (плагин, который я разработал) для управления многоязычными сайтами, то rel=alternate будет добавляться автоматически (с возможностью отключения этой функции).
Однако, причина, по которой я отвечаю на этот вопрос, заключается в том, что, по моему опыту, результаты добавления этого тега оказались крайне неудовлетворительными, поэтому я не уверен, что его добавление вообще полезно.
Удачи
