Wordpress shortcode issue - php

i have this code for shortcode
function custom_query_shortcode( $atts ) {
// EXAMPLE USAGE:
// [postcat name="Lorem"]
// Defaults
$atts = shortcode_atts(array(
'name' => ''
), $atts, 'postcat');
// Reset and setup variables
$output = '';
$title = '';
$link = '';
$featImg = '';
// the loop
$argsSC = array(
'post_type' => 'post',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page'=> -1,
'category_name' => $atts['name']
);
$querySC = new WP_Query( $argsSC );
if ( $querySC->have_posts() ) {
$output .= '<div class="row" style="margin-top: 30px;">';
while ( $querySC->have_posts() ) {
$querySC->the_post();
$title = get_the_title(get_the_ID());
$link = get_permalink(get_the_ID());
$featImg = ( has_post_thumbnail() ? get_the_post_thumbnail_url(get_the_ID(), 'large') : get_template_directory_uri() . '/imgs/No_Image_Available.gif' );
$id = get_the_ID(get_the_ID());
$chartL = get_field( 'chart' );
$storyL = get_field( 'story' );
// output all findings - CUSTOMIZE TO YOUR LIKING
//$output .= "<div><img src='$featImg'><a href='$link'>$title</a></div>";
$output .= '<article id="post-'.$id.'" class="csseco-tssf-t col-12 col-md-6">';
$output .= ' <div class="standard-featured bg-img-el" style="background-image: url('.$featImg.')">';
$output .= ' <a class="standard-featured-link" href="'.$link.'"></a>';
$output .= ' <div class="cat-tssf">';
if ( !empty($chartL['url']) ) {
$output .= ' Charts';
}
if ( !empty($storyL['url']) ) {
$output .= ' The Story';
}
$output .= ' </div>';
$output .= ' <h3 class="ttl-tssf">';
$output .= ' <span class="dtable">';
$output .= ' <span class="dtable-cell">';
$output .= ' <a href="'.$link.'" rel="bookmark">';
$output .= $title;
$output .= ' </a>';
$output .= ' </span>';
$output .= ' </span>';
$output .= ' </h3>';
$output .= ' </div>';
$output .= '</article>';
}
$output .= '</div>';
} else {
$output .= "nothing found.";
}
return $output;
wp_reset_query();
wp_reset_postdata();
}
add_shortcode("postcat", "custom_query_shortcode");
In the backend, when i press "Add new category" to make a new category(duh!) does not work. The category its added but the page does not refresh. I'm pretty sure it's something with this code, but i really dont know what... if i dont include this file in functions.php categories and tags works perfectly...
Please help and thanks in advance!

Can't comment, so I'll post it as an answer.
Please look at:
return $output;
wp_reset_query();
wp_reset_postdata();
The code after the return will not be executed I believe. So change it to:
wp_reset_query();
wp_reset_postdata();
return $output;
Maybe this will solve your issue?

Related

How to format $output the right way?

I do not know php, I am googling for codes, and I came up on something which I need to do in Wordpress site.
This code shows nothing, but neither brokes site, I think its not correct so can someone help me.
here is the code:
$output.= '<div class="column1">'
$categories = get_the_category();
$separator = ' ';
$output = '';
if($categories) {
$output .= '<div class="above-entry-meta"><span class="cat-links">';
foreach($categories as $category) {
$output .= ''.$category->cat_name.''.$separator;
}
}
$output .='</span></div>';
$output.= '</div> <!-- end column1 -->';
I want to output current post categories via shortcode, and this is one part of the same.
I need just help on how it goes from this example, I ll be able to continue codding by following example.
try this code
$output = '';
$output .= '<div class="column1">';
$args = array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 5 );
$categories = get_the_category($args);
$separator = ' ';
if($categories) {
$output .= '<div class="above-entry-meta"><span class="cat-links">';
foreach($categories as $category) {
$output .= ''.$category->cat_name.''.$separator;
}
}
$output .='</span></div>';
$output.= '</div> <!-- end column1 -->';

WP Query pagination on shortcode

