0
votes

I am using a Wordpress plugin to add a list of categories and 4 posts to the home page of a website.

What I am trying to do is add the title and a "More" link to each category but I can't quite get it right.

Below is the plugin code, with my new section highlighted in comments near the bottom. At the minute, it is only showing the title for the first 2 categories, then repeating the same titles and their links again, even though the category is different.

<?php
    global $post;

    // default attributes for shortcode
    $shortcode_default_attrs = array(
         'author' => '',
         'show' => 5,
         'excerpt' => 'false',
         'thumbnail' => 'false',
         'post_type' => 'post',
         'category' => '',
         'tag' => ''
    );

    // overrides default attributes set above and separates into individual varaibles.
    if(!empty($inserted_attrs)) {
        extract(shortcode_atts( $shortcode_default_attrs, $inserted_attrs ));
    }

    if(!empty($author)) {

        // checks if there are multiple authors set.
        $author_has_comma = strpos($author, ',');
        if($author_has_comma === false) {

            // gets the author data for a single author.
            $author_data = get_user_by( 'login', $author );

            if(!empty( $author_data)) {
                $post_args = array(
                    'author' => $author_data->ID,
                    'posts_per_page' => $show,
                    'post_type' => $post_type,
                    'category_name' => $category,
                    'tag' => $tag,
                );
            }

        } else {

            // gets the author data for multiple authors.
            $authors = explode(',', $author);
            $author_data = '';
            foreach($authors as $author_login) {
                $author_user = get_user_by('login', $author_login);
                $author_data .= $author_user->ID . ',';
            }

            $post_args = array(
                'author' => $author_data,
                'posts_per_page' => $show,
                'post_type' => $post_type,
                'category_name' => $category,
                'tag' => $tag,
            );
        }
    } elseif (empty($author)) {

        $post_args = array(
            'author' => $author,
            'posts_per_page' => $show,
            'post_type' => $post_type,
            'category_name' => $category,
            'tag' => $tag,
        );
    }

    // gets posts form database
    $post_query = new WP_Query( $post_args );

    // displays posts 
    if($post_query) {
        $data = '';
        $data .= '<div class="recent_post_by_cc"><ul>';
        while ($post_query->have_posts()) : $post_query->the_post();
            $data .= '<li>';



            // displays a link to the post, using the post title
            $data .= '<a href="' . get_permalink() . '" title="' . get_the_title() . '">';
            $data .= get_the_title();
            $data .= '</a>';

            // display a linked featured image if post has
            if($thumbnail == 'true') { 
                $data .= '<div class="cc_left">';
                if(has_post_thumbnail()) { 
                    $data .= '<a href="' . get_permalink() . '" title="' . get_the_title() . '">';
                    $data .= get_the_post_thumbnail(get_the_id(), 'thumbnail');
                    $data .= '</a>';
                }
                $data .= '</div>';
            }



            // displays the post excerpt if "excerpt" has been set to true
            if($excerpt == 'true') {
                $data .= '<p>' . get_the_excerpt() . '</p>';
            }

            $data .= '<div style="clear: both;"></div></li>';
        endwhile;

        // =================================================
        // Start of my added section
        // =================================================

            $data .= '<div class="more-home-link">';
        $category = get_the_category(); 
        $data .= '<a href="'.get_category_link($category[0]->cat_ID).'">More</a>';

        $data .= '</div>';


            $data .= '<div class="home-title">';
            $categories = get_the_category();
         echo '<h2><a href="'.$cat_link.'">'.$categories[0]->cat_name.'</a></h2>' ;
        $data .= '</div>';

        // =================================================
        // End of my added section
        // =================================================

        $data .='</div>';
        $data .= '</ul>';


    }

    wp_reset_postdata();

    echo $data;
2
Please, explain a more detailed what you want to achieve. You want to add the_title and more_links but to what: to one category or to all categories? Where you want to print category links - after each post (because different posts can be attached to different categories), or after all posts are printed. Because right now you get categories from last printed post, and print only first of them $categories[0] - pgk
I'd like to add the category title and more link for each category. I want to show category title, 4 latest posts with the post title and featured image and then show a more link which takes you to the category page. I'd like to do this for each category. - JohnThomas

2 Answers

1
votes

I suppose that you ran this shortcode from this plugin for each category and pass category_slug to the shortcode, to be able to get the last 4 posts, because of this line from

$post_args: 'category_name' => $category,

If so, then you already have current category slug here and you can grab category data with

get_category_by_slug( $category ); 

Then you can do this

<?php
    $curr_cat = get_category_by_slug( $category );

    $data .= '<div class="more-home-link">';
    $data .=    '<a href="'.get_category_link( $curr_cat->cat_ID ).'">More</a>';
    $data .= '</div>';

    $data .= '<div class="home-title">';
    $data .= '<h2><a href="'.get_category_link( $curr_cat->cat_ID ).'">'.$curr_cat->cat_name.'</a></h2>';
    $data .= '</div>';
?>

If you use get_the_category(), and just grab the first result from the array, you can't be sure that you are getting the proper category, because one post can have multiple categories, and you just pick first of them, without knowing its order.

For this reason only 2 categories are shown in your result.

Also, it is not a good practice to change plugins code, because this eliminates the possibility to update this plugin later. So maybe the better way to do this is to create your own function which echo or return shortcode with category links, and then call it after each shortcode from the plugin. Something like:

[shortcode category1]
your_function('category1');

[shortcode category2]
your_function('category2');
0
votes
$cat_link

seems to be uninitialized

also:

$category[0]->cat_name

will only show the name of the first element ( [0] ). Are the posts in multiple categories?

Probably you need something like:

foreach (get_categories() as $category) {
    echo '<div>..... {$category->cat_name} ....</div>';
}