Soporte » WordPress Avanzado » Conditional tag para cuando el admin no está conectado

  • Resuelto zelarra821

    (@zelarra)


    Buenas tardes.

    A ver. No sé si se podrá hacer esto. Estoy buscando la función que lo haga, pero no doy con lo que quiero.

    Tengo una función que quiero que se aplique solo cuando el usuario logueado sea distinto de admin y editor.

    He probado con current_user_can( ‘administrador’ ), pero nada.

    ¡Gracias!

Viendo 8 respuestas - de la 1 a la 8 (de un total de 8)
  • Moderador kallookoo

    (@kallookoo)

    Hola,
    Primero te comento que current_user_can comprueba las capacidades del usuario no el rol que es lo que tienes puesto en el ejemplo.

    Lo que tienes que hacer es recibir la info del usuario registrado y comprobar el rol.

    Ejemplo:

    
    if ( is_user_logged_in() ) {
    	$user = wp_get_current_user();
    	if ( ! empty( $user->roles ) ) {
    		$roles = $user->roles;
    	}
    }
    

    Te comento que $roles es un array con todos los roles del usuario.

    Enlaces de informacion o aprendizaje:
    https://codex.wordpress.org/Roles_and_Capabilities
    https://developer.wordpress.org/reference/functions/current_user_can
    https://developer.wordpress.org/reference/functions/wp_get_current_user

    • Esta respuesta fue modificada hace 5 años, 6 meses por kallookoo.
    • Esta respuesta fue modificada hace 5 años, 6 meses por kallookoo.
    Iniciador del debate zelarra821

    (@zelarra)

    Hola.

    Gracias por la respuesta. Entiendo lo que dices después de ver lo que me comentas y leer la información adicional que me adjuntas, salvo una parte. Es esta:

    	if ( ! empty( $user->roles ) ) {
    		$roles = $user->roles;
    	}

    Si quisiera adaptarlo a mi caso, supongo que tendría que cambiar roles por administrador, y luego añadir el resto de cógido que tengo, ¿no? Es decir, así:

    	if ( ! empty( $user->administrator) ) {
    		$roles = $user->administrator;
                  echo 'INSERT CODE HERE';
    	}

    Un saludo

    Moderador kallookoo

    (@kallookoo)

    Buenas,
    Por defecto el WordPress devuelve un array con los roles, asi que debes comprobar que en ese array esta el rol que quieres, usando por ejemplo:
    in_array( 'administrator', $user->roles )

    Un ejemplo de un function:

    
    /**
     * Comprueba si el rol existe en el usuario actual
     * que esta logueado
     *
     * @param string $role Nombre del rol.
     *
     * @return bool
     */
    function is_role_in_user( $role ) {
    	/* Comprobamos si la var $role es un string */
    	if ( is_string( $role ) ) {
    		/* Evitamos PHP error si la function no esta definida */
    		if ( function_exists( 'is_user_logged_in' ) ) {
    			/* Comprobamos si el user esta logueado */
    			if ( is_user_logged_in() ) {
    				/* Recibimos la info del actual user */
    				$user = wp_get_current_user();
    				/* Comprobamos si existe el array roles */
    				if ( ! empty( $user->roles ) ) {
    					/* Comprobamos si la var $role esta en el array en modo stricto, WPCS: OK */
    					return in_array( $role, $user->roles, true );
    				}
    			}
    		}
    	}
    	return false;
    }
    
    Iniciador del debate zelarra821

    (@zelarra)

    Hola.

    Mira, vamos a dejarlo aquí. Estoy intentando adaptarlo, pero no soy capaz.

    Muchas gracias.

    Un saludo.

    Moderador kallookoo

    (@kallookoo)

    Como quieres pero no es complicado.
    Si pones tu codigo te puedo ayudar…
    Solo dime donde llamas a la function y poco mas

    Iniciador del debate zelarra821

    (@zelarra)

    A ver, son dos funciones. Quiero que no me «conecte» GTM con WordPress si eres administrador o editor (porque con GTM meto el código de Analytics).

    Y sería estas dos funciones:

    // Añadir el código de Google Tag Manager en el <head>
    add_action( 'wp_head', 'db_google_tag_manager1' );
    function db_google_tag_manager1() { ?>
    
    	<!-- Google Tag Manager -->
    	<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    	new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    	j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    	'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    	})(window,document,'script','dataLayer','INSERTA AQUI EL IDENTIFICADOR DE TU CONTENEDOR');</script>
    	<!-- End Google Tag Manager -->
    
    <?php }
    // Añadir el código de Google Tag Manager code justo  debajo de la apertura de la etiqueta <body>
    add_action( 'wp_footer', 'db_google_tag_manager2' );
    function db_google_tag_manager2() { ?>
    
    	<!-- Google Tag Manager (noscript) -->
    	<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=INSERTA AQUI EL IDENTIFICADOR DE TU CONTENEDOR"
    	height="0" width="0" style="noDisplay"></iframe></noscript>
    	<!-- End Google Tag Manager (noscript) -->
    
    <?php }

    Gracias, y disculpa.

    Moderador kallookoo

    (@kallookoo)

    No pasa nada…
    Este es el codigo con comentarios, los puedes eliminarlos pero no pasarias el WPCS si eliminas los comentarios de las functions

    Tienes que añadirlo al archivo functions.php de tu theme

    Ya diras…

    
    /**
     * Comprueba si el rol existe en el usuario actual que esta logueado
     *
     * @param string|array $role Nombre(s) del rol.
     *
     * @return bool
     */
    function is_role_in_user( $role ) {
    	/* Comprobamos si la var $role es un string */
    	if ( is_string( $role ) ) {
    		/* Evitamos PHP error si la function no esta definida */
    		if ( function_exists( 'is_user_logged_in' ) ) {
    			/* Comprobamos si el user esta logueado */
    			if ( is_user_logged_in() ) {
    				/* Recibimos la info del actual user */
    				$user = wp_get_current_user();
    				/* Comprobamos si existe el array roles */
    				if ( ! empty( $user->roles ) ) {
    					/* Comprobamos si la var $role esta en el array en modo stricto, WPCS: OK */
    					return in_array( $role, $user->roles, true );
    				}
    			}
    		}
    	} elseif ( is_array( $role ) ) { /* Comprobamos si la var $role es un array */
    		foreach ( $role as $r ) {
    			/* Si el rol existes devolvemos verdadero y no comprobamos los otros roles */
    			if ( is_role_in_user( $r ) ) {
    				return true;
    			}
    		}
    	}
    	return false;
    }
    
    /**
     * Añadir el codigo de GTM en el head
     *
     * @return void
     */
    function db_google_tag_manager_heads() {
    	?>
    	<!-- Google Tag Manager -->
    	<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','INSERTA AQUI EL IDENTIFICADOR DE TU CONTENEDOR');</script>
    	<!-- End Google Tag Manager -->
    	<?php
    }
    
    /**
     * Añadir el codigo GTM en el footer (body)
     *
     * @return void
     */
    function db_google_tag_manager_footer() {
    	?>
    	<!-- Google Tag Manager (noscript) -->
    	<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=INSERTA AQUI EL IDENTIFICADOR DE TU CONTENEDOR" height="0" width="0" style="noDisplay"></iframe></noscript>
    	<!-- End Google Tag Manager (noscript) -->
    	<?php
    }
    
    /**
     * Comprobar roles y registrar acciones para añadir los codigos GTM
     *
     * @return  void
     */
    function db_google_tag_manager_init() {
    	/* Por prevencion comprobamos si es estamos en alguna pagina de la administracion */
    	if ( ! is_admin() ) {
    		/* Roles a comprobar */
    		$roles = array( 'administrator', 'editor' );
    		/**
    		 * Si el rol no existe registramos las acciones
    		 * de lo contrario las eliminamos por si estan registradas
    		 */
    		if ( ! is_role_in_user( $roles ) ) {
    			add_action( 'wp_head', 'db_google_tag_manager_heads', 10 );
    			add_action( 'wp_footer', 'db_google_tag_manager_footer', 10 );
    		} else {
    			remove_action( 'wp_head', 'db_google_tag_manager_heads', 10 );
    			remove_action( 'wp_footer', 'db_google_tag_manager_footer', 10 );
    		}
    	}
    }
    add_action( 'init', 'db_google_tag_manager_init', 10 );
    
    • Esta respuesta fue modificada hace 5 años, 6 meses por kallookoo.
    Iniciador del debate zelarra821

    (@zelarra)

    Muchas gracias, de verdad. Es lo que necesitaba. Un saludo.

Viendo 8 respuestas - de la 1 a la 8 (de un total de 8)
  • El debate ‘Conditional tag para cuando el admin no está conectado’ está cerrado a nuevas respuestas.