web-dev-qa-db-ja.com

投稿画像の下に埋め込みリンクと一緒に画像の説明を表示

Wordpressの投稿には、次のようなフィールド設定の画像があります。

キャプション:このフィールドには、画像の下に表示される実際の画像キャプションが含まれています。

説明:このフィールドには、属性付きソースへのリンク付きの写真クレジットが含まれています。

このように画像の真下にこれらの値を表示する必要があります。

enter image description here

@toschoから この の質問への優れた答えからヒントを得て、私はこの関数を試してみました:

add_shortcode('wp_caption', 'img_caption_add_description');
add_shortcode('caption', 'img_caption_add_description');
function img_caption_add_description($attr, $content = null)
{
    $post_id = str_replace('attachment_', '', $attr['id']);
    $img = get_post((int)$post_id);

    if (is_a($img, 'WP_Post')) {
        $attr['caption'] = $img->post_content;
    }

    return img_caption_shortcode($attr, $content);
}

あなたがスクリーンショットで見ることができるように、それがすべてのハイパーリンクを取り除くことを除いて、機能はうまく機能します。私はそれらが必要です!リンクを尊重するように上記の機能を変更する方法はありますか?たとえば、上の例では、テキスト "Amit Schandillia"と "CC BY-SA 3.0"は両方ともハイパーリンクであることを意味しています。私の説明欄には以下のようなリンクがあります。

Photo credit: <a href="" target="_blank" rel="nofollow">Amit Schandillia</a> licensed <a href="" target="_blank" rel="nofollow"><i class="fa fa-creative-commons"></i> BY-SA 3.0</a>

投稿ページにレンダリングされるときに<a>タグが確実に残るようにするにはどうすればよいですか。

1
TheLearner

最後の行 img_caption_shortcode() を見ると、 wp_kses() で許可されていないHTMLタグが削除されているのがわかります。 wp_kses_hook() 関数はフィルタをラップするだけです:

return apply_filters( 'pre_kses', $string, $allowed_html, $allowed_protocols );

タグを削除する関数として wp_kses_split() を指定してpreg_replace_callbackを使用することで、最後に _wp_kses_split_callback() がHTMLタグを削除する前に、フックして出力を変更することができます。

_wp_kses_split_callback()の中では、 wp_kses_split2() 関数が呼ばれていますが、(悪い)選択肢もあります。グローバルを変更する。

コールバックには、次の2つのグローバルがあります。

global $pass_allowed_html, $pass_allowed_protocols;

次のこともできることを意味します(お勧めしません)。

// Fetch the global context
global $pass_allowed_html;
// Save the global context for restoring it to not nuke other code
$temp = $pass_allowed_html;
// Alter the context
$GLOBALS['pass_allowed_html'] = [ /* your allowed HTML tags here */ ];
// Fetch the result
$result = img_caption_shortcode();
// Reset the global context
$GLOBALS['pass_allowed_html'] = $temp;
// Return your altered result
return $result;

wp_kses_allowed_html()explicitの場合をトリガーすることに注意してください。

img_caption_shortcode()は値stringpostwp_kses()に渡すだけなので、wp_kses_split2()内の次の行から利益を得ることもできます。

if ( ! is_array( $allowed_html ) )
    $allowed_html = wp_kses_allowed_html( $allowed_html );

[wp_kses_allowed_html()]をもう一度見てください。

return apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );

あなたは単にこのフィルタを使うことができます。他のコンテンツと競合しないように実行した後は、必ず{ フィルタを再度削除する }してください。

1
kaiser