Я ищу способ разрешить посетителям сайта создавать посты на моем сайте (без входа в систему) - PullRequest
0 голосов
/ 24 июня 2019

Я ищу способ разрешить создание гостевых постов на моем веб-сайте без необходимости входа пользователей. Я бы предпочел сделать это безопасным способом, без плагинов, если это возможно.

Я пытался использовать WP Rest API для создания публикации с помощью формы на веб-сайте, используя одноразовый номер для аутентификации. Тем не менее, я получил 401 несанкционированную ошибку при создании этого как не вошедшего в систему пользователя.

Провел некоторые исследования, и кажется, что API REST можно использовать для создания сообщений, когда пользователь не вошел в систему.

Я встречал упоминания о wp_ajax_nopriv_ (action), но я не смог найти ни одной недавней документации, которая казалась надежной.

Это самая надежная документация, которую я нашел, и она немного устарела.

WordPress REST API - Разрешить кому-либо 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 голосов
/ 27 июня 2019

Спасибо @Beneris.Вместо этого я использовал более простое решение.

Я смог решить эту проблему, создав настраиваемую конечную точку API REST, которая больше не требовала входа в систему.Так как это для общедоступной публикации, и отправленный контент не публикуется немедленно, это было приемлемым решением.

Кажется, что для конечных точек API WP REST по умолчанию требуется зарегистрированный пользователь для запросов POST / DELETE.

0 голосов
/ 25 июня 2019

footer.php

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

JS part

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);
}
...