Используйте шорткод WordPress для добавления тегов <meta> - PullRequest
8 голосов
/ 04 марта 2012

Я пишу простой плагин WordPress, который использует шорткод. Я хочу, чтобы страница, содержащая шорткод, имела определенные теги <meta>. Это возможно? И если так, есть ли элегантный способ сделать это?

Я знаю, что могу добавить <meta> теги с помощью хука wp_head, но я хочу, чтобы содержимое метатега совпадало со строкой, созданной плагином. Я мог бы переместить весь код в заголовок, но тогда я не уверен, как ссылаться на него позже из шорткода. Другими словами, когда я объявляю переменную в <head> с фильтром, она недоступна для методов класса, которые я вызываю с помощью шорткода.

Есть идеи?

ОБНОВЛЕНИЕ:

Было предложено хорошее решение, в котором функция-обработчик для короткого кода добавляет действие в ловушку wp_head:

add_shortcode('fakeshortcode', 'fakeshortcode_handler');
function fakeshortcode_handler() {

    function add_meta_tags() {
        //echo stuff here that will go in the head
    }
    add_action('wp_head', 'add_meta_tags');
}

Это здорово, но проблема в том, что wp_head происходит ДО того, как шорткод будет проанализирован и добавит действие (поэтому ничего не добавляется в заголовок с кодом выше ALONE). Чтобы это заработало, я позаимствовал решение в этом посте . Это в основном функция, которая «смотрит вперед» в пост и видит, есть ли шорткод. Если это так, то ИТ добавляет add_action('wp_head'....

EDIT: Я удалил свой дополнительный вопрос о том, как передать переменную. Это новый вопрос здесь .

1 Ответ

12 голосов
/ 05 марта 2012

Первая попытка (не используйте это ... см. «Редактирование» ниже) :

Во-первых, вам нужно установить свой шорткод примерно так:

add_shortcode( 'metashortcode', 'metashortcode_addshortcode' );

Затем вы создадите функцию, в которой вам нужно будет добавить хук к wp_head с чем-то вроде этого:

function metashortcode_addshortcode() {
    add_action( 'wp_head', 'metashortcode_setmeta' );
}

Затем вы определите, что выхотите сделать в wp_head:

function metashortcode_setmeta() {
    echo '<meta name="key" content="value">';
}

Добавление шорткода [metashortcode] должно добавить ваши метаданные по мере необходимости.Код был предоставлен только для того, чтобы помочь вам понять, как это сделать.Он не был полностью протестирован.

Редактировать: предыдущий код был просто концепцией и не может работать из-за порядка выполнения.Вот рабочий пример, который получит ожидаемый результат:

// Function to hook to "the_posts" (just edit the two variables)
function metashortcode_mycode( $posts ) {
  $shortcode = 'metashortcode';
  $callback_function = 'metashortcode_setmeta';

  return metashortcode_shortcode_to_wphead( $posts, $shortcode, $callback_function );
}

// To execute when shortcode is found
function metashortcode_setmeta() {
    echo '<meta name="key" content="value">';
}

// look for shortcode in the content and apply expected behaviour (don't edit!)
function metashortcode_shortcode_to_wphead( $posts, $shortcode, $callback_function ) {
  if ( empty( $posts ) )
    return $posts;

  $found = false;
  foreach ( $posts as $post ) {
    if ( stripos( $post->post_content, '[' . $shortcode ) !== false ) {
      add_shortcode( $shortcode, '__return_empty_string' );
      $found = true;
      break;
    }
  }

  if ( $found )
    add_action( 'wp_head', $callback_function );

  return $posts;
}

// Instead of creating a shortcode, hook to the_posts
add_action( 'the_posts', 'metashortcode_mycode' );

Наслаждайтесь!

...