web-dev-qa-db-fra.com

Exemple Add_Filter pour wp_get_attachment_link

Permettez-moi de commencer par dire que je ne comprends pas vraiment Add_Filter, mais je pense que je veux l’utiliser ici. Si non s'il vous plaît faites le moi savoir.

Je veux modifier wp_get_attachment_link afin que l'URL du lien change. Ainsi, par exemple, si je clique sur une vignette dans une galerie au lieu d’accéder directement au fichier, je souhaite qu’elle se rende sur www.foo.com.

Donc, ce que je voudrais faire, c'est remplacer ce que wp_get_attachment_link fait via add_filter. Mais je n'arrive pas à comprendre comment add_filter fonctionne. Comment puis-je obtenir les paramètres de la fonction d'origine?

Appel de fonction d'origine

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

Filtre

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

Regardez la fonction dans wp-includes/post-template.php. Vous voyez là quelles informations vous pouvez obtenir:

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

Notez que vous ne pouvez pas accéder aux objets $link_text et $_post en tant que variables autonomes. Punaise? Punaise!

Dans votre filtre, vous ne pouvez pas modifier l'ordre des arguments, mais simplement le nombre.

Donc add_filter( 'wp_get_attachment_link', 'modify_attachment_link', 10, 2 ); vous donnera le balisage du lien et $id. Le nombre le plus élevé d'arguments disponibles est 6 .

La valeur de retour de votre fonction remplacera le premier argument.

Un exemple (non testé) pour changer l'URL du lien:

/**
 * 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 );

Lectures complémentaires:

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;
}

Voir la source .

Les deux derniers arguments sont priorité et nombre d'arguments. Si vous ne spécifiez pas le nombre d'arguments supérieurs à un (IIRC), une erreur sera générée.

1
dpgtfc