9

ショートコードを使用する単純な 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 の上のコードでは何もヘッドに追加されません)。それを機能させるために、この投稿のソリューションを借りました。これは基本的に、投稿を「先読み」し、ショートコードが来るかどうかを確認する機能です。そうである場合、IT は を追加しadd_action('wp_head'...ます。

編集:変数を渡す方法に関するフォローアップの質問を削除しました。ここで新しい質問です

4

1 に答える 1

14

最初の試み(これを使用しないでください...以下の「編集」を参照してください)

まず、ショートコードを次のように設定する必要があります。

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' );

楽しみ!

于 2012-03-04T20:51:15.583 に答える