php - usuarios - Restringir el estado de la orden de woocommerce por rol
qué función de wordpress utilizamos para crear un nuevo rol de usuario (1)
Intento crear un flujo de trabajo donde los gerentes de tienda puedan crear pedidos y marcarlos como "pago pendiente", "procesamiento", pero solo los administradores pueden marcar pedidos como "completo", "fallido", etc.
Lo más cerca que he encontrado fue en esta publicación:
<?php
if ( current_user_can(! ''administrator'' ) ) {
$args = array( ''post_type'' => ''post'', ''post_status'' => ''publish, pending,
draft'' );
} else {
$args = array( ''post_type'' => ''post'', ''post_status'' => ''publish'' );
}
$wp_query = new WP_Query($args); while ( have_posts() ) : the_post(); ?>
CONTENT
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
Esto debería funcionar para publicaciones regulares de WP (aunque no lo he probado) pero no estoy seguro de cómo aplicarlo a WooCommerce. Mi mejor estimación es:
<?php
if ( current_user_can(! ''administrator'' ) ) {
$args = array( ''post_type'' => ''shop_order'', ''order_status'' => ''complete,failed'' );
} else {
$args = array( ''post_type'' => ''shop_order'', ''post_status'' => ''pending-payment,processing'' );
}
$wp_query = new WP_Query($args); while ( have_posts() ) : the_post(); ?>
CONTENT
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
¡Pero estoy recibiendo todo tipo de errores con esto! Tampoco estoy seguro de si solo se aplicaría a la pantalla de orden de edición y no a la lista desplegable de acciones masivas de la tabla de órdenes de administración.
¡Cualquier ayuda sería realmente apreciada!
La función condicional current_user_can()
no se recomienda con roles de usuario:
Si bien se respalda en parte la verificación de funciones particulares en lugar de una capacidad, se desaconseja esta práctica ya que puede producir resultados poco confiables.
En su lugar, puede obtener el usuario actual y sus roles (ya que un usuario puede tener muchos). También el estado de los pedidos es muy específico en woocommerce (todos comienzan por wc-
y deberían estar en un array si hay muchos).
Entonces el código correcto debería ser:
<?php
// get current user roles (if logged in)
if( is_user_logged_in() ){
$user = wp_get_current_user();
$user_roles = $user->roles;
} else $user_roles = array();
// GET Orders statuses depending on user roles
if ( in_array( ''shop_manager'', $user_roles ) ) { // For "Shop Managers"
$statuses = array( ''wc-pending'',''wc-processing'' );
} elseif ( in_array( ''administrator'', $user_roles ) ) { // For admins (all statuses)
$statuses = array_keys(wc_get_order_statuses());
} else
$statuses = array();
$loop = new WP_Query( array(
''post_type'' => ''shop_order'',
''posts_per_page'' => -1,
''post_status'' => $statuses
) );
if ( $loop->have_posts() ):
while ( $loop->have_posts() ):
$loop->the_post();
?>
<?php echo $loop->post->ID .'', ''; // Outputting Orders Ids (just for test) ?>
<?php
endwhile;
endif;
wp_reset_postdata();
?>
Probado y funciona