Como permitir que os usuários salvem a lista de posts?

3

Não estou pedindo para você escrever o código completo ou pedir um plug-in. Estou solicitando uma maneira de criar esse recurso porque não tenho nenhum plano em mente para criar esse recurso.

Esse é o requisito: há muitas postagens no site. Usuários registrados (usuários front-end) devem ter um recurso para salvar a lista de posts.

Ex:

  • Lista 01: meus posts favoritos
  • Lista 02: postagens relacionadas a blogs
  • Lista 03: assista a postagens posteriores

Eu quero que o usuário permita criar esses tipos de lista. Então eles podem adicionar qualquer número de posts. E essas listas são privadas. Quero dizer, apenas o usuário criado pode acessar a lista.

Isso é algo como rotular e-mails no Gmail.

O que posso usar para salvar a lista? Eu não tenho idéia do que posso usar para isso ... Pelo menos isso é possível com o WordPress?

    
por I am the Most Stupid Person 06.12.2017 / 08:01

3 respostas

4

Quando estou pensando na interface do usuário, algo assim está vindo à minha mente.

AlgoparecidotemoYouTubenovídeo.

Quandoousuáriopreencheaentradaeclicanobotãodeinserçãoouenvioparacriarumalista,vocêenviaumasolicitaçãoajaxcomonomedalistaeasalvacomoumregistronatabelawp_usermetacommeta_key_list_user_1emeta_valuecomotítulodalista.

Paraadicionarumapostagemaessalista,salveoregistronatabelawp_postmetacomovalor_list_post_1nocampometa_keyeovalordeumeta_iddalinha_list_user_1nocampometa_value.

wp_usermeta

+----------+---------+--------------+------------+|umeta_id|user_id|meta_key|meta_value|+----------+---------+--------------+------------+|100|1|_list_user_1|List1|+----------+---------+--------------+------------+

wp_postmeta

+---------+---------+--------------+------------+|meta_id|post_id|meta_key|meta_value|+---------+---------+--------------+------------+|1|1|_list_post_1|100|+---------+---------+--------------+------------+

Paraobtertodasaslistasparaousuário:

SELECT*FROM'wp_usermeta'WHERE'user_id'=1AND'meta_key'LIKE"_list_user_%";

Para obter todas as postagens da lista 1:

SELECT *
FROM 'wp_posts'
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE wp_postmeta.'meta_key' LIKE "_list_post_%"
  AND wp_postmeta.'meta_value' = 100;
    
por kierzniak 06.12.2017 / 10:36
3

Você pode usar um botão na frente e salvar o ID da postagem exibida no momento na meta do usuário. Aqui está uma maneira simples de fazer isso:

Saída de um botão na frente

Você precisa criar um botão em single.php (ou qualquer página que quiser) para permitir que o usuário realmente defina a postagem como favorita. O modelo abaixo faz isso. A classe like-overlay é usada para criar um efeito de carregamento enquanto a solicitação está sendo processada.

<div id="like-button" class="like btn btn-default" type="button">
    <span class="fa fa-heart"></span>
    <span class="like-overlay"><i class="fa fa-spin fa-circle-o-notch"></i></span>
</div>
<input type="hidden" value="<?php the_ID(); ?>" id="current-post-id"/>
<input type="hidden" value="<?php echo get_current_user_id(); ?>" id="current-user-id"/>

Adicionar um evento de clique ao botão

Quando o usuário clica no botão, envia uma solicitação AJAX ao servidor e atualiza o botão com base nos resultados. Pode ser necessário localizar o script para passar o URL restante e outros dados.

$('#like-button').on('click',function (e) {
    e.preventDefault();
    $.ajax({
        type: 'GET',
        url: 'http://example.com/wp-json/my_route/v1/ajax_favorite',
        data: { post_id: $('#current-post-id').val(), user_id : $('#current-user-id').val() },
        beforeSend: function() {
            $('#like-button').addClass('active').prop('disabled', true);
        },
        success: function(data){

            $('#like-button').removeClass('active').prop('disabled', false);

            if( data != null ){

                if( data == '400' ) {
                    $('#like-button').removeClass('selected');
                } else if( data == '200') {
                    $('#like-button').addClass('selected');
                }
            }
        },
        error:function(){

        }
    });
});

