0

I have a form where users can save/update their profile. I'm trying that at the same time they can create a custome post type (channels) with some of the info set on the form.

Here the code:

/* mY CHANNEL INFO FORM UPDATE */

function form_update() {

    global $post;
    if( $post->ID == 153) {

        /* Get user info. */
        global $current_user, $wp_roles;
        /* Load the registration file. */
        $error = array();    
        /* If profile was saved, update profile. */
        if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {

            /* Update user password. */
            if ( !empty($_POST['pass1'] ) && !empty( $_POST['pass2'] ) ) {
                if ( $_POST['pass1'] == $_POST['pass2'] )
                    wp_update_user( array( 'ID' => $current_user->ID, 'user_pass' => esc_attr( $_POST['pass1'] ) ) );
                else
                    $error[] = __('The passwords you entered do not match.  Your password was not updated.', 'profile');
            }

            /* Update user information. */
            if ( !empty( $_POST['url'] ) )
                wp_update_user( array( 'ID' => $current_user->ID, 'user_url' => esc_url( $_POST['url'] ) ) );
            if ( !empty( $_POST['email'] ) ){
                if (!is_email(esc_attr( $_POST['email'] )))
                    $error[] = __('The Email you entered is not valid.  please try again.', 'profile');
                elseif(email_exists(esc_attr( $_POST['email'] )) != $current_user->id )
                    $error[] = __('This email is already used by another user.  try a different one.', 'profile');
                else{
                    wp_update_user( array ('ID' => $current_user->ID, 'user_email' => esc_attr( $_POST['email'] )));
                }
            }

            if ( !empty( $_POST['first-name'] ) )
                update_user_meta( $current_user->ID, 'first_name', esc_attr( $_POST['first-name'] ) );
            if ( !empty( $_POST['last-name'] ) )
                update_user_meta($current_user->ID, 'last_name', esc_attr( $_POST['last-name'] ) );
            if ( !empty( $_POST['description'] ) )
                update_user_meta( $current_user->ID, 'description', esc_attr( $_POST['description'] ) );
            if ( !empty( $_POST['channel_name'] ) )
                if(channel_exists( esc_attr( $_POST['channel_name']  )) != $current_user->id )
                    $error[] = __('This channel is already used by another user.  try a different one.', 'profile');
                else {
                    update_user_meta( $current_user->ID, 'channel_name', esc_attr( $_POST['channel_name'] ) );   
                }
            if ( !empty( $_POST['pic'] ) )
                update_user_meta( $current_user->ID, 'pic', esc_attr( $_POST['pic'] ) );    
            if ( !empty( $_POST['description_channel'] ) )
                update_user_meta( $current_user->ID, 'description_channel', esc_attr( $_POST['description_channel'] ) );
    
            /* Redirect so the page will show updated info.*/
            /*I am not Author of this Code- i dont know why but it worked for me after changing below line to if ( count($error) == 0 ){ */
            if ( !$error ) {         
                wp_redirect( get_permalink() .'?updated=true' );         
                exit;     
            }
        }


        if ( ! defined( 'ABSPATH' ) ) {
            exit; // Exit if accessed directly.
        }
    }
}
add_action( 'wp_enqueue_scripts', 'form_update'  );

EDITED:

Changed the first code after first comment. Separated in another function to create post after submit form by users. But still not working:

function custom_post () {

    global $post;
    if( $post->ID == 153) {

        /* Get user info. */
        global $current_user, $wp_roles;
        /* Load the registration file. */
        $error = array();    
        /* If profile was saved, update profile. */
        if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'update-user' ) {

            if ( !empty( $_POST['channel_name']) && !empty( $_POST['description_channel']) && !empty( $_POST['pic'] ) )  { 
                // Finally, save/update the channel!
                $user = get_user_by( 'ID', $user_id );
                $channel_id = get_channel_by_author( $user_id );
                $args     = [
                    'ID'           => $channel_id,
                    'post_title'   => $_POST['channel_name'],
                    'post_name'    => $_POST['channel_name'], // set the slug/permalink
                    'post_content' => $_POST['description_channel'],
                    'post_status'  => 'publish',
                    'post_type'    => 'channels',
                ];
                $post_id  = wp_insert_post( $args );

                // check if we were succesful.
                if ( is_wp_error( $post_id ) ) {
                    // it didn't work!
                    error_log( $post_id->get_error_message() );
                } else if ( empty( $post_id ) ) {
                    // it didn't work!
                    error_log( "post_id is empty/false" );
                }
            }
        }
    }

}        

add_action( 'wp', 'custom_post' );

Why it doesn't create custom post channels?

Appreciate your time

0

1 Answer 1

0

wp_enqueue_scripts action is not meant to add PHP code to your page. It is used to add JS scripts.

https://developer.wordpress.org/reference/hooks/wp_enqueue_scripts/

wp_enqueue_scripts is the proper hook to use when enqueuing scripts and styles that are meant to appear on the front end. Despite the name, it is used for enqueuing both scripts and styles.

If you want to handle your post submission, you can use the init or admin_init actions (if you are on the public website or the admin section). You might need to hook wp if you need to access the global $post object.

Do you get anything in your error handler? Can you check that you correctly get your posted data with var_dump($_POST);?

Does your post type channels is registered somewhere, your current user needs to be allowed to create the post type. You should check the capabilities that you set when registering your post type. https://developer.wordpress.org/reference/functions/register_post_type/

25
  • Thanks for your response. Where should I write var_dump($_POST); ? If I write it inside the function where will be display it if it doesn't create a custom post type? Sorry, I'm quite newbie...
    – Zaesar
    Aug 10, 2020 at 8:07
  • While this is true, it doesn't answer the question. Aug 10, 2020 at 8:15
  • I have changed the question. Putting in another function with the hook 'init' for create custom post type after submitting form by users
    – Zaesar
    Aug 10, 2020 at 8:23
  • I think they do have capabilities as their role is 'instructor' what is the same as 'author'
    – Zaesar
    Aug 10, 2020 at 8:24
  • And yes. I have channels registered as custom post type. So it is possible to create channels posts. But not from submiting the form
    – Zaesar
    Aug 10, 2020 at 8:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.