Insert Post using Ajax

时间:2013-12-18 作者:sta777

我正在使用以下代码从Wordpress页面提交表单。

<script type="text/javascript">
$j=jQuery.noConflict(); 
    $j(document).ready(function(){                                              
        $j("#enqform").validate({               
            submitHandler: function () {                 
                dataString = $j("#enqform").serialize();                                
                $.ajax({
                    type: "POST",
                    url: "http://www.mysite.co.uk/wp-content/themes/mytheme/lib/form-process.php",
                    data: dataString,
                    error: function(jqXHR, textStatus, errorThrown){                                        
                        console.error("The following error occured: " + textStatus, errorThrown);                                                       
                    },
                    success: function(data) {                                       
                        console.log("Hooray, it worked!");                                                                  
                    }                              
                });                             
            }                   
        })
    }); 
</script>                    

<form action="<?php the_permalink(); ?>" class="contact-box" id="enqform" method="post">
    <label for="firstname">First Name<span class="req">*</span></label>                      
    <input type="text" id="firstname" name="firstname" value="<?php if(isset($_POST[\'firstname\'])) echo $_POST[\'firstname\'];?>" class="required" /> 
    <input type="submit" id="submit-btn" value="Submit" />
    <input type="hidden" name="submitted" id="submitted" value="true" /> 
    <input type="hidden" name="nonce" value="<?php echo wp_create_nonce( \'form-nonce\' );?>" />                      
</form> 
这是表单流程中的代码。php文件:

<?php       
if(isset($_POST[\'submitted\'])) {    

    if(trim($_POST[\'firstname\']) === \'\') {
        $hasError = true;
    } else {
        $firstname = trim($_POST[\'firstname\']);
    }   

    global $wpdb;
    $nonce = $_POST[\'nonce\'];
    if ( ! wp_verify_nonce( $nonce, \'form-nonce\' ) ) {
        die( \'Security check\' ); 
    } else {            
        $new_post = array(
            \'post_title\'    => $firstname,
            \'post_status\'   => \'publish\',
            \'post_type\' => \'mycpt\'
        );
        $pid = wp_insert_post($new_post);                           
        if( $pid ) { 
            add_post_meta( $pid, \'cpt_firstname\', $firstname, true );                                       
        }
    }
}           
?>      
表单工作正常,但当它到达wp_insert_post, 导致500内部服务器错误。

你知道我哪里做错了吗?

1 个回复
最合适的回答,由SO网友:David 整理而成

错误日志是怎么写的?这就是form-process.php? 如果是这样,那么问题可能是wp_insert_post() 未定义,因为未加载WordPress核心。

因此WordPress具有AJAX-API. 下面是一个如何在服务器端使用该API的示例:

add_action( \'admin_ajax_your_form_action\', \'wpse_126886_ajax_handler\' );

function wpse_126886_ajax_handler() {

    // maybe check some permissions here, depending on your app
    if ( ! current_user_can( \'edit_posts\' ) )
        exit;

    $post_data = array();
    //handle your form data here by accessing $_POST

    $new_post_ID = wp_insert_post( $post_data );

    // send some information back to the javascipt handler
    $response = array(
        \'status\' => \'200\',
        \'message\' => \'OK\',
        \'new_post_ID\' => $new_post_ID
    );

    // normally, the script expects a json respone
    header( \'Content-Type: application/json; charset=utf-8\' );
    echo json_encode( $response );

    exit; // important
}
Theyour_form_action slug是回调的»触发器«。您必须将此slug附加到名为action. 跟上.serialize() 我建议将此段代码作为隐藏输入传递到公式中:

<input type="hidden" name="action" value="your_form_slug" />
最后,您必须使用wp-admin/admin-ajax.php AJAX请求的URL:

$.ajax({
    type: "POST",
    url: "http://www.mysite.co.uk/wp-admin/admin-ajax.php",
    data: dataString,
    error: function(jqXHR, textStatus, errorThrown){                                        
        console.error("The following error occured: " + textStatus, errorThrown);                                                       
    },
    success: function(data) {                                       
        console.log("Hooray, it worked!");                                                                  
    }                              
});

结束

相关推荐

仅在某些页面上加载的AJAX导航和脚本

我正在构建一个主题。主题帖子导航是通过jQuery Ajax完成的。我已经使用了几个插件来查看兼容性,但我对Ajax的功能性有一个问题。一些插件(如Jetpack)会根据帖子内容加载某些脚本。例如,Page1没有具有VideoPress功能的帖子,而Page2有。然后将在第2页加载所需的脚本only. 我遇到了一个问题,因为用户可能会转到第1页,然后第2页的帖子将通过Ajax加载,视频帖子(来自第2页)将中断,因为第一页上没有加载脚本。有没有办法解决这个问题?我不知道该怎么做。