Processar a solicitação do Ajax usando a API REST

Agora crie uma rota de descanso e processe os dados. Se a ID de postagem recebida não existir na meta do usuário, adicione-a e retorne um código de sucesso. Em caso afirmativo, remova-o e informe seu script.

add_action( 'rest_api_init', 'my_rest_routes');
function my_rest_routes() {
    // Path to ajax like function
    register_rest_route(
        'my_route/v1',
        '/ajax_favorite/',
        array(
            'methods' => 'GET',
            'callback' => 'ajax_favorite'
        )
    );
}

function ajax_favorite(){

    // If the ID is not set, return
    if(!isset($_GET['post_id']) || !isset($_GET['user_id'])){
        return $data['status'] = '500';
    }

    // Store user and product's ID
    $post_id   = sanitize_text_field($_GET['post_id']);
    $user_id   = sanitize_text_field($_GET['user_id']);
    $user_meta = get_user_meta($user_id,'_favorite_posts',false);

    // Check if the post is favorited or not
    if( in_array( $post_id, $user_meta ) ){
        delete_user_meta($user_id,'_favorite_posts',$post_id);
        return $data['status'] = '400';
    } else {
        add_user_meta($user_id,'_favorite_posts',$post_id);
        return $data['status'] = '200';
    }

}

Você pode usar isso como um modelo para gerar qualquer botão que salve dados do front-end para o banco de dados. Não se esqueça de higienizar os dados e use o nonce também.

Agora, claro, tudo que você precisa é obter a meta de usuário _favorite_posts sempre que quiser exibi-la.

    
por Jack Johansson 06.12.2017 / 10:29
2

Sugiro usar tabelas personalizadas para manter as coisas enxutas.

Tenha duas tabelas: uma tabela de listas e uma tabela de publicações e quais listas elas pertencem.

A tabela de listas (vamos chamá-lo de wp_lists ) seria semelhante a:

+----+---------+----------------+
| id | user_id |      name      |
+----+---------+----------------+
|  1 |       2 | My list        |
|  2 |       2 | My second list |
+----+---------+----------------+

Você pode ter mais colunas aqui se as listas tiverem mais dados, como uma descrição ou uma cor associada. Se a tabela começar a crescer, talvez você queira dividi-la em duas tabelas, com uma tabela separada para os relacionamentos da lista de usuários.

E a tabela de postagens de listas (vamos chamá-lo de wp_post_list ) seria semelhante a:

+---------+---------+
| post_id | list_id |
+---------+---------+
|       2 |       2 |
|       3 |       2 |
|       2 |       1 |
+---------+---------+

Talvez você queira uma coluna de ID, mas não tenho certeza do que precisa, pois as combinações post_id / list_id devem ser únicas, pois as postagens não podem estar em uma lista mais de uma vez.

Então, quando alguém cria uma lista, você a insere em wp_lists . Eles poderiam criar quantos quiserem, ou você poderia limitá-lo em PHP, verificando quantos já conseguiram.

Para obter as listas que pertencem ao usuário atual, basta consultar wp_lists com base na coluna user_id .

Quando alguém adiciona uma postagem a uma lista, você insere o ID da postagem em wp_post_list ao lado da lista à qual pertence. Quando quiser ver todas as postagens em uma lista que você consultaria com base na coluna list_id , coloque os IDs resultantes em WP_Query ou get_posts() .

Ao pesquisar postagens, você quer mostrar a qual das listas do usuário ele já pertence também. Nesse caso, você consultaria wp_post_list com base no post_id , mas JOIN to wp_lists e limitaria os resultados aos que tivessem listas com o ID do usuário atual.

    
por Jacob Peattie 06.12.2017 / 10:22

Tags