I am creating a shortcode to display the most recent posts in the homepage, however I cannot get the pagination working.
When you click on 'older posts' the page refreshes but the same 2 original posts are displayed.
if ( ! function_exists('vpsa_posts_shortcode') ) {
function vpsa_posts_shortcode( $atts ){
$atts = shortcode_atts( array(
'per_page' => 2,
'order' => 'DESC',
'orderby' => 'date'
), $atts );
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => $atts["per_page"],
'order' => $atts["order"],
'orderby' => $atts["orderby"],
'paged' => $paged
);
$query = new WP_Query($args);
if($query->have_posts()) : $output;
while ($query->have_posts()) : $query->the_post();
$output .= '<article id="post-' . get_the_ID() . '" class="' . implode(' ', get_post_class()) . '">';
$output .= '<h4 class="post-title"><span>' . the_title('','',false) . '</span></h4>';
$output .= '<div class="row">';
$output .= '<div class="col-md-3">';
$output .= '<a href="' . get_permalink() . '" title="' . the_title('','',false) . '">';
if ( has_post_thumbnail() ) {
$output .= get_the_post_thumbnail( get_the_id(), 'featured', array('class' => 'img-responsive aligncenter'));
} else {
$output .= '<img class="img-responsive aligncenter" src="' . get_template_directory_uri() . '/images/not-available.png" alt="Not Available" height="150" width="200" />';
}
$output .= '</a>';
$output .= '</div>';
$output .= '<div class="col-md-9">';
$output .= get_the_excerpt();
$output .= '<span class="post-permalink">Read More</span>';
$output .= '</div>';
$output .= '</div>';
$output .= '<div class="post-info">';
$output .= '<ul>';
$output .= '<li>Posted: ' . get_the_time("F j, Y") . '</li>';
$output .= '<li>By: ' . get_the_author() . '</li>';
$output .= '<li>Categories: ' . get_the_category_list(", ") . '</li>';
$output .= '</ul>';
$output .= '</div>';
$output .= '</article>';
endwhile;
$output .= '<div class="post-nav">';
$output .= '<div class="prev-page">' . get_previous_posts_link( "« Newer Entries" ) . '</div>';
$output .= '<div class="next-page">' . get_next_posts_link( "Older Entries »", 3 ) . '</div>';
$output .= '</div>';
else:
$output .= '<p>Sorry, there are no posts to display</p>';
endif;
wp_reset_postdata();
return $output;
}
}
add_shortcode('vpsa_posts', 'vpsa_posts_shortcode');
You need to call paginate function.Try following code:
if ( ! function_exists('vpsa_posts_shortcode') ) {
function vpsa_posts_shortcode( $atts ){
$atts = shortcode_atts( array(
'per_page' => 2,
'order' => 'DESC',
'orderby' => 'date'
), $atts );
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => $atts["per_page"],
'order' => $atts["order"],
'orderby' => $atts["orderby"],
'paged' => $paged
);
$query = new WP_Query($args);
if($query->have_posts()) : $output;
while ($query->have_posts()) : $query->the_post();
$output .= '<article id="post-' . get_the_ID() . '" class="' . implode(' ', get_post_class()) . '">';
$output .= '<h4 class="post-title"><span>' . the_title('','',false) . '</span></h4>';
$output .= '<div class="row">';
$output .= '<div class="col-md-3">';
$output .= '<a href="' . get_permalink() . '" title="' . the_title('','',false) . '">';
if ( has_post_thumbnail() ) {
$output .= get_the_post_thumbnail( get_the_id(), 'featured', array('class' => 'img-responsive aligncenter'));
} else {
$output .= '<img class="img-responsive aligncenter" src="' . get_template_directory_uri() . '/images/not-available.png" alt="Not Available" height="150" width="200" />';
}
$output .= '</a>';
$output .= '</div>';
$output .= '<div class="col-md-9">';
$output .= get_the_excerpt();
$output .= '<span class="post-permalink">Read More</span>';
$output .= '</div>';
$output .= '</div>';
$output .= '<div class="post-info">';
$output .= '<ul>';
$output .= '<li>Posted: ' . get_the_time("F j, Y") . '</li>';
$output .= '<li>By: ' . get_the_author() . '</li>';
$output .= '<li>Categories: ' . get_the_category_list(", ") . '</li>';
$output .= '</ul>';
$output .= '</div>';
$output .= '</article>';
endwhile;global $wp_query;
$args_pagi = array(
'base' => add_query_arg( 'paged', '%#%' ),
'total' => $query->max_num_pages,
'current' => $paged
);
$output .= '<div class="post-nav">';
$output .= paginate_links( $args_pagi);
// $output .= '<div class="next-page">' . get_next_posts_link( "Older Entries »", 3 ) . '</div>';
$output .= '</div>';
else:
$output .= '<p>Sorry, there are no posts to display</p>';
endif;
wp_reset_postdata();
return $output;
}
}
add_shortcode('vpsa_posts', 'vpsa_posts_shortcode');
WP_Query with pagination inside a shortcode
Here I will show you how to create a [shortcode] containing a custom new WP_Query with pagination links.
To create a [shortcode] with a new WP_Query post loop with pagination links built in to turn any is_singular() page or single post into a custom archive based on the WP_Query arguments you set. Lets call it [wp_query_pagination_inside_shortcode], so we add with the following add_shortcode() in functions.php.
Or in my case I create separate /functions/ folder for files to stay organized with the appropriates names and have a require_once include file structure.
root/functions.php ->
require_once 'functions/shortcode-wp-query-pagination-inside-shortcode.php';
root/functions/shortcode-wp-query-pagination-inside-shortcode.php->
add_shortcode('wp_query_pagination_inside_shortcode', 'my_shortcode_function_tag');
if (!function_exists('my_shortcode_function_tag')) {
function my_shortcode_function_tag($atts)
{
ob_start(); // Turn output buffering on, helps with complicated template and theme structures
// Note: https://developer.wordpress.org/reference/functions/get_query_var/#used-by
// Custom query_vars translates to Getting an "archive" on any current page that contains a query with corresponding pagination number in the url
// example.com/page-shortcodes-on/page/2/ ...etc see below how to manipulate this
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$atts = shortcode_atts(
array(
'post_type' => 'post',
// Set attributes here you want in your shortcode
// like [shortcode post_types="post"]
),
$atts
);
// set up the default args you wont change and the ones you will by accessing the value of $atts passed into the shortcode function from your WYSIWYG content editor
$args = array(
'posts_per_page' => 3,
'paged' => $paged, // Important to receive page data
'post_type' => $atts['post_type'], // This is how you get the values of your shortcode attributes passed in
'orderby' => 'date',
'order' => 'DESC',
);
$the_query = new WP_Query($args);
// Da loop
// match your themes loop structure this below is just boiler plate stuff ignore or use your choice its not important how you create the post loop, just do it
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post();
get_template_part('template-parts/loop');
} //end while
} // endif
$big = 999999999; // need an unlikely integer for how many pages are possible
// I've tested example.com/page-shortcodes-on/page/999999999999999999/ and the custom query_var still works
echo paginate_links(
array(
'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))), // referrence the url
'format' => '?paged=%#%', // used for replacing the page number
'current' => max(1, get_query_var('paged')), // grabs the page data
'total' => $the_query->max_num_pages //$the_query is your custom query
)
);
return ob_get_clean(); // Silently discard the buffer contents
wp_reset_query(); // Lets go back to the main_query() after returning our buffered content
}
}
In a WYSIWYG Content editor in pages or posts content editor
[wp_query_pagination_inside_shortcode post_type="posts"]
URL structure for this query_var 'paged'
example.com/page-shortcode-is-on/page/2/
You will need to stylize the pagination links a bit to be acceptable but this should give you a highly useful tool to build custom WP_Query loops with multiple different post_types from anywhere in your site through your WYSIWYG editor. Add more attributes to really make this thing valuable.
// Ignore below, these are just possible search queries for this issue
WP_Query pagination inside a shortcode / add_shortcode with pagination / shortcode with custom attributes / Paginated custom post type wp_query shortcode / custom post type wp_query archive posts per page / page / pagination wont work

