I've been searching all morning for answers to no avail. I'm building a one page WordPress template. I have a home page which uses a one page template called one-page.php that is brining in all the other pages. Heres the php from that template:
<?php
$args = array(
'post_type' => 'page',
'order' => 'ASC'
);
$the_query = new WP_Query( $args );
?>
<?php if ( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php get_template_part( 'content', 'page' ); ?>
<?php endwhile; endif; ?>
This code works great. All the sections can use the content-page.php template part, excluding the portfolio section which I would like to use another template part that brings all the portfolio custom post types.
I've tried to add conditional if statements to both the one-page.php and the content-page.php, like this:
<?php if ( is_page( 'portfolio' ) ) : ?>
//My portfolio custom post type loop is here
<? endif; ?>
But that didn't work either - I think that is because the is_page() function will be checking the current page being displayed which is the Home page. Rather than figuring out what page the query is currently dealing with - but I'm not sure.
Can anyone help me understand how I would go about conditionally loading the portfolio section into a separate template part?
You can achieve this checking page slug, which you can get in the loop. If it is "portfolio" (or whatever you saved), load content-portfolio.php, otherwise content-page.php. Something like this:
if (have_posts()) : while ($the_query->have_posts()) : $the_query->the_post();
if ("portfolio" === $post->post_name) {
get_template_part('content', 'portfolio');
} else {
get_template_part('content', 'page');
}
endwhile; endif;
Set condition in file
<?php
if (have_posts()) : while ($the_query->have_posts()) : $the_query->the_post();
if (is_page('portfolio')) {
get_template_part('content', 'portfolio');
} else {
get_template_part('content', 'page');
}
endwhile; endif;
?>
create a template file named content-portfolio.php which is copy of content-page.php and put the below code in it. if it show 'call' it means your template is working.
portfolio.php
<?php
echo "portfolio.php";
die('Call');
?>
Related
I am building a one page WordPress template. I have created a simple loop that pulls all the pages and displays each one in succession on the same page. It displays the content for each page but dose not apply the template that has been attached to the page.
Here is the loop...
$args = array(
'post_type' => 'page',
'order' => 'ASC'
);
$the_query = new WP_Query( $args );
?>
<?php if ( have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<?php the_content(); ?>
<?php endwhile; endif; ?>
When you use the_content, the function will only return the value for the filed post_content within the table. So the code is working as it is expected.
Try the following
if ( have_posts() ){
while ( $the_query->have_posts() ) {
$the_query->the_post();
locate_template( get_template_slug( $post->ID ) )
}
}
This code uses the function locate_template to find the template file, and get_template_slug to get the name of the template associated with each page.
Let me know if this helps.
My problem is pagination which I am using in Wordpress. I used the plugin WP Pagenavi. I'm not really sure what is wrong with it.
I found the answer to my problem using this code :
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=15'.'&paged=' . $paged); ?>
But to my disappointment, when I reduced the posts_per_page to 5, I CAN get the pagination to work until page 2 but when I click page 3 and so on, WordPress can't find it. I used another solution from my research:
<?php
$limit = '5';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts('cat=4&showposts=' . $limit . '&paged=' . $paged);
$wp_query->is_archive = true; $wp_query->is_home = false;
?>
It still didn't help. I don't want to touch functions.php. I'm only editing category.php.
Check my block of code below :
<?php if (is_category('category1')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=1&posts_per_page=15'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category2')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=2&posts_per_page=15'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category3')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=3&posts_per_page=5'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else if (is_category('category4')) { ?>
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php query_posts('cat=4&posts_per_page=5'.'&paged=' . $paged); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<!-- SOME CODE TO POST THE POST -->
<?php endwhile; ?>
<?php wp_pagenavi() ?>
<?php endif; ?>
<?php } else { ?>
<!-- SOME CODE -->
<?php } ?>
Please note that category1 and category2 display 5 posts while the other 2 categories will display 15 posts. And these are all in the category.php.I don't want to use the # of posts set in the Settings > Reading.
If you think the if statement and putting also the cat ID is redundant, well, it does not get posts of that category name.
UPDATE
I used this code:
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?>
<?php $args = array ('post_type' => 'post','cat' => '4','posts_per_page' => '5','paged' => $paged);?>
<?php $my_query = new WP_Query ($args);?>
Again, it worked BUT it only shows two pages! I don't even know where the 3rd page is, supposedly there should be a 3rd page.
Your code has some serious issues
Never ever use query_posts, ever. It breaks the main query object on which so many plugins and functionalities rely, it also breaks pagination and fails silently, so it is really hard to debug pagination when it does fail. If you really really have to use a custom query, use WP_Query instead. You should take your time to read this post and all of the linked posts. It is really helpful as it tells you why you should not use query_posts and when should you use custom queries and when not
This point are coupled to the first one and the linked post. You must never change the main query to use a custom one on the homepage or any type of archive page. This always causes much more issues than what is actually solves. Always use pre_get_posts to alter the main query before it runs. This way, you lets the main query handle all the heavy lifting correctly without you breaking a sweat.
Now, to fix your issue:
First of all, remove all your queries, and just add this code in your category.php (Remember to replace your pagination function, wp_pagenavi())
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
You will immediately see that your category posts are showing correctly, but the amount of posts will be the same as what you set in the back end under reading
We will now use pre_get_posts to alter the amount of posts per category. For this, add the following code to your functions.php (Requires PHP 5.3+ and the code is untested)
add_action( 'pre_get_posts', function ( $q )
{
if ( !is_admin() // Very important, otherwise back end queries will be affected as well
&& $q->is_main_query() // Very important, we just need to modify the main query
&& $q->is_category() // Only target category pages
) {
// Check on which category page we are and set posts_per_page accordingly
if ( $q->is_category( array( 1, 2 ) ) )
$q->set( 'posts_per_page', 15 );
if ( $q->is_category( array( 3, 4 ) ) )
$q->set( 'posts_per_page', 5 );
}
});
This should basically do it.
Assuming this could help for those who, like me, use a DIVI CHILD THEME !
I finally found the solution by searching divi pagination.
In fact, in my case, I built a divi child theme. However, the post per page in my custom category page is set to 3, but into my divi > theme option the Number of Posts displayed on Category page were set to 6.
That why the page 3 was displaying an error 404. So, I set it to 1.
I read on a post that the "Blog pages show at most" into the settings > reading option have to be under the post_per_page custom query (for the home page), or else, it create a 404 page.
However, it look like that the Number of Posts displayed into the Divi option, overwrite the Blog pages show at most. Here why into my category.php page, I was stuck on page 3.
I leave you my tiny code about my custom category.php page for divi theme child :
<?php
//query{
//print_r(get_queried_object());
$category = get_queried_object();
$the_cat_nicename = $category->slug;
$the_cat_name = $category->name;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args_s = new WP_Query(array(
'post_type' => 'post',
'category_name' => $the_cat_nicename,
'posts_per_page' => 3,
'paged' => $paged,
'orderby'=>'date',
'order'=>'DESC'));
//query}
if ( $args_s->have_posts())
{
echo $the_cat_name;
echo '<br/>';
while ( $args_s->have_posts())
{
$args_s->the_post();
$the_id=get_the_ID($post->ID);
echo $the_id.'<br/>';
}
if ($args_s->max_num_pages > 1)
{
echo get_next_posts_link( $GLOBALS['older_post_lang'], $args_s->max_num_pages );
echo get_previous_posts_link( $GLOBALS['newer_post_lang'] );
}
}
//wordpress _have_posts}
?>
Do not forget to set your Number of Posts displayed on Category page to 1 into your Divi > theme option.
We have finally arrived to a final answer and working code!
If you read Mr. Pieter Goosen's answer above, it will help you. It really helped me. So, I'm going to give you the final answers. This is actually custom number of post in every category disregarding what is set in the settings.
So in my category.php
<?php if (is_category('category1')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category2')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category3')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } else if (is_category('category4')) { ?>
<?php if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your loop with template tags and html mark up
}
wp_pagenavi();
}
?>
<?php } ?>
WHERE category1 and category2 will display 5 posts, category3 and category4 will display 15 posts.
This is what you're going to place in your functions.php.
add_action( 'pre_get_posts', function($q) {
if (!is_admin() && $q->is_main_query() && $q->is_category()) {
if ($q->is_category( array(1,2) )) {
$q->set('posts_per_page', 5);
}
if ($q->is_category( array(3,4) )) {
$q->set('posts_per_page', 15);
}
}
return;
});
WHERE the numbers inside the array are category IDs.
If you compare my code and Sir Pieter's, it's almost the same BUT I added a return; before the add_action() is closed. But I'm quoting what Sir Pieter said:
It is really strange that you should return. pre_get_posts is a
action, not a filter. But any way, glad it is solved
If it still doesn't work for you, my permalink is set to:
http://www.example.com/sample-post/[/%postname%/].
I also have a WP No Category Base plugin to eliminate /category/ in my category URL. So instead of www.example.com/category/category1, it will be www.example.com/category1.
This is my second question, and I promise as soon as I feel like I can help others, I'm gonna return the favours to the community!
I'm building a one page Wordpress site with different sections, working from _S theme and learning as I go.
I already have all my different pages being pulled into the front-page, but I would like the different sections to have different layouts and elements. To be specific - in one section I would like content to be pulled in along side an iFrame that float next to each other. To do this I know that I need to call a custom page template that specifies two floating div containers (I'm building using Bootstrap).
In the front-page.php, I've written this:
<?php
if ( get_option( 'show_on_front' ) == 'posts' ) {
get_template_part( 'index' );
} elseif ( 'page' == get_option( 'show_on_front' ) ) { ?>
<?php get_header(); ?>
<section class="home">
<div class="entry-content">
<?php
$args = array(
'post_type' => 'page',
'order' => 'ASC'
);
$the_query = new WP_Query($args);
?>
<?php
while($the_query->have_posts() ) : $the_query->the_post(); ?>
<?php if (is_page(9)) : ?>
<?php get_template_part('play','page');?>
<?php else : ?>
<?php get_template_part('content', 'page');?>
<?php endif; ?>
<?php endwhile; ?>
</div>
</section>
<?php
get_footer();
}
?>
Which works perfectly in bringing in my different page sections, but I can't see how to call a different for the page (called 'play' or with the ID of 9).
I have already created a template called play-page
Any ideas?
Thanks masses
Harry
Let's assume you want to display 3 sections (about, work, contact) on the custom front page, you can create per page template for each section, like:
section-about.php
section-work.php
section-contact.php
In page-about.php like this:
<div class="section-about">
<?php the_content(); ?>
</div>
And use section-work, section-contact for other 2 pages.
Then you create 3 pages in the Dashboard and assign each to its template.
Now, you can add the loop in your font-page.php
<?php
$args = array(
'post_type' => 'page',
'post__in' => array(1, 2, 3) // the ids of those pages
);
$the_query = new WP_Query($args);
?>
<?php while($the_query->have_posts()) : $the_query->the_post(); ?>
<?php
the_title();
the_content();
// etc
?>
<?php endwhile; wp_reset_postdata(); ?>
hello there all i have a proplem that we are using one of the new themes called fancy theme the theme comes with a proplem in pagination now we are trying to fix that problem
as you see here http://www.uniblues.com/ when you press page 1,2,3 it redirects you to the same page no change only the url changes too http://www.uniblues.com/page/3/or /4 , /5 according to the page number you press here is the code that the theme uses ..
<?php
//query_posts('paged='.$paged);
$temp = $wp_query;
$wp_query= null;
$wp_query = new WP_Query();
$wp_query->query('showposts=7');
?>
any ideas ?? .. thanks
in case if some body wants to now how i manged to did this i simply used this code and it's done ..
global $query_string;
parse_str( $query_string, $my_query_array );
$paged = ( isset( $my_query_array['paged'] ) && !empty( $my_query_array['paged'] ) ) ? $my_query_array['paged'] : 1;
query_posts('post_type=post&posts_per_page=7&paged='.$paged);
?>
and it works like charm .. thanks all
Is it a theme we can download or did you develop it ?
The code you show get the last 7 articles, so the way it reacts is normal ^^
Here is, for example, the code used in twenty twelve :
<?php if ( have_posts() ) : ?>
<?php /* Start the Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
<?php twentytwelve_content_nav( 'nav-below' ); ?>
<?php else : ?>
[...]
It simply use the have_post() function to get the articles, and use the template called content (content.php) to show them.
And the number of post to show is set in the administration panel > Settings > Reading.
If you are developing your own theme, you should take a look at how the base themes (like twenty twelve) work.
how about
<?php
// clear any other queries that may be in use!
wp_reset_query();
// check for $_GET paged value
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// setup post arguments
$args = array( 'posts_per_page' => 7, 'paged' => $paged, );
// run our query
query_posts($args);
// start loop
if (have_posts()) : while (have_posts()) : the_post();
// if you use the <!-- more --> in your posts.
global $more;
$more = 0;
?>
<div class="post">
etc...
</div>
<?php endwhile; ?>
<div class="navigation">
<?php next_posts_link(''); ?>
<?php previous_posts_link(''); ?>
</div>
<?php else: ?>
<div><h2>Nothing found</h2><p>No posts found for that query</p></div>
<?php endif; ?>
:)
Hello I want to Create a home page that has updating blog entries.
So 4 lists of headlines from different categories
And I want to have a link to the regular blog page with a different template.
Right now I just changed index.php around to have the containers for the featured posts content.
So this is a two part question how do I get these mini updates for the thing
I want to use query_posts() multiple times I assume and separate by category.
And how do I make a linkable page to a blog.php file which currently is telling me that all these functions are undefined.
<?php get_header(); ?>
<?php if ( have_posts() ) : ?>
<?php /* Start the Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>
<?php endif; ?>
<?php get_footer(); ?>
If you want to create a page that includes WP data/posts outside the themes or blog folder, you need to include and make available the Wordpress functions first:
define('WP_USE_THEMES', false);
require('./blog/wp-blog-header.php');
And then you can make the queries for each set of posts by category:
$args = array( 'numberposts' => '5, 'offset'=> 1, 'category' => 'your category ID' );
$myposts = get_posts( $args );
foreach($myposts as $post) {
...some code...
}
I hope it helps.