logo

$80
help with custom php for thematic framework theme

I'm working on a thematic child theme and need some help with some custom coding in the functions.php file.

1. for submitted posts, replace the post title on index, category, archive and single post pages with the first linked text from the post area.

2. within the post area, display a linked screenshot of the webpage linked from the first linked text in the post area by tying into the Wordpress core as described here: http://www.binarymoon.co.uk/projects/bm-shots-automated-screenshots-website/

so if there's a link like this <a href="http://www.bbc.co.uk">BBC website is here</a> then the post title becomes "BBC website is here" and the post contains a screenshot image of the website www.bbc.co.uk.

Ideally I'd like to achieve all this using hooks / filters... anyone able to help?

Dave Smith | 02/21/10 at 2:41pm | Edit


(3) Possible Answers Submitted...

  • avatar
    Last edited:
    02/21/10
    3:51pm
    Erez S says:

    you should use the filter the_title,and in order to find the first link you can use the function get_the_content and to get the link with regex webmasterworld.com/php/3698684.htm and for question use regex again and get the img url and simply add html tags of link and image to the content with the filter the_content. enjoy

    • 02/21/10 3:58pm

      Erez S says:

      more info about regex stackoverflow.com/questions/1399768/php-regex-or-alt-method-for-anchor-tags and the function to get the screenshot img is m_mshot ( $url , $width ); and simply wrap it with anchor tag

  • avatar
    Last edited:
    02/21/10
    3:52pm
    Michael Fields says:

    Here's the solution that I came up with. all code goes in functions.php of your child theme.

    add_filter( 'thematic_post', 'mfields_append_image_to_thematic_content' );
    if( !function_exists( 'mfields_append_image_to_thematic_content' ) ) {
    function mfields_append_image_to_thematic_content( $c ) {
    $first_link = array();
    if( function_exists( 'bm_mshot' ) )
    $first_link = mfields_get_first_link_in_post_content( $c );
    if( isset( $first_link['url'] ) )
    $c = do_shortcode( '[browsershot url="' . $first_link['url'] . '" width="' . 250 . '"]' );
    return $c;
    }
    }

    if( !function_exists( 'mfields_get_first_link_in_post_content' ) ) {
    function mfields_get_first_link_in_post_content( $content ) {
    $o = array();
    $has_link = preg_match( '#<a(.*)>(.*)</a>#', $content, $anchor );
    if( $has_link !== 0 && $has_link !== false ) {
    list( $tag, $attr, $text ) = $anchor;
    $o['anchor'] = $tag;
    $o['text'] = $tag;
    if( !empty( $attr ) ) {
    $has_href = preg_match( '#href="(.*)?"#', $attr, $href );
    if( $has_href !== 0 && $has_href !== false ) {
    list( $href_attr, $url ) = $href;
    $o['url'] = $url;
    }
    }
    }
    return $o;
    }
    }

    add_filter( 'thematic_postheader_posttitle', 'mfields_link_title' );
    if( !function_exists( 'mfields_link_title' ) ) {
    function mfields_link_title( $c ) {
    global $post;
    $first_link = mfields_get_first_link_in_post_content( $post->post_content );
    if( !empty( $first_link['anchor'] ) ) {
    if ( is_singular() )
    return '<h1 class="entry-title">' . $first_link['anchor'] . "</h1>\n";
    else
    return '<h2 class="entry-title">' . $first_link['anchor'] . "</h2>\n";
    }
    return $c;
    }
    }

    Previous versions of this answer: 02/21/10 at 3:52pm

    • 02/21/10 4:06pm

      Dave Smith says:

      Hey Michael,

      just put this into functions.php and whilst the title bit is working, the image is not.. the post is still just showing the linked text. See demo here: http://nutritionuk.net/

      do i need to have the bm shots plugin installed for your code to work... ideally i'd like the solution to work without the plugin..

      kind regards,

      Dave

    • 02/21/10 4:10pm

      Dave Smith says:

      ok just installed and activated the plugin and i see it's working... is it much more effort to get it to work independently of the plugin Michael?

      sorry if i wasn't clear at the outset.

  • avatar
    Last edited:
    02/21/10
    4:33pm
    Cristian Antohe says:

    Hi,

    This is a different solution then Michael's. For this you don't need to have the plugin activated and it searches for the first link differently.

    You can see it working here:
    http://www.cozmoslabs.com/projects/nomadic/



    // Search for first link function
    function search_first_link($content){
    $more = 1;
    $count = substr_count($content, '<a');
    $start = 0;
    for($i=1;$i<=$count;$i++) {
    $linkBeg = strpos($content, '<a', $start);
    $post = substr($content, $linkBeg);
    $linkEnd = strpos($post, '</a>');
    $postOutput = substr($post, 0, $linkEnd+4);
    $link[$i] = $postOutput;
    $start=$linkEnd+1;
    }
    $more = 0;
    if (!empty($link[1]))
    {
    return $link[1];
    } else { return false; }
    }

    function extract_url_from_link($link){
    $more = 1;
    $count = substr_count($link, 'http://');
    $start = 0;
    for($i=1;$i<=$count;$i++) {
    $urlBeg = strpos($link, 'http://', $start);
    $post = substr($link, $urlBeg);
    $urlEnd = strpos($post, '"');
    $postOutput = substr($post, 0, $urlEnd);
    $url[$i] = $postOutput;
    $start=$linkEnd+1;
    }
    $more = 0;
    if (!empty($url[1]))
    {
    return $url[1];
    } else { return false; }
    }

    // Create the page title
    function custom_title($the_title){
    global $post;
    $content = get_the_content();

    $post_link = search_first_link($content);
    if ($post_link)
    {
    return '<h2 class="entry-title">' . $post_link . '</h2>';
    } else { return $the_title; }


    }
    add_filter('thematic_postheader_posttitle' ,'custom_title');

    // Add the automatic image - With help from Ben Gillbanks - http://www.binarymoon.co.uk/
    function bm_mshot ($url = '', $width = 250) {
    if ($url != '') {
    return 'http://s.wordpress.com/mshots/v1/' . urlencode(clean_url($url)) . '?w=' . $width;
    } else {
    return '';
    }
    }

    function add_image_url($content){

    $post_link = search_first_link($content);
    $url = extract_url_from_link($post_link);
    $imageUrl = bm_mshot ($url, 250);

    if ($imageUrl == '') {
    return $content;
    } else {
    $image = '<img src="' . $imageUrl . '" alt="' . $url . '" width="' . $width . '" />';
    return '<div class="browsershot mshot"><a href="' . $url . '">' . $image . '</a></div>' . $content;
    }
    }

    add_filter('the_content', 'add_image_url');

    Previous versions of this answer: 02/21/10 at 4:11pm

    • 02/21/10 4:19pm

      Dave Smith says:

      code has broken the theme... have cut and pasted within the opening and closing php bits... is it me or you?

    • 02/21/10 4:22pm

      Cristian Antohe says:

      The code works on my development site. Try and delete the closing php tag ?>

      See if that works!

    • 02/21/10 4:23pm

      Cristian Antohe says:

      Also disable the plugin from Binary Moon. The bm_mshot function will be declared twice and that probably brakes your theme.

    • 02/21/10 4:24pm

      Dave Smith says:

      can you post a link to a completed functions.php file for me so i can just grab it please?

    • 02/21/10 4:27pm

      Cristian Antohe says:

      Check this out: http://www.cozmoslabs.com/projects/nomadic/wp-content/themes/nomadicmatt/functions.txt

      I've also changed the function name.

    • 02/21/10 4:28pm

      Dave Smith says:

      scrub that it's working. well done christian. nice work. for a $20 bonus, is there a way of removing the original linked text from within the post? So all I have is the linked title, the screenshot, and the remaining copy without the linked text?

    • 02/21/10 4:35pm

      Cristian Antohe says:

      I've updated the functions.txt link with the code that removes your url from the content!

      You can check it out here: http://www.cozmoslabs.com/projects/nomadic/ (the link isn't showing anymore.)

This question has expired.





Current status of this question: Completed