WordPress.org

Ready to get started?Download WordPress

Forums

Custom post excerpt in sidebar (9 posts)

  1. Calicosun
    Member
    Posted 3 years ago #

    Hi there

    I am trying to figure out how to put a random custom post title, excerpt and read more in my sidebar to display random testimonial excerpts.

    I have set up my custom post which is called testimonials and am using some code that I have used in the past for ordinary posts and it works fine but it breaks my pages ie. the pages stop displaying. The code I have been trying to use is:

    <?php
                        $posts = get_posts('post_type=testimonials&post_status=publish&numberposts=2&orderby=rand');
                        foreach ($posts as $post) : start_wp(); ?>
                           <h3><?php the_title(); ?></h3>
                        <?php the_excerpt('<div class=".readmore">'); ?><a href="/testimonials">read more...</a>
                        <?php endforeach; ?>

    I would really appreciate it if someone could take a look and tell me where I am going wrong.

    Thanks so much!

  2. alchymyth
    Forum Moderator
    Posted 3 years ago #

    any error messages?

    start_wp(); is deprecated;

    try and use setup_postdata($post); instead

    btw:
    the_excerpt(); does not have any parameters - so the 'readmore' will not work (unless set up in functions.php - see http://codex.wordpress.org/Function_Reference/the_excerpt#Make_the_.22read_more.22_link_to_the_post )

    btw2:
    if you are using class, there is no leading . before the class name in html:
    this class=".readmore" should be class="readmore"

    in the css file, it would be .readmore

  3. Calicosun
    Member
    Posted 3 years ago #

    Thanks for looking at this.

    1. No error message with start_wp (); but the actual page content doesn't display. I did try setup_postdata($post); when attempting to problem solve and when I used that the page content on every page displays the testimonial details ie. home page should have home page info (well full in text at the moment!) but whatever random testimonial was displayed in sidebar - the content would display in homepage... same when I go to about page.

    This problem also occurs with the Recent news if the Testimonials are not displayed in the left sidebar. The code I used to display the recent news is:

    <?php $posts = get_posts("category=6" . $cat->cat_ID . "&numberposts=4");
                if( $posts ) : ?>
                <?php foreach( $posts as $post ) : setup_postdata( $post ); ?>
                <li><a href="<?php // bump out what we need courtesy of template tags
                the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
    
                <?php endforeach; ?>
                    <?php endif; ?>

    Here is the url to the development site so you can see for yourself: http://tbminsurance.slicetest.co.nz/. (unless I have managed to fix by the time you look at it). If I remove the testimonial block the recent news article title shows in whatever page I am on. If the testimonial block is there then the testimonial content displays.

    It is strange as this problem does not occur when I put either of the code in the right menu, just the left. I can't think where else the problem is coming from.

    2. The excerpt is set up in functions:

    <?php
    // Sets the post excerpt length to 40 characters.
    
    add_filter( 'excerpt_length', 'texcerpt_length' );
    function excerpt_length( $length ) {
        return 40;
    }
    
    add_filter('excerpt_length', 'new_excerpt_length');
    function excerpt_ellipse($text) {
       return str_replace('[...]', ' <a href="'.get_permalink().'"> more...</a>', $text); }
    
       add_filter('the_excerpt', 'excerpt_ellipse');
    function new_excerpt_more($more) {
    $ct=get_the_category($post->ID); $ct = $ct[0]->cat_ID;
    return '<a href="'. get_category_link($ct) . '"> more ...</a>';
    }
    
    add_filter( 'excerpt_more', 'auto_excerpt_more' );
    ?>

    3. readmore: That was my mistake - eyeballs tired from trying to sort out the above problem so overlooked this. Thanks for pointing it out!

    Do you have any idea why the sidebar content is being displayed in all the pages?

    Thanks so much. I have spent hours trying to figure this one out so any help would be very much appreciated.

  4. Calicosun
    Member
    Posted 3 years ago #

    I have just tested the recent posts code on another test site (has the same problems as the testimonials but is easier to set up quickly on another site) and the same problem occurs where the first recent post title is displayed on pages instead of the page content.

    Here is the url: http://stitchworks.slicetest.co.nz/about/

    If you go down to the bottom of the left sidebar I have plonked the following code:

    h2>Test</h2>
    
    <ul>
    
                <?php $posts = get_posts("category=7" . $cat->cat_ID . "&numberposts=4");
                if( $posts ) : ?>
                <?php foreach( $posts as $post ) : setup_postdata( $post ); ?>
                <li><a href="<?php // bump out what we need courtesy of template tags
                the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
    
                <?php endforeach; ?>
                    <?php endif; ?>
                </ul>

    On the about and contact pages the News 04 title is displayed instead of the correct content.

    - Doesn't happen on the homepage as the content there is called from template files.
    - Doesn't happen on the news page as that is the page that displays the news.
    - Doesn't happen in the gallery. Not sure why. The gallery is a separate template page called gallery.php.

    It seems to have something to do with the loop as the home page on the tbm site is a template page as well and still has the problem.

    Am I not closing the sidebar code properly. I get a bit confused with what should go at the end of this type of code ie.

    <?php endforeach; ?>
    <?php endif; ?>

    or reset query?

  5. alchymyth
    Forum Moderator
    Posted 3 years ago #

    all of it:

    <?php endforeach; ?>
    <?php endif; ?>

    and reset query; i.e.
    <?php wp_reset_query(); ?>

    (try this after all of your get_posts loops)

    you are using the 'variable' $post in your get_posts() code; this is the same as the global 'variable' used internally by wordpress in the loop.
    this disturbs the original query, and can lead to problems.

  6. Calicosun
    Member
    Posted 3 years ago #

    Hello

    Will test it now. Just to clarify. I should put the following after the code in the side bar AND the loop on each page:

    <?php endforeach; ?>
    <?php endif; ?>
    <?php wp_reset_query(); ?>

    Or just on the pages, not the sidebar code?

    Is there a more appropriate variable that I should be using or is $post the only option?

    Thank you so so much for your help.

  7. Calicosun
    Member
    Posted 3 years ago #

    I did the following in the sidebar code for testimonials:

    <?php
                        $posts = get_posts('post_type=testimonials&post_status=publish&numberposts=2&orderby=rand');
                        foreach ($posts as $post) : setup_postdata($post); ?>
                           <h3><?php the_title(); ?></h3>
                        <?php the_excerpt('<div class="readmore">'); ?><a href="/testimonials">read more...</a> 
    
                <?php endforeach; ?>
                    <?php endif;
    
                //Reset Query
                wp_reset_query();?>

    but the page broke - what did I do wrong? :-(

  8. Calicosun
    Member
    Posted 3 years ago #

    Hi

    I just tried a different way of doing it as follows:

    <?php
    //get 5 recent posts for categories 14 and 9
        $args=array(
          'post_type' =>'testimonials',
          'showposts'=>1,
          'orderby'=>'rand',
          'caller_get_posts'=>1
        );
        $my_query = new WP_Query($args);
        if( $my_query->have_posts() ) {
          /* echo '5 recent Posts'; */
          while ($my_query->have_posts()) : $my_query->the_post(); ?>
            <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
            <?php the_excerpt('<div class="readmore">'); ?><a href="/testimonials">read more...</a>
           <?php
          endwhile;
        } //if ($my_query)
      wp_reset_query();  // Restore global post data stomped by the_post().
    ?>

    Is this the more appropriate way to approach something like this?

    Just out of interest, what is the correct technical way to refer to each approach ie. are they both queries or is one referred to as an 'array query' and if so what is the other type of code called?

    Thanks.

  9. alchymyth
    Forum Moderator
    Posted 3 years ago #

    Is this the more appropriate way to approach something like this?

    whatever works is ok;
    imho, just a different way; both ways are correct;

    when you page broke, the reason was that you did not have an 'if( $posts ) :' in that particular piece of code; therefore the 'endif' broke the code.

    i would say, both approaches are loops - one is a 'foreach' loop, the other a 'while' loop.
    and both can be talked about as 'queries'.

Topic Closed

This topic has been closed to new replies.

About this Topic