Let me preface by saying I don’t really understand Add_Filter, but I think that I want to be using it here. If not please let me know.
I want to modify wp_get_attachment_link so that the link url changes. So for example if I click on a thumbnail in a gallery instead of going directly to the file I want it to go to www.foo.com.
So what I would like to do is replace what wp_get_attachment_link does via add_filter. But I can’t figure out how add_filter works. How do I get the parameters from the original function?
Original Function Call
wp_get_attachment_link($id, $size, $permalink, $icon, $text);
Filter
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;
}
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Look at the function in wp-includes/post-template.php. There you see what information you can get:
apply_filters(
'wp_get_attachment_link'
, "<a href='$url' title='$post_title'>$link_text</a>"
, $id
, $size
, $permalink
, $icon
, $text
);
Note that you cannot access the $link_text and the $_post object as a standalone variables. Bug? Bug!
In your filter you cannot change the order of the arguments, just the number.
So add_filter( 'wp_get_attachment_link', 'modify_attachment_link', 10, 2 ); will give you the link markup and $id. The highest number of available arguments is 6.
The return value of your function will replace the first argument.
An (untested) example for changing the link 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 );
Further reading:
- How can I add a URL field to the attachments window?
- attachment url rewrite
- Changing attachment urls?
Method 2
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;
}
See the source.
The last two arguments are priority and number of args. If you don’t specify the number of args of anything above one (IIRC) it will throw an error.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0