¿Cómo permiten a los usuarios guardar la lista de publicaciones?

3

No te estoy pidiendo que escribas todo el código ni solicites un complemento, te estoy preguntando cómo construir esta función porque no tengo ningún plan en mente para construir esta función.

Este es el requisito: hay muchas publicaciones en el sitio web. Los usuarios registrados (usuarios front-end) deben tener una función para guardar la lista de publicaciones.

Ej:

  • Lista 01: Mis publicaciones favoritas
  • Lista 02: publicaciones relacionadas con blogs
  • Lista 03: ver publicaciones posteriores

Quiero que el usuario permita crear estos tipos de lista. Luego pueden agregar cualquier cantidad de publicaciones. Y estas listas son privadas. Me refiero a que solo el usuario creado puede acceder a la lista.

Esto es algo así como etiquetamos los correos electrónicos en gmail.

¿Qué puedo usar para guardar la lista? No tengo idea de qué puedo usar para ello ... ¿Al menos es posible con WordPress?

    
pregunta I am the Most Stupid Person 06.12.2017 - 08:01

3 respuestas

4

Cuando estoy pensando en UI, algo como esto me viene a la mente.

AlgosimilartieneYouTubeenelvideo.

Cuandoelusuariocompletelaentradayhagaclicenelbotóndeingresaroenviarparacrearunalista,enviaráunasolicitudajaxconelnombredelalistaylaguardarácomounregistroenlatablawp_usermetaconmeta_key_list_user_1ymeta_valuecomotítulodelalista.

Paraagregarpublicacionesaestalista,debeguardarelregistroenlatablawp_postmetaconelvalor_list_post_1enelcampometa_keyyelvalordeumeta_iddelafila_list_user_1enelcampometa_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|+---------+---------+--------------+------------+

Paraobtenertodaslaslistasparaelusuario:

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

Para obtener todas las publicaciones para la 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;
    
respondido por el kierzniak 06.12.2017 - 10:36
3

Puede usar un botón en la parte frontal y guardar la ID de la publicación que se muestra actualmente en la meta del usuario. Aquí hay una manera simple de hacer esto:

Produce un botón en el frente

Necesitas crear un botón en tu single.php (o en la página que quieras) para permitir que el usuario establezca la publicación como favorita. La siguiente plantilla hace esto. La clase like-overlay se utiliza para crear un efecto de carga mientras se procesa la solicitud.

<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"/>

Añadir un evento de clic al botón

Cuando el usuario haga clic en el botón, envíe una solicitud AJAX al servidor y actualice el botón según los resultados. Es posible que deba localizar el script para pasar la URL de descanso y otros datos.

$('#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(){

        }
    });
});

Procesar la solicitud de Ajax utilizando REST-API

Ahora cree una ruta de descanso y procese los datos. Si la ID de la entrada recibida no existe en el meta del usuario, agréguela y devuelva un código exitoso. Si lo hace, elimínelo y deje que su script lo sepa.

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';
    }

}

Puede usar esto como plantilla para generar cualquier botón que guarde datos desde el front-end a la base de datos. No te olvides de sanear los datos y de usar nonce también.

Ahora, por supuesto, todo lo que necesitas es obtener el meta _favorite_posts user cuando quieras mostrarlo.

    
respondido por el Jack Johansson 06.12.2017 - 10:29
2

Yo sugeriría usar tablas personalizadas para mantener las cosas delgadas.

Tiene dos tablas: una tabla de listas y una tabla de publicaciones y las listas a las que pertenecen.

La tabla de listas (llamémosla wp_lists ) se vería así:

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

Podría tener más columnas aquí si las listas tuvieran más datos, como una descripción o un color asociado. Si la tabla comienza a crecer, es posible que desee dividirla en dos tablas, con una tabla separada para las relaciones de lista de usuarios.

Y la tabla de listas de publicaciones (llamémosla wp_post_list ) se vería así:

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

Tal vez quieras una columna de ID, pero no estoy seguro de para qué la necesitarías, ya que las combinaciones post_id / list_id deberían ser todas únicas, ya que las publicaciones no pueden estar en una lista. mas de una vez.

Entonces, cuando alguien crea una lista, la insertaría en wp_lists . Podrían crear tantos como deseen, o podrían limitarlo en PHP al verificar cuántos ya tienen.

Para obtener las listas que pertenecen al usuario actual, solo deberías consultar wp_lists basado en la columna user_id .

Cuando alguien agregue una publicación a una lista, insertará la ID de publicación en wp_post_list junto con la lista a la que pertenece. Cuando desee ver todas las publicaciones de una lista que haría una consulta en función de la columna list_id , coloque los ID resultantes en un WP_Query o get_posts() .

Cuando navegue por publicaciones, querrá mostrar a cuál de las listas de usuarios pertenece también. En ese caso, consultarías wp_post_list en función de post_id , pero JOIN lo a wp_lists y limitará los resultados a aquellos con listas que tengan el ID del usuario actual.

    
respondido por el Jacob Peattie 06.12.2017 - 10:22

Lea otras preguntas en las etiquetas