web-dev-qa-db-ja.com

Wp_get_attachment_linkのAdd_Filterの例

私はAdd_Filterを本当に理解していないと言うことによって私に序文をさせてください、しかし私はそれをここで使いたいと思います。そうでなければ私に知らせてください。

リンクのURLが変わるように wp_get_attachment_link を変更します。たとえば、ファイルに直接移動するのではなくギャラリーのサムネイルをクリックした場合は、www.foo.comに移動します。

だから私がやりたいのは、wp_get_attachment_linkの動作をadd_filterで置き換えることです。しかし、add_filterがどのように機能するのか理解できません。元の関数からパラメータを取得する方法

オリジナル関数呼び出し

wp_get_attachment_link($id, $size, $permalink, $icon, $text);

フィルタ

add_filter( 'wp_get_attachment_link', 'modify_attachment_link');

function modify_attachment_link() {
    //how do i access $id, $size, $permalink, $icon and $text???
    $foo = $id.$permalink;
    return $foo;
}
2
mrtsherman

wp-includes/post-template.phpの関数を見てください。そこであなたはあなたが得ることができるどんな情報を見ます:

apply_filters(
    'wp_get_attachment_link'
,   "<a href='$url' title='$post_title'>$link_text</a>"
,   $id
,   $size
,   $permalink
,   $icon
,   $text 
);

$link_textおよび$_postオブジェクトにスタンドアロン変数としてアクセスすることはできません。バグ?バグ!

あなたのフィルタでは、引数の順番を変えることはできません。ただ番号を変えるだけです。

だからadd_filter( 'wp_get_attachment_link', 'modify_attachment_link', 10, 2 );はあなたにリンクマークアップと$idを与えるでしょう。利用可能な引数の最大数は6です。

関数の戻り値は最初の引数を置き換えます。

リンクURLを変更する(テストされていない)例:

/**
 * Replaces the URL for an attachment link.
 *
 * @param  string $markup     Original link markup
 * @param  int    $id         Post id
 * @param  mixed  $size       Image size, array or string
 * @param  string $permalink  URL
 * @param  bool   $icon       Use an icon?
 * @param  bool   $text       Use text?
 * @return string             New markup
 */
function modify_attachment_link( $markup, $id, $size, $permalink, $icon, $text )
{
    // We need just thumbnails.
    if ( 'thumbnail' !== $size )
    {   // Return the original string untouched.
        return $markup;
    }

    // We have stored the new URL in a post meta field.
    // See https://wordpress.stackexchange.com/q/3097 for an example.
    $new_url = get_post_meta( $id, 'extra_url', TRUE );

    if ( empty ( $new_url ) )
    {   // There is no URL.
        return $markup;
    }

    // Recreate the missing information.
    $_post      = & get_post( $id );
    $post_title = esc_attr( $_post->post_title );

    if ( $text ) 
    {
        $link_text = esc_attr( $text );
    } 
    elseif ( 
           ( is_int( $size )    && $size != 0 ) 
        or ( is_string( $size ) && $size != 'none' ) 
        or $size != FALSE 
    ) 
    {
        $link_text = wp_get_attachment_image( $id, $size, $icon );
    } 
    else 
    {
        $link_text = '';
    }

    if ( trim( $link_text ) == '' )
    {
        $link_text = $_post->post_title;
    }

    return "<a href='$new_url' title='$post_title'>$link_text</a>";
}

add_filter( 'wp_get_attachment_link', 'modify_attachment_link', 10, 6 );

参考文献:

6
fuxia
add_filter( 'wp_get_attachment_link', 'modify_attachment_link', 10, 5 );

function modify_attachment_link($id, $size, $permalink, $icon, $text) {
    $foo = $id.$permalink;
    return $foo;
}

source を参照してください。

最後の2つの引数は優先順位と引数の数です。あなたが1以上の引数の数を指定しないと(IIRC)エラーになります。

1
dpgtfc