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;
$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>';
}
I suppose you ran this shortcode from this plugin for each category and pass category_slug
to 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
$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 this get_the_category()
, and grab first result from array, you can not be shore that you get 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');