Creating pages from Ninja form data - wordpress

I've created a WordPress page with a Ninja form on it that collects miscellaneous data about a product, including some uploaded images. The page with the form is accessible from the main menu by clicking the "Input" item, so the user doesn't need to access the backend to upload their product data.
I now want to put this data into a custom post type called "Listing." There will eventually be thousands of these data sets and so thousands of "Listing" pages, as people come to the site, click Input in the main menu to get to the page with the Ninja form and fill it out.
Could someone tell me how they would go about now building these listing pages from the data the form has collected?
I'm running Ninja's Front-End Post option which supposedly will create a page from the form data. This plugin has some Post creation settings where you can select the post type to create, but this isn't working for me. I would expect the submitted form data to show up under dashboard | Listings, but there's nothing there after submitting the form.
Has anyone gotten this to work?
Thanks for your help.

I think you can use only Ninja Forms without extensions, and hook directly in 'ninja_forms_after_submission' that fires after submission and allow you to use data submitted and perform actions.
This is a starter codebase to achieve your result, but needs to be customized on your needs and your form structure.
add_action( 'ninja_forms_after_submission', 'create_page_from_ninjaform' );
function create_page_from_ninjaform( $form_data ){
// your fields data
$form_fields = $form_data[ 'fields' ];
// !!! this is an example, it depends form fields in your form
$title = $form_fields[ 1 ][ 'value' ];
$content = $form_fields[ 2 ][ 'value' ];
$sample_meta_field = $form_fields[ 3 ][ 'value' ];
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => 'listing', // be sure this is the post type name
);
$new_post_id = wp_insert_post( $new_post );
update_post_meta( $new_post_id, 'your_meta_key', $sample_meta_field );
}
This code should be copied in functions.php file
Not tested of course.
Good luck ;)

The Ninja Forms Front-end Posting extension isn't really meant for displaying form submission data on the front end.
From: https://ninjaforms.com/extensions/front-end-posting/
"The Ninja Forms Front-end Posting extension gives you the power of the WordPress post editor on any publicly viewable page you choose."
If you want to show Ninja Forms submission data on the front end, you will have to retrieve them from the database with code in functions.php or by writing a plugin (recommended). You could then parse and manipulate them and create a shortcode that would allow you to insert your formatted submission data easily in Wordpress posts or pages.
Here's a link to a feature request, asking for the same thing. The author of that request posted a link to a plugin (click Download as Plugin) they wrote which may do what you want or give you further insights as to how you could implement this.
https://github.com/wpninjas/ninja-forms/issues/892

If you do not mind paying a little money for a plugin I would recommend using gravity forms rather then ninja forms for more advanced stuff like this.
I manually create a custom post type "oproep" and used a gravityforms plugin to create a custom post from type oproep when an user submits the form.
Because you use custom post type archive pages www.mysite.com/oproep will be automatically created so you already have a list of "Listings". The singe pages www.mysite.com/oproep/title will also be created for you by default, you could override these templates as well if you would like depending on your theme.
The only thing you have to do is add a few php lines to your functions.php (or write your own plugin) that adds the custom post type. The rest all works automatically.
I went so far as writing code to make users able to edit their submissions, read custom taxonomy tags in dropdowns etc. You got lots and lots of more options using gravity forms.

FrancescoCarlucci's answer is correct, but just adding an additional comment: in case you want to specify by form field IDs which fields should go where in your post, NinjaForms passes the ID as a number (in my case for example, I needed field 136 for my post title). It may have been obvious but I racked my brain for a while until I figured it out.
function create_post($form_data) {
$form_fields = $form_data[ 'fields' ];
$post_fields = array(
'post_content' => '',
'post_content_filtered' => '',
'post_title' => '',
'post_excerpt' => '',
'post_status' => 'pending',
'post_type' => 'post',
);
foreach ($form_fields as $field) {
$field_id = $field[ 'id' ];
$field_key = $field[ 'key' ];
$field_value = $field[ 'value' ];
if ($field_id == 136) {
$post_fields['post_title'] = $field_value;
}
}
wp_insert_post($post_fields, true);
}

Related

Plugin single.php not showing

