Programmatically change post templates?

I need to change the template on several hundred pages on my site. Does anyone know if there is a command to do it programmatically? See the following code snippet; I’d like to replace my comment inside the loop with a function that will change the template of the current page:

query = new WP_Query($args);
while ( $query->have_posts() ) : $the_query->the_post();
  if ( has_tag('tag-slug') )
  {
     /* CHANGE TEMPLATE OF $post */
  }
endwhile;
wp_reset_postdata();

Related posts

Leave a Reply

4 comments

  1. I take it that you mean saving the pages with a new post-template to the DB? see if there’s anything in the post object that refers to the page-template, if so craft a query that updates that.

    Update:

    Taken from the wp_insert_post documentation

    NOTE: The page_template key was removed from the $post table and is
    now located in the wp_postmeta table. To set the page template of a
    page, use update_post_meta instead with a meta key of
    _wp_page_template.

    So you can fetch the page template using get_post_meta, and update it with update_post_meta (Or set it with add_post_meta)

  2. What kinds of formatting are you referring to? If you want to change the formatting that can be changed by css. You can use post_class() which will add a class naming your tag in the container. Then you can style targeting that class.

    Inside the loop:

    <div <?php post_class()?> >
    </div>
    

    Also check the action pre_get_post; Using it with conditionals might help.

  3. Try this:

    while ( $query->have_posts() ) : $query->the_post();
      if ( has_tag('tag-slug') )
      {
         get_template_part( 'content', 'tag-slug' );
      }
      else
      {
         get_template_part( 'content' );
      }
    
    endwhile;
    

    You would then need to create content.php and content-tag-slug.php with the appropriate content.

    You could also look into setting up Post Formats. A bit more work up front, but a nicer experience down the road.

  4. To change the template of a post, call update_post_meta($query->the_post->ID, '_wp_page_template', 'YOUR-NEW-TEMPLATE-HERE.php')

    Here, then, is the example from the WP Codex found in @Xeross’s link with the code snippet from the original question:

    $query = new WP_Query($args);
    while ( $query->have_posts() ) : $query->the_post();
      if ( has_tag('tag-slug') )
      {
         /* CHANGE TEMPLATE OF $post */
        update_post_meta($query->the_post->ID, '_wp_page_template', 'YOUR-NEW-TEMPLATE-HERE.php');
      }
    endwhile;
    wp_reset_postdata();
    

    Kudos to @Xeross for providing the answer in a link and providing the documentation about where the template datum is stored. See @Xeross’s answer for more https://wordpress.stackexchange.com/a/24933/69247