Catchable fatal error inside WordPress function

function magazine_vertical($atts){
extract(shortcode_atts(array(
'slug' => '',
'title' => '',
'limit' => '5',
),$atts));
//The Query
query_posts('showposts=1&orderby=date&order=DESC&category_name='.$slug);
//The Loop
if ( have_posts() ) : while ( have_posts() ) : the_post();
$return .= '<div class="magazine-vertical">';
$return .= '<div class="magazine-vertical-title-category"><span class="magazine-vertical-title">'.$title.'</span><span class="magazine-vertical-category">More articles</span></div>';
$return .= '<div class="magazine-vertical-large">';
$return .= '<div class="magazine-vertical-large-1">';
$return .= '<div class="magazine-vertical-large-thumbnail">';
$return .= ''.get_the_post_thumbnail( $post_id, 'magazine-vertical').'';
$return .= '</div>';
$return .= '<div class="magazine-vertical-large-subtitle">';
$return .= ''.get_the_title().'';
$return .= '</div>';
$return .= '<div class="magazine-vertical-large-date">';
$return .= get_the_time('F j, Y');
$return .= '</div>';
$return .= '<div class="magazine-vertical-large-excerpt">';
$return .= get_the_excerpt();
$return .= '</div>';
$return .= '</div>';
$return .= '</div>';
endwhile;
endif;
//Reset Query
wp_reset_query();
return $return;
}
add_shortcode('magazine_vertical', 'magazine_vertical');
Function above produces: Catchable fatal error: Object of class stdClass could not be converted
Problem is in this part:
$return .= '<div class="magazine-vertical-title-category"><span class="magazine-
vertical-title">'.$title.'</span>
<span class="magazine-vertical-category">More articles</span></div>';
Witout this code works (I need this part with "More articles):
More articles
[magazine_vertical slug=my-category] is shortcode which I am using inside page.
I get it all work ok, except this part where I have to get category link from slug atts.
In Wordpress, $output: Constant OBJECT, ARRAY_A, or ARRAY_N
function get_term_by($field, $value, $taxonomy, $output = OBJECT, $filter = 'raw') { }
Default output is object, you can't able to convert the object into string.
You can try get_term_link( $term, $taxonomy ); Ref: http://codex.wordpress.org/Function_Reference/get_term_link

Wordpress outputting tags in a loop

I'm trying to output all the tags associated with a custom post type via shortcode and it only appears to be bringing in 1 tag inside the $output.
outside the $output the code is fine.
code is:
function display_stores() {
$args = array( 'post_type' => 'stores', 'posts_per_page' => 5 );
$success = new WP_Query( $args );
$output = '';
while( $success->have_posts() ) {
$success->the_post();
$tags = get_the_tags($post_ID);
foreach($tags as $tag) {
return '<li>'. $tag->name . '</li>' ;
}
$output .= sprintf( "<div class='story-content left'>" );
$output .= sprintf( "<h2>%s</h2>", get_the_title() );
$output .= sprintf( '%s</div>', get_the_content() );
$output .= sprintf( "Button");
$output .= sprintf( "<div class='story-tags right'>" );
$output .= sprintf( "<h4>Areas</h4><ul class='ul-arrows'>" );
$output .= sprintf( $tags );
$output .= sprintf( "</ul></div><hr>" );
}
wp_reset_query();
return $output;
}
add_shortcode( 'display_stores', 'display_stores' );
foreach($tags as $tag) {
return '<li>'. $tag->name . '</li>' ;
}
The first time this is ran it will exit the function and return the li. I imagine you meant to add it to output.
$tagHTML = '';
foreach($tags as $tag) {
$tagHTML .= '<li>'. $tag->name . '</li>' ;
}
//Later
$output .= $tagHTML;

PHP - adding function to string

I'm relatively new to PHP and don't even really know how to ask the question for which i need help with, so please excuse my lack of technical knowledge - or referring to terms correctly for that matter.
I cannot figure out a way to add the "if(function_exists("the_ratings"))" code below to a string as in the PHP i have below. I know that the way it is below is not correct, but i've placed it there to show how and where i need it to display - help is greatly appreciated.
function latestreleases() {
$args = array( 'posts_per_page' => 30, 'cat' => '-1, -2' );
$last_5_posts_query = new WP_Query( $args );
while($last_5_posts_query->have_posts()) :
$last_5_posts_query->the_post();
$link = get_permalink();
$title = get_the_title();
$description = excerpt(16);
$details = 'Watch ';
$readmore = 'Read more...';
$content .= '<div class="all-latest-movies">';
$content .= '<h3>'.$title.'</h3>';
$content .= '<div class="thumbnail"><a href=" '.$link. ' ">'
. get_the_post_thumbnail( null, "home-movie-thumbnail")
. '</a></div>';
$content .= '<div class="description">' .$description. ' <a href= '.$link.' >' .$readmore. '</div>';
$content .= '<div class="view-listing"><a href= '.$link.' target="_blank" >' .$details. $title. '</a></div>';
$content .= '<div class="ratings">' if(function_exists("the_ratings")) { the_ratings(); } '</div>';
$content .= '</div><!-- .fetured-movies -->';
endwhile;
return $content;
}
add_shortcode('LatestReleases', 'latestreleases' );
Use a ternary operator:
$content .= '<div class="ratings">'. ( function_exists("the_ratings") ? the_ratings() : '' ) .'</div>';
If you want to do it inline you can use the ternary operator
$content .= '<div class="ratings">'.(function_exists("the_ratings")?the_ratings():'').'</div>';
If you want to use the if syntax
$content .= '<div class="ratings">';
if(function_exists("the_ratings")){
$content.=the_ratings();
}
$content.='</div>';

Categories