I'm creating a plugin for Wordpress that creates a new post type for news and events (yes, yet another one ;-) ). The post-type is registered under the name gg_nae.
The post type works as expected; the post type can be saved and edited.
Now I want to create a custom template file. I called it single-gg_nae.php and I saved it in the same folder as the plugin-code.
If I understand the explanation on https://developer.wordpress.org/plugins/post-types/working-with-custom-post-types/ correctly that should be enough to render the post type in the custom template, but it won't. It renders the post with the single.php file from the template.
If I move the custom template to the theme-folder however, Wordpress uses the template as intended; it renders the post in the single-gg_nae.php template.
What am I doing wrong here? Should single-gg_nae.php be placed in a specific folder in the plugin-map?
edit: I already saved the permalink-structure again, but that didn't help.
only for the missing in this three below parameter u are getting error
'rewrite' => array( 'slug' => 'slider' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => true,
try it in argument list with rest of parameters
I was thinking all wrong when approaching this issue.
I have created custom post types before and always included them in the functions.php of my Wordpress theme, therefor creating templates (archive-PostTypeName.php and single-PostTypeName.php) to show them. I assumed that was also needed when developing a CPT-plugin.
In case of a plugin, however, you have to alter the behavior of the single.php template from within the plugin using filters. I have added the following (simplified) code to my plugin:
/**
* Alter the_content if Posttype is custom post type
*
* #uses is_single()
*/
add_filter( 'the_content', 'my_the_content_filter', 20 );
function my_the_content_filter( $content ) {
if ( is_single() AND get_post_type() === 'PostTypeName') {
// Do stuff here
$content = 'This is My Custom Post Type!';
}
// Returns the content.
return $content;
}
When opening posts of the type 'PostTypeName' the content will say 'This is My Custom Post Type!', otherwise it'll show the content of the post of page.
More information about filters (and actions) can be in the Wordpress Codex

Add a user along with one custom post type

I am developing this plugin that admin can add a user in the backend and when user is created, plugin can automatically generate one custom post which I have added to the theme. The custom post will store user ID that is just created (or if it is possible make that user an author of the post)
I wonder if what I have mentioned above is possible practically. If anybody has any better advice, I am open for any suggestions.
Thank you in advance
I'm not sure that a unique custom post type per user is the best way to implement what you're wanting to achieve. If you have 100 users, you will have 100 custom post types making the wp-admin a nightmare as the left menu would grow with so many menu-items.
Wouldn't it be easier to just use a normal post type and then have the page that shows the user's dashboard filter the posts to only show posts where the user is the post_author? You could then add a hook to catch when a user registers and create the example post, you could modify the code below and add it to your functions.php:
add_action( 'user_register', 'myplugin_registration_save', 10, 1 );
function myplugin_registration_save( $user_id ) {
$userPostsCategory = 3;
// Create post object
$my_post = array(
'post_title' => 'Sample Story' ),
'post_content' => 'You can edit this or create a new story',
'post_status' => 'publish',
'post_author' => user_id,
'post_category' => array( $userPostsCategory )
);
// Insert the post into the database
wp_insert_post( $my_post );
}
This method will lower the number of customisations you'd have to do to your themes and make management of the posts a little easier.
Further reading on this:
User registration hook
Inserting a post using wp_insert_post

Wordpress: automatically convert custom field to custom taxonomy?

I have this custom post type called "listing". People can use a front-end form to create a new listing. This front-end form has a custom field called "app_city". Now when someone submits the form, I would like this custom field value to be converted automatically to a term in the custom taxonomy "Cities" (under my cystom post type "listing").
Is such a thing possible to accomplish?
Thanks.
Yes it is possible through wp_insert_term(). But you have to digg your front-end form that handle the app_city custom field data. Just Use the wp_insert_term() after everything verified from the form.
Ok, so this worked for me.
Thanks!
$parent_term = term_exists( 'Cities' ); // array is returned if taxonomy is given
$parent_term_id = $parent_term['term_id']; // get numeric term id
$city = $_POST['app_plaatsnaam'];
wp_insert_term(
$_POST['app_city'], // the term
'Cities', // the taxonomy
array(
'parent'=> $parent_term_id
)
);
wp_set_object_terms( $listing_id, $city, 'Cities', false);

Create posts, pages and menus in Wordpress MU

I'm using Wordpress (with multisite capabilities enable) to create my network.
When I add a new site, it's needed to create some posts, pages and menus into this new site.
I need to create a default form (with WP Contact Form 7 plugin) too.
While I'm looking for this answer, I'm doing this manually: add the new site, create posts, pages, menus and default contact form, then I give the user and password to new user.
Thanks!!
It can be done with a Must Use Plugin and the action hook wpmu_new_blog.
<?php
/**
* Plugin Name: Create custom content on site creation
*/
add_action( 'wpmu_new_blog', 'custom_items_so_23276440', 10, 6 );
function custom_items_so_23276440( $blog_id, $user_id, $domain, $path, $site_id, $meta )
{
switch_to_blog( $blog_id );
$default_page = array(
'post_title' => 'Default title',
'post_content' => '<h2>Default content</h2>',
'post_status' => 'publish',
'post_type' => 'page'
);
// insert the post into the database
wp_insert_post( $default_page );
restore_current_blog();
}
To create the menus, use the functions wp_create_nav_menu and wp_update_nav_menu_item. I'm not sure about the contact form, you'll have to inspect the database to see how CF7 does it, maybe it has some handy function to create a form programatically...
There's another technique using the file wp-content/install.php explained in How to Create a Custom WordPress Install Package?

Adding postmeta default values after adding post

I am using Wordpress XMLRPC to add posts to my blog.
However, after running this.
$data = array(
'title' => $title,
'description' => $content,
'post_type' => 'post',
'categories' => array($category),
'post_status' => 'publish'
);
$addedPostReturn = $this->_client->query('metaWeblog.newPost',
array(0,$username,$password,$data,1));
This adds the post fine but doesn't add the postmeta information.
If i open the post, click Update, all the default postmeta gets updated. However, I would like to add all the default postmeta information with my php script instead of manually (or else it kinda defeats the purpose).
Is there anyway, either with xmlrpc or regular wordpress functions to create the postmeta custom fields by using their default values? If not, is there a way to have the list of all the custom fields i need to manually add using the custom fields section of the metaWeblog.newPost function? (I don't want to add some but not others. I rather do a complete job)
Thanks in advance... any help is appreciated! :)
EDIT:
$postUpdateContent = array();
$postUpdateContent['ID'] = $newPostId;
$postUpdateContent['post_content'] = $sameContent;
wp_update_post( $postUpdateContent );
didn't seem to do the trick...

Resources