• Resolved solid7

    (@solid7)


    In the old days, I would have copied the index.php file, and revised the php code to include or exclude certain categories. What is the equivalent functionality in the latest version of WordPress?

    I have 4 separate pages that I want to include post from only one category. This is to include content from 4 separate site users, for their unique and individual content. Additionally, I will exclude these categories (created specifically for them) from the main blog.

    So where are the files that define these includes? (what used to be templates)

    Thank you.

Viewing 11 replies - 1 through 11 (of 11 total)
  • Thread Starter solid7

    (@solid7)

    Anyone? This should be a super simple question… Multiple pages displaying latest posts, but only from specific categories on each?

    Thread Starter solid7

    (@solid7)

    OK, since nobody can ask the question as it’s asked… how about we create a standalone page, calling the php functions the same as the wordpress theme, but without using the interface? I don’t care if we have to use .htaccess redirects for the pages. I’ve tried creating pages with the php includes, but not having any luck!

    I’m not sure when the “old days” were for you, but I don’t think much has changed in terms of filtering the loop. You’d use this code in the appropriate PHP templates:

    <?php
    $new_query_args = array(
      'category_name' => 'category-slug', /* or */
      'cat' => 2, /* id of the desired category */
    );
    
    $new_query = new WP_Query( $new_query_args );
    
    if ( $new_query->have_posts() ) :
      while ( $new_query->have_posts() ) : $new_query->the_post();
      .. do something ...
      endwhile;
    else :
      .. if there were no matching posts ..
    endif;
    
    wp_reset_postdata();

    (See https://codex.wordpress.org/Class_Reference/WP_Query for more information.)

    And then you could use this code in functions.php to exclude those categories from the main query:

    function sc_exclude_user_categories( $query ) {
      if ( is_main_query() ) :
        $query->set( 'category__not_in', array( 2, 3, 4, 5 ) );
      endif;
    }
    add_action( 'pre_get_posts', 'sc_exclude_user_categories' );

    You could use page templates to hold the appropriate code to display each user’s category, which would allow you to easily add those static pages to a menu.

    Thread Starter solid7

    (@solid7)

    I’ve already added the code to the functions.php, and it works. Unfortunately, it also prevents the posts from appearing when one actually selects the category.

    Let me try to explain this in layman’s terms… I want to emulate the blog. In my limited understanding, the best way that I know how to do this, would be to find page gathers all of the php includes that WordPress uses. In the “old days” – we’re talking 6 or 7 years back – you could easily emulate pages by copying the main page. It used to be the “index” of the theme. Now, there is nothing in the theme index, except a commented out phrase, “silence is golden”. So what is used to aggregate the index.php and all of it’s sub-functions?

    I would be more than satisfied just to create copies of that, and re-write the code on the backend, rather than through the interface. In my case, I would want to just call the header, footer, and loop, but the loop would just be a simple query of the specific category that I want.

    I’ve already added the code to the functions.php, and it works. Unfortunately, it also prevents the posts from appearing when one actually selects the category.

    Sorry, that was my fault. Try this code instead:

    function sc_exclude_user_categories( $query ) {
      if ( is_main_query() && ( is_home() || is_front_page() ) ) :
        $query->set( 'category__not_in', array( 2, 3, 4, 5 ) );
      endif;
    }
    add_action( 'pre_get_posts', 'sc_exclude_user_categories' );

    Now, there is nothing in the theme index, except a commented out phrase, “silence is golden”. So what is used to aggregate the index.php and all of it’s sub-functions?

    What theme are you using? There’s an empty index.php file in the main theme folder wp-content/themes, but it’s a bit unusual to see one in your particular theme’s folder wp-content/themes/your-theme.

    Check out https://developer.wordpress.org/themes/basics/template-hierarchy/ to get an idea of how WordPress knows which PHP files to use. If I’m correctly understanding what you’re trying to do, you could make the individual page templates to display the appropriate content with the other piece of code I posted. Then, you could create a static page for each individual user and assign the appropriate page template.

    Thread Starter solid7

    (@solid7)

    I just created a custom page template. To test its functionality, I copied the entire contents of the main theme’s index.php. I verified the template with the Template Debugger plugin. So I know that’s what my blog is using. Now, I named the custom page template with “page-“, followed by the slug of the page that I want it to apply to. No problem, again the Template Debugger verifies that the template is being accessed by the page. However, there is no content displayed on the page. It should be displaying EXACTLY what is on the blog, if I copied the contents of the page template, right?

    Thread Starter solid7

    (@solid7)

    I am using the cubic theme. I didn’t actually use your code to exclude posts – it was code that I already added several days ago. I’ll give it another go.

    It should be displaying EXACTLY what is on the blog, if I copied the contents of [index.php], right?

    Not necessarily, because WordPress is “smart” enough to know that the_post() refers to the static page corresponding to the page with the matching slug. What you could do, though, is run a new query on that page:

    <?php
    $new_query_args = array(
      'category_name' => 'category-slug', /* or */
      'cat' => 2, /* id of the desired category */
    );
    
    $new_query = new WP_Query( $new_query_args );
    
    if ( $new_query->have_posts() ) :
      while ( $new_query->have_posts() ) : $new_query->the_post();
      .. do something ...
      endwhile;
    else :
      .. if there were no matching posts ..
    endif;
    
    wp_reset_postdata();

    WordPress would then display the posts from that category.

    Another option would be to make copies of archive.php, renaming the copies to category-{id}.php or category-{slug}.php, and then editing those copies. That way, WP would automatically display the correct posts without you having to make a separate query.

    Thread Starter solid7

    (@solid7)

    Of course, in all of this, what completely blew over my head, is that I can just link each user directly to the category page. That, combined with the exclude in the functions.php, achieved EXACTLY what I was after, with zero effort.

    Thank you for your help.

    Yeah, that was partially (mostly) my fault. I got a bit caught up in what you were asking about rather than what you were actually trying to do. Sorry.

    Thread Starter solid7

    (@solid7)

    I learn whether directly or indirectly. It’s all good. Thank you for your replies.

Viewing 11 replies - 1 through 11 (of 11 total)
  • The topic ‘How to add pages with specific categories included’ is closed to new replies.