Joy
(@joyously)
So you are trying to call
get_template_part( 'template-parts/content', 'card-col-8');
get_template_part( 'template-parts/content', 'card-col-3');
because you have files named template-parts/content-card-col-8.php and template-parts/content-card-col-3.php ?
Does the card-col-x relate to how many columns the posts are in? How can you have the first post use 8 and the second post use 3 columns? Or am I assuming something wrong?
Regardless of what the templates do, how is code supposed to decide which template part to use? Using a loop counter alone doesn’t work, as you’ve already discovered.
If the idea is an odd/even thing for each post, you can use the modulo operator % to get the remainder of integer division. $i % 2 will always equal 1 or 0 no matter how high $i goes.
BTW, using set_query_var() within the loop doesn’t do anything because the query has already been run. Set query vars in a callback for “pre_get_posts” action.
Joy
(@joyously)
set_query_var doesn’t need to be in the loop, but it is used to pass parameters to the template file (all query vars are extracted in load_template).
-
This reply was modified 7 years ago by
Joy. Reason: misspoke
First of all thanks for the help. yes, @joy I have files with these names. My site is a news portal, where each card is news. On the home page, each card will assume a number of columns. for example:
news 1: - 8 columns
news 2: - 2 columns
news 3: - 2 columns
This columns is reference of bootstrap.
This is the client that selects. So I wanted the latest news to have a different card template. @bcworkz, I did not understand the use of pre_get_posts. Could you explain me, please?
It seems “pre_get_posts” may not be germane. It depends on what you are trying to accomplish with set_query_var(). It is germane if you are trying to alter a query. It is not if you are merely using the $wp_query global to pass values elsewhere. While there is nothing technically wrong with using it to pass values, I don’t think it’s a good practice because the intent of your code is not clear. A stylistic objection more than anything.
I’ll explain pre_get_posts anyway, it’s worth knowing about even if it’s not germane here. It is one of many action hooks in WP. As the name implies, pre_get_posts action calls any added callbacks before the WP_Query object runs its SQL query to get posts. This action passes the WP_Query object by reference so your callback can get and set various query vars that influence the query that is about to be run.
Through pre_get_posts, you could for example limit the home page blog listing to only posts in a particular category and have them ordered alphabetically by title. Through this action you can alter, add, or remove any argument you can pass when WP_Query class is instantiated. It’s often a better option over creating a custom WP_Query object. If nothing else, pagination template tags work much better with pre_get_posts. For more, see https://codex.ww.wp.xz.cn/Plugin_API/Action_Reference/pre_get_posts
Joy
(@joyously)
Using set_query_var is the way you pass info to template files, but you shouldn’t use variable names that can be confused with WP variables. They should have the theme prefix.
I didn’t try your code, but it seems overly complicated in the array of arrays structure, and that part of the code is missing. There should be no problem with passing a variable name to get_template_part. My theme does this just fine.
I thought that the name looked like a class, and you could just pass that name into a generic template-part using set_query_var, or just pass the loop counter in and have the template figure out which one to use.
People, thank you for the help. @joy using your logic I made it work as I needed it. Instead of passing set_query_var I just passed the get_template_var and it worked as I needed it.
The loop made the process of each pass pick up a different model, where the path was in the array.
<?php if( $the_query->have_posts() ){ ?>
<?php
$i = 0;
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part( 'template-parts/content', $cards[$i]['model_card'] );
$i++;
?>
<?php endwhile;
} else { ?>
<div class="col-12">
nothin result
</div>
<?php }?>
@bcworkz Thanks for the explanation, I’ll probably use this function in the future.