how to assign page template dynamically in wordpress - php

I have a WordPress page created dynamically
$my_post = array(
'post_title' => 'page-for-download',
'post_content' => '',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'page'
);
now my question is how to assign page template to this page dynamically

WordPress keeps the page template in a post meta entry(named _wp_page_template). Here is what you should do once you create the page:
update_post_meta( $new_post_id, '_wp_page_template', 'custom-template.php' );
Where $new_post_id is the result of wp_insert_post()(I assume that this is what you are using to create the new post). Note, that you might want to check to see if you have an actual id(by default wp_insert_post() will return false if it fails to create a new post).
You can see that information in the first NOTE in the Parameters section of the WordPress codex page Function Reference/wp insert post

Related

How to create a wordpress page automatically when a subscriber is registered to wordpress

Further i need the automatically created page to be edited by the respective subscribe only and when published it should be visible to all users who visit the website
Perhaps you need to use the user_register hook and execute the function in which you create the post, and to create a post, you need to use wp_insert_post function
add_action('user_register','my_function');
function my_function($user_id){
// Create post object
$my_post = array(
'post_title' => 'Title of page',
'post_type' => 'post', // Set type of your post
'post_content' => $_POST['post_content'],
'post_status' => 'publish', // Page published
'post_author' => $user_id // Assign page author
);
// Insert the post into the database
wp_insert_post( $my_post );
}
You can also manage Roles and Capabilities for your post type
Examples:
https://wordpress.stackexchange.com/a/208739/193674
https://wordpress.stackexchange.com/a/108375/193674

WP User Frontend Action Hook using post_title

I am using the Wordpress plugin WP User Frontend. I have a POST form setup that creates a post in a custom post type. I want that same post when setup to create another post in another custom post type. For this secondary post, I want to use the post_title as it's title.
I have:
add_action('create_whiteboard_hook', 'create_whiteboard', 10, 3 );
function create_whiteboard( $form_id, $post_id, $form_settings ) {
$post_id = wp_insert_post(array (
'post_type' => 'whiteboard',
'post_title' => $_POST['post_title'],
'post_status' => 'publish',
'comment_status' => 'closed',
'ping_status' => 'closed',
));
}
This works OK (as in it does create an additional post on the whiteboard (custom post type)) but it comes through with a title of (no title). I can manually set the title but I want it to automatically get it from the title the user puts in...

Is there a way to programmatically import wordpress pages within wordpress?

I'm trying to create this functionality within my wordpress plugin. Let's say I have a set number of pages that will never change and I want to automatically import them to every wordpress site I set up without having to manually go to the first site, export the xml file containing the pages then import it to the new site. Any thoughts on this?
Thanks
If you know how to loop through your XML file and your XML file is accessible on the other site you could loop through the following code:-
// Create post object
$my_post = array(
'post_title' => wp_strip_all_tags( $post_title ),
'post_content' => $post_content,
'post_status' => 'publish',
'post_author' => 1,
'post_category' => $cat
);
// Insert the post into the database
wp_insert_post( $my_post );
You would need to initiate this code on the install of your plugin.
You can export your pages via default Wordpress export tool. That will result in .xml (WXR) file.
After that you can import the pages via WP-CLI tool on each one site, with the following command:
$ wp import file-name.xml
WXR stands for WordPress eXtended RSS.
You can store the pages in an array and then automatically insert them when your plugin is activated. I'd recommend storing a meta_key for each page that also let's you know it's already been inserted so that you don't create them every time the plugin is activated and deactivated. You can put this in the main file of your plugin. Be sure to replace the numbered pages and slugs with actual page names and to replace "my_plugin" with your plugin's namespace.
<?php
function create_my_plugin_pages() {
$pages = array(
'Page 1' => 'page-1', // Use slugs to create meta-keys
'Page 2' => 'page-2',
'Page 3' => 'page-3'
);
foreach( $pages as $title => $slug ) {
$meta_key = 'my-plugin_'.$slug;
// Check that the page wasn't already created
$existing = get_posts(array(
'post_type' => 'page',
'meta_query' => array(
array(
'key' => $meta_key,
'value' => '1'
)
)
));
// Create page if it doesn't exist
if ( !count($existing) ) {
$new_page = wp_insert_post(array(
'post_title' => $title,
'post_status' => 'publish'
));
add_post_meta($new_page,$meta_key,'1');
}
}
}
register_activation_hook( __FILE__, 'create_my_plugin_pages' );
?>

