我正在寻找一种允许网站访问者在我的网站上创建帖子(无需登录)的方法

时间:2019-06-24 20:20:21

标签: php wordpress wordpress-rest-api

我正在寻找一种无需用户登录就可以在我的网站上创建访客帖子的方法。我希望以安全的方式做到这一点,并且尽可能不使用插件。

我尝试使用WP Rest API通过网站前端的表单来创建帖子,并使用现时进行身份验证。但是,在将其创建为非登录用户时遇到了401未经授权的错误。

进行了一些研究,当用户未登录时,似乎无法使用REST API创建帖子。

我确实遇到过有关wp_ajax_nopriv_(action)的提及,但是我找不到任何看起来可靠的最新文档。

这是我找到的最可靠的文档,似乎有点过时了。

WordPress REST API - Allow anyone to POST

https://www.justinsilver.com/technology/wordpress/creating-ajax-functions-in-wordpress/

我在下面包含了我的代码。

createStory() {
    var newStory = {
        'title': $("#title").val(),
        'content': $("#description").val(),
        'excerpt': $("#excerpt").val(),
        'name': $("#name").val(),
        'location': $("#location").val(),
        'status': 'draft' //needed to publish the post, otherwise it is saved as a draft
    };



    $.ajax({
            beforeSend: (xhr) => {
                xhr.setRequestHeader('X-WP-Nonce', siteData.nonce);
            },
            url: siteData.root_url + '/wp-json/wp/v2/helpers-story/',
            type: 'POST',
            data: newStory,
            success: (response) => {
                console.log("New post created");
                console.log(response);
            },
            error: (response) => {
                console.log("Post creation failed");
                console.log(response);
            }
        })
        return false;
    }

这是我收到的回复的一部分。

responseJSON: {code: "rest_cannot_create", message: "Sorry, you are not allowed to create posts as this user.", data: {…}}

responseText: "{"code":"rest_cannot_create","message":"Sorry, you are not allowed to create posts as this user.","data":{"status":401}}

2 个答案:

答案 0 :(得分:0)

感谢@Beneris。我改用了更简单的解决方案。

我能够通过创建自定义REST API端点来解决此问题,该端点不再需要登录用户。因为这是公开发布,并且提交的内容不会立即发布,所以这是可以接受的解决方案。

默认的WP REST API端点似乎需要登录用户才能进行POST / DELETE请求。

答案 1 :(得分:-1)

footer.php

<script>
    var ajax_url = "<?php echo admin_url( 'admin-ajax.php' ); ?>";
</script>

JS部分

var newStory = {
    'action': 'visitor_post',
    'title': $("#title").val(),
    'content': $("#description").val(),
    'excerpt': $("#excerpt").val(),
    'name': $("#name").val(),
    'location': $("#location").val(),
    'status': 'draft' //needed to publish the post, otherwise it is saved as a draft
};

createStory(newStory);

var xhr = null;
function createStory(newStory) {
    if( xhr != null ) {
        xhr.abort();
        xhr = null;
    }

    xhr = $.ajax({
        url: ajax_url,
        timeout: 3600,
        type: "POST",
        cache: false,
        data: newStory,

        beforeSend: function() {
        },
        success: function( data ) {

        },
        error: function( jqXHR, textStatus, errorThrown ) {
            console.log( 'The following error occured: ' + textStatus, errorThrown );
        },
        complete: function( jqXHR, textStatus ) {
        }
    });
}

functions.php

add_action( 'wp_ajax_visitor_post', 'create_visitor_post' );
add_action( 'wp_ajax_nopriv_visitor_post', 'create_visitor_post' );

function create_visitor_post() {
    $user_id = 1; // create separate user for public post and attach all those posts to that user
    $my_query = array(
        'post_title'    => wp_strip_all_tags( $_POST['title'] ),
        'post_content'  => $_POST['content'],
        'post_excerpt'  => $_POST['excerpt'],
        'post_type' => 'post',
        'post_name' => sanitize_title($_POST['name']),
        'post_status'   => $_POST['status'],
        'post_author'   => $user_id
    );
    $new_post = wp_insert_post( $my_query );
    add_post_meta($new_post, 'location', $_POST['location'], true);
}