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.