Wordpress create post with PHP

I want to make a custom PHP script, what can make a post for wordpress.
Here is my code from official page, but its not working:
require("wp-includes/post.php");
// Create post object
$my_post = array(
'post_title' => "mytitle",
'post_content' => "mycontent",
'post_status' => 'publish',
'post_author' => 1,
'post_category' => array( 1 )
);
wp_insert_post( $my_post );
The error is:
Fatal error: Call to undefined function get_current_user_id() in
/home/MyUser/public_html/wp-includes/post.php on line 2897
What im doing wrong?
The problem is probably that you are not logged in as a backend user. The script is trying to get a backend user id. There has to be a user logged in to create a post. Each post needs a userid, this is used to set the author of the post.
Also are you trying to execute this script inside a plugin or outside wordpress?
For custom PHP script, just add the correct include "wp-load.php" instead of "post.php"
wp_insert_post() - return ID of new post see more
require('wp-load.php');
//require("wp-includes/post.php");
// Create post
$my_post = [
'post_title' => "mytitle",
'post_content' => "mycontent",
'post_status' => 'publish',
'post_author' => 1,
'post_category' => [ 1 ]
];
wp_insert_post( $my_post );

Wordpress Create post programmatically then show post on index.php

I have been trying this project of mine for a while now and I have got no luck. I'm trying to create 8 post programmatically in functions.php. I need these to only post 1 time. The problem I've been having is everytime I refresh the page the post will just auto create more. Here is my code to create post progammatically in functions.php.
<?php // Create post object
$my_post = array(
'post_title' => 'How to make your diet success',
'post_name' => '7-ways-to-make-succes-Diet',
'post_content' => 'my content',
'post_status' => 'publish',
'post_author' => 1,
'post_category' => array(8,39)
);
// Insert the post into the database
wp_insert_post( $my_post ); ?>
The only proble with this code is that it auto creates more post every time the page refreshes. I'm going to be creating 8 of these functions and I only want them to be created once. A code example would be great.
Next, I want to display the post on my index.php. I want to get these post individually. Here is my code I have so far.
<div class="post1"><?php $post_id = wp_insert_post( $post, $wp_error );
//now you can use $post_id withing add_post_meta or update_post_meta ?> </div>
<div class="post2"><?php $post_id = wp_insert_post( $post, $wp_error );
//now you can use $post_id withing add_post_meta or update_post_meta ?> </div>
I'm pretty sure I need to either call the slugs or post name to get them individually. Yes, I have tried this method as well as 10 other methods but nothing has worked. The closest I got was it to display the post name. Code examples would be great. I will be so grateful and probably donate some money via paypal if someone can get this working for me. Thanks.
functions.php is not a good place for programatically create pages nor posts. You should create a plugin (it is simple as creating custom theme) and create posts in its activation function. This function is called only on your plugin activation. Read also about plugin deactivation a uninstall hooks
The reason why your posts get created again and again is that file functions.php is called each time the page is requested. If you insist on creating posts in functions.php, you should wrap your wp_insert_post by a condition chcecking whether your posts are already created - than get_posts function would suit your needs.
<?php
//Use either post slug (post_name)
$post = get_posts( array( 'name' => '7-ways-to-make-success-diet' ) );
/*or $post = get_posts( array( 'name' => sanitize_title('My Single.php Test') ) );
if you do not set the post_name attribute and let WordPress to set it up for you */
if ( empty($post) ) {
// Create post object
$my_post = array( 'post_title' => 'My Single.php Test', 'post_name' => '7-ways-to-make-success-diet', 'post_content' => 'my content4654654', 'post_status' => 'publish', 'post_author' => 1, 'post_category' => array(8,39) );
// Insert the post into the database
wp_insert_post( $my_post );
}
?>
Also, get_posts will help you to bring your posts on front page. Eg.
<?php
$post = get_posts( array( 'name' => 'How to make your diet success' ) );
echo $post->post_title;
...
?>

Categories