Добавление кода в <head> для отдельных страниц и записей

16 авг. 2013 г., 12:53:54
Просмотры: 16.9K
Голосов: 4

Существует ли плагин (или относительно простой способ) для добавления кода в раздел <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="" />

Может ли кто-нибудь указать мне правильное направление для исправления этих проблем?

2
Комментарии

Это именно тот идеальный плагин, который вам нужен https://wordpress.org/plugins/header-and-footer-scripts/

Niresh Niresh
17 окт. 2015 г. 06:48:52

Я не разработчик, но мне нужно было добавить код в раздел <head>, чтобы встраивать записи Google в отдельные записи WordPress (не страницы). В инструкциях по встраиванию записи Google указано: "добавьте эту часть в раздел <head>, а эту часть - туда, где вы хотите, чтобы запись отображалась в вашем блоге" (не дословно). Я не имел понятия, что такое раздел Head, так как я обычный пользователь WordPress, а не программист. Но поиск плагинов дал такой результат: http://wordpress.org/plugins/per-page-add-to/ Надеюсь, это поможет.

User User
25 июн. 2014 г. 03:33:02
Все ответы на вопрос 5
0

Как вы сказали, для каждой страницы/записи это будет работать следующим образом

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, то ссылка не будет добавлена.

16 авг. 2013 г. 14:29:03
0

Используйте приведенный ниже код в разделе <head>:

<?php
add_action('wp_head', 'your_function');
function your_function() {    
    // ваш код будет здесь
} 
?>

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

16 авг. 2013 г. 12:59:44
0

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

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. Для этого вам потребуется создать собственный метабокс.

16 авг. 2013 г. 16:56:56
6

Извините, у меня нет 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
       }
     }
  }

Надеюсь, это поможет вам. Вы можете изменить названия функций и т.д.

16 авг. 2013 г. 15:02:32
Комментарии

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

moobot moobot
22 авг. 2013 г. 12:58:27

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

Anjum Anjum
22 авг. 2013 г. 18:48:24

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

moobot moobot
27 авг. 2013 г. 10:23:54

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

Anjum Anjum
27 авг. 2013 г. 11:31:50

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

Anjum Anjum
27 авг. 2013 г. 11:41:57

ОК, отлично, кажется, теперь это работает, но мне нужно иметь возможность добавлять несколько тегов для каждой страницы, потому что так работают теги rel="alternate". Тебе нужно ссылаться на альтернативные страницы и на саму страницу.

moobot moobot
21 окт. 2013 г. 13:16:29
Показать остальные 1 комментариев
0

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

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

Удачи

17 авг. 2013 г. 12:17:20