<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>DecodeCMS</title>
	<atom:link href="https://decodecms.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://decodecms.com/</link>
	<description>Tutoriales código WordPress </description>
	<lastBuildDate>Mon, 21 Apr 2025 21:56:32 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>
	<item>
		<title>Quitar el menú de WooComerce en la administración de WordPress para ciertos usuarios</title>
		<link>https://decodecms.com/quitar-el-menu-de-woocomerce-en-la-administracion-de-wordpress-para-ciertos-usuarios/</link>
					<comments>https://decodecms.com/quitar-el-menu-de-woocomerce-en-la-administracion-de-wordpress-para-ciertos-usuarios/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Mon, 21 Apr 2025 21:56:32 +0000</pubDate>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[woocommerce]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1569</guid>

					<description><![CDATA[<p>Anteriormente habíamos visto como quitar la opción de edición de archivos en la administración, incluso para usuarios con el rol de administrador. En este artículo veremos como hacerlo con las opciones de configuración de WooCommerce. &#160; Resultado Final Al final queremos obtener algo similar a la siguiente imagen, pero no sólo quitar visualmente la opción [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/quitar-el-menu-de-woocomerce-en-la-administracion-de-wordpress-para-ciertos-usuarios/">Quitar el menú de WooComerce en la administración de WordPress para ciertos usuarios</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Anteriormente habíamos visto como <strong>quitar la opción</strong> de <a href="https://decodecms.com/deshabilitar-el-editor-de-archivos-para-temas-y-plugins-en-wordpress/">edición de archivos en la administración</a>, incluso para usuarios con el rol de administrador. En este artículo v<strong>eremos como hacerlo con las opciones de configuración de WooCommerce</strong>. <span id="more-1569"></span></p>
<p>&nbsp;</p>
<h2>Resultado Final</h2>
<p>Al final queremos obtener algo similar a la siguiente imagen, pero no sólo quitar visualmente la opción sino también quitar el acceso directo desde la Url.</p>
<div class="borde-img">
<img decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Quitar%20menu%CC%81%20de%20WooComerce%20en%20la%20administracio%CC%81n%20del%20sitio%20para%20ciertos%20usuarios/quitar-menu-woocommerce-wordpress.jpg"  title="Ocultar opciones de WooCommerce" alt="Ocultar menú WooCommerce Administración WordPress" width="148" height="172" />
</div>
<p>&nbsp;</p>
<h2>Código para quitar el acceso a las opciones de WooCommerce</h2>
<p>Adicional a ocultar el menú también se limita el acceso desde la barra de direcciones.</p>
<div class="alert alert-success">
Puedes agregar este código en el archivo functions.php de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/">tema hijo</a> o usando algún <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">plugin de Snippets</a>.
</div>
<pre><code class="language-php">add_action( &apos;init&apos;, &apos;hide_woocommerce_settings_page&apos; );

function hide_woocommerce_settings_page() :void{
	// obtenemos el usuario actual
	$usuario_actual = wp_get_current_user();

	// usuarios o roles que no deber&iacute;an ver los men&uacute;s de WooCommerce
	$usuarios_restringidos = [ &apos;admin&apos;, &apos;crojas&apos; ]; // Reemplaza con los nombres de usuario

	// Verificamos si el usuario actual est&aacute; restringido
	if ( in_array( $usuario_actual-&gt;user_login, $usuarios_restringidos ) ) {

		// Eliminamos el men&uacute; principal de WooCommerce
		add_action( &apos;admin_menu&apos;, function () {
			remove_menu_page( &apos;woocommerce&apos; ); // Men&uacute; principal de WooCommerce
		}, 99 );

		// Redirigir si intentan acceder a p&aacute;ginas espec&iacute;ficas de WooCommerce
		add_action( &apos;admin_init&apos;, function () {
			$pagina_actual = isset( $_GET[&apos;page&apos;] ) ? sanitize_text_field( $_GET[&apos;page&apos;] ) : &apos;&apos;;
			if ( strpos( $pagina_actual, &apos;wc-&apos; ) === 0 ) { // Verifica si la p&aacute;gina comienza con &quot;wc-&quot;
				wp_redirect( admin_url() );
				exit;
			}
		} );
	}
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Usamos el Hook <em>init</em> que hace referencia a la función <em>hide_woocommerce_settings_page</em></li>
<li>Dentro de esta función comprobamos el usuario actual, si el usuario actual no debe ver la opción de menú entonces ingresará a una condicional</li>
<li>Dentro de la condicional agregamos Hooks para remover el menú, <em>admin_menu</em></li>
<li>En el otro Hook <em>admin_init</em> comprobamos la página actual y realizamos una redirección, esto en el caso de que se trate de acceder directamente conociendo la Url</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como hemos podido comprobar, es posible que en algunos proyectos <strong>no todos los usuarios que tienen acceso al backend del sitio deberían tener la opción de acceder a las configuraciones de WooCommerce</strong>, en este caso podemos adaptar este código para ocultar estas opciones de ciertos usuarios.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/quitar-el-menu-de-woocomerce-en-la-administracion-de-wordpress-para-ciertos-usuarios/">Quitar el menú de WooComerce en la administración de WordPress para ciertos usuarios</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/quitar-el-menu-de-woocomerce-en-la-administracion-de-wordpress-para-ciertos-usuarios/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Eliminar automáticamente las imágenes al borrar una entrada</title>
		<link>https://decodecms.com/eliminar-automaticamente-las-imagenes-al-borrar-una-entrada/</link>
					<comments>https://decodecms.com/eliminar-automaticamente-las-imagenes-al-borrar-una-entrada/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Wed, 19 Mar 2025 15:23:50 +0000</pubDate>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[mejoras]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1566</guid>

					<description><![CDATA[<p>En un artículo anterior habíamos visto como eliminar automáticamente las imágenes de un producto de WooCommerce, sin embargo en este caso veremos como hacerlo para entradas incluyendo las imágenes que forman parte del contenido de la entrada. &#160; Generalidades Cuando creamos una entrada podemos agregar una imagen destacada, pero también imágenes como parte del contenido. [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/eliminar-automaticamente-las-imagenes-al-borrar-una-entrada/">Eliminar automáticamente las imágenes al borrar una entrada</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En un artículo anterior habíamos visto como <a href="https://decodecms.com/eliminar-automaticamente-las-imagenes-al-borrar-un-producto-de-woocommerce/">eliminar automáticamente las imágenes de un producto de WooCommerce</a>, sin embargo en este caso veremos <strong>como hacerlo para entradas</strong> incluyendo las <strong>imágenes que forman parte del contenido</strong> de la entrada.<span id="more-1566"></span></p>
<p>&nbsp;</p>
<h2>Generalidades</h2>
<p>Cuando creamos una entrada podemos agregar una imagen destacada, pero también <strong>imágenes como parte del contenido</strong>.<br />
La idea es que al eliminar la entrada también se eliminen las imágenes asociadas.</p>
<div class="borde-img">
<img fetchpriority="high" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Eliminar%20automa%CC%81ticamente%20las%20ima%CC%81genes%20al%20borrar%20una%20entrada/img-resultado-final.jpg"  title="Eliminar imágenes entrada" alt="Entrada con imágenes" width="600" height="393" />
</div>
<p>&nbsp;</p>
<h2>Código para eliminar las imágenes de una entrada al eliminar al entrada</h2>
<p>Hay que tener en cuenta que este código <strong>tendrá efecto sólo cuando la entrada se haya eliminado completamente</strong>, es decir <strong>eliminado de la papelera</strong>.</p>
<div class="alert alert-warning">
Ten en cuenta que si la imagen se usa en otra entrada o página no estará disponible ya que habrá sido eliminada físicamente.
</div>
<pre><code class="language-php">add_action( &apos;before_delete_post&apos;, &apos;delete_all_post_images&apos; );

function delete_all_post_images( $post_id ) {

	if ( get_post_type( $post_id ) !== &apos;post&apos; ) {
		return;
	}

	// Borrar imagen destacada
	$thumbnail_id = get_post_thumbnail_id( $post_id );
	if ( $thumbnail_id ) {
        wp_delete_attachment( $thumbnail_id, true );
	}

	// Contenido de entrada
	$post_content = get_post_field( &apos;post_content&apos;, $post_id );

	preg_match_all( &apos;/&lt;img[^&gt;]+src=&quot;([^&quot;&gt;]+)&quot;/&apos;, $post_content, $matches );

	$image_urls = $matches[1];

	foreach ( $image_urls as $image_url ) {
		// Obtener el ID de la imagen
		$attachment_id = attachment_url_to_postid( $image_url );
		if ( ! $attachment_id ) {
			// Si no se encuentra, intenta sin las dimensiones
			$image_url_no_dims = preg_replace( &apos;/-\d+x\d+(?=\.\w+$)/&apos;, &apos;&apos;, $image_url );
			$attachment_id = attachment_url_to_postid( $image_url_no_dims );
		}
		if ( $attachment_id ) {
			wp_delete_attachment( $attachment_id, true );
		}
	}
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior</p>
<ul class="descode">
<li>
    Utilizamos el Hook <em>before_delete_post</em> que hace referencia a la función <em>delete_all_post_images</em>
</li>
<li>
    Dentro de esa función hacemos una comprobación si el tipo de contenido es una entrada
</li>
<li>
    Obtenemos y borramos la imagen destacada de la entrada
</li>
<li>
    Para el contenido de la entrada usamos una expresión regular para obtener todas las URLs de imágenes usadas
</li>
<li>
    Buscamos si hay algún medio asociado a dicha URL y obtenemos su ID
</li>
<li>
    Si no existe buscamos la URL quitando el texto de las dimensiones y obtenemos su ID
</li>
<li>
    Finalmente borramos la imagen asociada a esa URL
</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar es posible <strong>eliminar todas las imágenes asociadas a una entrada</strong>, imagen destacada e imágenes del contenido, <strong>al eliminar una entrada</strong>, en este artículo hemos visto como realizar esto de manera simple a través de código.</p>
<p>La entrada <a href="https://decodecms.com/eliminar-automaticamente-las-imagenes-al-borrar-una-entrada/">Eliminar automáticamente las imágenes al borrar una entrada</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/eliminar-automaticamente-las-imagenes-al-borrar-una-entrada/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Ocultar precios de productos a visitantes en WooCommerce</title>
		<link>https://decodecms.com/ocultar-precios-de-productos-a-visitantes-en-woocommerce/</link>
					<comments>https://decodecms.com/ocultar-precios-de-productos-a-visitantes-en-woocommerce/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Tue, 04 Mar 2025 16:24:03 +0000</pubDate>
				<category><![CDATA[Plugins]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<category><![CDATA[woocommerce]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1564</guid>

					<description><![CDATA[<p>En un artículo anterior habíamos visto como ocultar la compra de ciertos productos en WooCommerce, en este artículo veremos un código similar, evitando que usuarios visitantes vean precios en el sitio. &#160; Resultado Final Al final queremos obtener algo similar a como se muestra en la imagen: En el detalle de producto: &#160; En la [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/ocultar-precios-de-productos-a-visitantes-en-woocommerce/">Ocultar precios de productos a visitantes en WooCommerce</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En un artículo anterior habíamos visto como <a href="https://decodecms.com/ocultar-compra-de-ciertos-productos-en-woocommerce/">ocultar la compra de ciertos productos en WooCommerce</a>, en este artículo veremos un código similar, <strong>evitando que usuarios visitantes vean precios en el sitio</strong>.<span id="more-1564"></span></p>
<p>&nbsp;</p>
<h2>Resultado Final</h2>
<p>Al final queremos obtener algo similar a como se muestra en la imagen:</p>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el detalle de producto:</p>
<div class="borde-img">
<img decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Ocultar%20precios%20de%20productos%20a%20usuarios%20visitantes/ocultar-precios-detalle.jpg"  title="Vista de detalle de producto, ocultar precios" alt="Ocultar precio y mensaje de conexión" width="746" height="395" />
</div>
<p>&nbsp;<br />
<i class="fa fa-long-arrow-right" aria-hidden="true"></i> En la lista de productos:</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Ocultar%20precios%20de%20productos%20a%20usuarios%20visitantes/ocultar-precios-loop.jpg"  title="Ocultar precio en lista de productos" alt="Lista de productos, ocultar precio, vista tienda" width="600" height="395" />
</div>
<p>&nbsp;</p>
<h2>Código para ocultar los precios a usuarios visitantes</h2>
<p>Puedes agregar el siguiente código como parte del archivo <em>functions.php</em> de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/" rel="noopener">tema hijo</a>, o usando algún <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">plugin de Snippets</a>.</p>
<pre><code class="language-php">// Deshabilitar la compra de productos
add_filter( &apos;woocommerce_is_purchasable&apos;, &apos;deshabilitar_compras_para_visitantes&apos;, 10, 2 );
function deshabilitar_compras_para_visitantes( $purchasable, $product ) {
	if ( ! is_user_logged_in() ) {
		return false;
	}

	return $purchasable;
}

// Ocultar precios
add_filter( &apos;woocommerce_get_price_html&apos;, &apos;ocultar_precios_para_visitantes&apos;, 10, 2 );
function ocultar_precios_para_visitantes( $price, $product ) {
	if ( ! is_user_logged_in() ) {
		if ( is_product() ) {
			return &apos;&lt;a href=&quot;&apos; . esc_url( wc_get_page_permalink( &apos;myaccount&apos; ) ) . &apos;&quot;&gt;Inicia sesi&oacute;n para ver los precios y comprar&lt;/a&gt;&apos;;
		} else {
			return &apos;&apos;;
		}
	}

	return $price;
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Usamos el Hook <em>woocommerce_is_purchasable</em> para hacer referencia a la función <em>deshabilitar_compras_para_visitantes</em></li>
<li>Dentro de la función comprobamos si el usuario esta o no conectado, de acuerdo a eso devolvemos si el producto se puede comprar o no</li>
<li>En la otra parte del código se hace referencia al Hook <em>woocommerce_get_price_html</em>, que hace referencia a la función <em>ocultar_precios_para_visitantes</em></li>
<li>Se comprueba igualmente si el usuario esta o no conectado, y se muestra un mensaje con enlace en caso se encuentre en la página de producto</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar, si necesitas tener en tu sitio los <strong>precios ocultos y sólo mostrarlos para usuarios registrados</strong>, puedes <strong>evitar usar un plugin y hacerlo directamente a través de código</strong>, tal como hemos visto en este artículo.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/ocultar-precios-de-productos-a-visitantes-en-woocommerce/">Ocultar precios de productos a visitantes en WooCommerce</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/ocultar-precios-de-productos-a-visitantes-en-woocommerce/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Deshabilitar Información de Usuarios de la REST API de WordPress</title>
		<link>https://decodecms.com/deshabilitar-informacion-de-usuarios-de-la-rest-api-de-wordpress/</link>
					<comments>https://decodecms.com/deshabilitar-informacion-de-usuarios-de-la-rest-api-de-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 21:10:12 +0000</pubDate>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<category><![CDATA[seguridad]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1562</guid>

					<description><![CDATA[<p>En un artículo anterior habíamos visto como deshabilitar completamente la REST API de WordPress, sin embargo en algunos casos es posible que sólo necesitemos eliminar ciertos endpoints como los del usuario. &#160; Generalidades WordPress por defecto habilita la funcionalidad de REST API, el endpoint de usuarios podría ser explotado por un atacante ya que expone [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/deshabilitar-informacion-de-usuarios-de-la-rest-api-de-wordpress/">Deshabilitar Información de Usuarios de la REST API de WordPress</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En un artículo anterior habíamos visto como <a href="https://decodecms.com/deshabilitar-la-rest-api-de-wordpress/">deshabilitar completamente la REST API de WordPress</a>, sin embargo en algunos casos es posible que <strong>sólo necesitemos eliminar ciertos endpoints</strong> como los del usuario.<span id="more-1562"></span></p>
<p>&nbsp;</p>
<h2>Generalidades</h2>
<p>WordPress por defecto habilita la <a href="https://decodecms.com/como-usar-la-rest-api-de-wordpress/">funcionalidad de REST API</a>, el endpoint de usuarios podría ser explotado por un atacante ya que expone a parte de la información de los usuarios.</p>
<p>Si usamos la siguiente URL: https://tusitio.com/wp-json/wp/v2/users , veremos un listado de usuarios tal como se muestra en la siguiente imagen.</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Deshabilitar%20Informacio%CC%81n%20de%20Usuarios%20de%20la%20REST%20API%20de%20WordPress/obtener-usuarios-wordpress-rest-api.png"  title="REST API lista usuarios" alt="Lista usuarios REST API" width="600" height="478" />
</div>
<p>&nbsp;<br />
Aqui se muestra <strong>el nombre del usuario</strong> que podría ser aprovechado para un ataque de fuerza bruta intentando adivinar la clave.</p>
<p>&nbsp;</p>
<h2>Código PHP para eliminar el endpoint de usuarios</h2>
<p>La opción más práctica sería <strong>directamente quitar el endpoint de usuarios de la API REST de WordPress</strong>, podemos hacerlo usando el siguiente código como parte del archivo functions.php de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/">tema hijo</a> o usando algún <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">plugin de Snippets</a>.</p>
<pre><code class="language-php">add_filter( &apos;rest_endpoints&apos;, function( $endpoints ) {
    if ( isset( $endpoints[&apos;/wp/v2/users&apos;] ) ) {
        unset( $endpoints[&apos;/wp/v2/users&apos;] );
    }
    if ( isset( $endpoints[&apos;/wp/v2/users/(?P&lt;id&gt;[\d]+)&apos;] ) ) {
        unset( $endpoints[&apos;/wp/v2/users/(?P&lt;id&gt;[\d]+)&apos;] );
    }
    return $endpoints;
}, 10, 1 );
</code></pre>
<p>&nbsp;<br />
<i class="fa fa-long-arrow-right" aria-hidden="true"></i>  En el código anterior:</p>
<ul class="descode">
<li>En el código anterior usamos el <a href="https://decodecms.com/los-hooks-wordpress-usarlos/">Hook</a> <em>rest_endpoints</em> que hacer referencia a la función anónima</li>
<li>Dentro de la función verificamos si se trata de un endpoint de usuarios, tanto para la lista como para usuarios individuales, para verificar esto último se usan expresiones regulares</li>
<li>Si se cumple alguna de estas condiciones entonces se elimina del array de endpoints con la función <em>unset</em></li>
<li>Finalmente retornamos los endpoints restantes</li>
</ul>
<p>&nbsp;<br />
Tras agregar este código y tratar de acceder veremos algo similar a lo siguiente:</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Deshabilitar%20Informacio%CC%81n%20de%20Usuarios%20de%20la%20REST%20API%20de%20WordPress/restriccion-url-usuarios-functions.png"  title="Mensaje luego de añadir código PHP" alt="Mensaje endpoint restringido" width="739" height="235" />
</div>
<p>&nbsp;</p>
<h2>Restricción de Endpoint por .htaccess</h2>
<p>La otra opción para <strong>restringir el acceso a la URL del endpoint</strong> es hacerlo a través del archivo .htaccess, puedes usar el siguiente código:</p>
<pre><code class="language-php">
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/wp-json/wp/v2/users [NC]
RewriteRule .* - [F,L]
&lt;/IfModule&gt;
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> Puedes agregar este código al inicio de tu archivo .htaccess</p>
<p>&nbsp;</p>
<p>Tras agregar este código verás una restricción de .htaccess, tal como se muestra en la siguiente imagen:</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Deshabilitar%20Informacio%CC%81n%20de%20Usuarios%20de%20la%20REST%20API%20de%20WordPress/restriccion-url-usuarios-htaccess.png"  title="URL bloqueada .htaccess" alt="Mensaje .htaccess" width="579" height="179" />
</div>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar, es posible mejorar la seguridad de tu sitio <strong>conservando ciertos endpoints</strong> de la REST API de WordPress y <strong>limitar otros para que no sean accesibles</strong>, en este artículo hemos visto como realizarlo a través de código.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/deshabilitar-informacion-de-usuarios-de-la-rest-api-de-wordpress/">Deshabilitar Información de Usuarios de la REST API de WordPress</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/deshabilitar-informacion-de-usuarios-de-la-rest-api-de-wordpress/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Evitar la descarga directa de archivos en WordPress</title>
		<link>https://decodecms.com/evitar-la-descarga-directa-de-archivos-en-wordpress/</link>
					<comments>https://decodecms.com/evitar-la-descarga-directa-de-archivos-en-wordpress/#comments</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Tue, 21 Jan 2025 17:00:01 +0000</pubDate>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<category><![CDATA[seguridad]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1558</guid>

					<description><![CDATA[<p>En este artículo veremos como evitar la descarga directa de archivos de WordPress y que sólo sean accesibles por usuarios con un determinado rol en WordPress, veremos como hacerlo a través de código. &#160; Resultado Final Al final queremos obtener algo similar a la siguiente imagen cuando un usuario que esta conectado trata de conectarse [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/evitar-la-descarga-directa-de-archivos-en-wordpress/">Evitar la descarga directa de archivos en WordPress</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En este artículo veremos <strong>como evitar la descarga directa de archivos de WordPress</strong> y que sólo sean accesibles por usuarios con un determinado rol en WordPress, veremos como hacerlo a través de código.<span id="more-1558"></span></p>
<p>&nbsp;</p>
<h2>Resultado Final</h2>
<p>Al final queremos obtener algo similar a la siguiente imagen cuando un usuario que esta conectado trata de conectarse y no tiene un rol que permite descargar el archivo.</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Evitar%20la%20descarga%20directa%20de%20archivos%20en%20WordPress/acceso-restringido-descarga-archivo.png"  title="Resultado final descarga archivo" alt="Acceso restringido descarga archivo por usuario" width="634" height="248" />
</div>
<p>&nbsp;</p>
<h2>Generalidades</h2>
<p>Existen plugins como <a href="https://es.wordpress.org/plugins/prevent-direct-access/" rel="noopener" target="_blank">Prevent Direct Access</a> que restringen la descarga de archivos de medios de WordPress, sin embargo en este artículo veremos como realizarlo a través de código.</p>
<p>Protegeremos cualquier archivo <em>pdf, zip, docx, jpg, png</em> que se suba a WordPress desde la opción de medios y que además <strong>tenga al inicio del nombre el texto de «protegido_»</strong></p>
<p>&nbsp;</p>
<h2>Código .htaccess para restringir la descarga de archivos protegidos</h2>
<p>Usaremos un código al inicio del archivo .htaccess para que si el recurso solicitado en la ruta de uploads empiece con el texto de &#8216;protegido_XXXXX&#8217; entonces le pase el control a WordPress a través del punto de entrada index.php</p>
<p>De esta forma una vez en WordPress podremos decidir si el usuario tiene o no el rol que le permite ver ese archivo.</p>
<pre><code class="language-php">&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /

# Redirigir archivos que comienzan con &quot;protegido_&quot; a index.php
RewriteRule ^wp-content/uploads/.*protegido_.*\.(pdf|zip|docx|jpg|png)$ index.php [L]
&lt;/IfModule&gt;
</code></pre>
<p>&nbsp;</p>
<h2>Código PHP para evaluar si el usuario puede descargar o no el archivo</h2>
<p>Puedes agregar el siguiente código como parte del archivo functions.php de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/">tema hijo</a>, usar algún plugin de <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">Snippets</a> o como parte de un plugin personalizado.</p>
<pre><code class="language-php">add_action( &apos;init&apos;, &apos;restringir_acceso_a_archivos&apos; );

function restringir_acceso_a_archivos(): void {
	// Obtener la URL actual solicitada
	$request_uri = $_SERVER[&apos;REQUEST_URI&apos;];

	// Verificar si la URL solicitada pertenece a la carpeta protegida y el archivo comienza con &quot;protegido_&quot;
	if ( preg_match( &apos;#/wp-content/uploads/\d{4}/\d{2}/protegido_.*\.(pdf|zip|docx|jpg|png)$#i&apos;, $request_uri ) ) {

		// Verificar si el usuario ha iniciado sesi&oacute;n
		if ( ! is_user_logged_in() ) {
			wp_redirect( home_url( &apos;/wp-login.php?redirect_to=&apos; . urlencode( $request_uri ) ) );
			exit;
		}

		// Obtener el usuario actual y sus roles
		$current_user = wp_get_current_user();

		// Definir los roles permitidos (ajusta seg&uacute;n tus necesidades)
		$roles_permitidos = array( &apos;administrator&apos;, &apos;editor&apos; );

		// Verificar si el usuario tiene el rol adecuado
		if ( ! array_intersect( $roles_permitidos, $current_user-&gt;roles ) ) {
			wp_die( &apos;No tienes permisos para acceder a este recurso.&apos;, &apos;Acceso denegado&apos;, array( &apos;response&apos; =&gt; 403 ) );
		}

		// Obtener la ruta completa del archivo
		$file_path = ABSPATH . parse_url( $request_uri, PHP_URL_PATH );

		// Verificar si el archivo existe
		if ( file_exists( $file_path ) ) {
			// Forzar la descarga del archivo
			header( &apos;Content-Type: application/octet-stream&apos; );
			header( &apos;Content-Disposition: attachment; filename=&quot;&apos; . basename( $file_path ) . &apos;&quot;&apos; );
			header( &apos;Expires: 0&apos; );
			header( &apos;Content-Length: &apos; . filesize( $file_path ) );
			readfile( $file_path );
			exit;
		} else {
			wp_die( &apos;El archivo solicitado no existe.&apos;, &apos;Archivo no encontrado&apos;, array( &apos;response&apos; =&gt; 404 ) );
		}
	}
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Usamos el <a href="https://decodecms.com/los-hooks-wordpress-usarlos/">hook</a> <em>init</em> de WordPress que hace referencia a la función <em>restringir_acceso_a_archivos</em></li>
<li>Comprobamos si la URL actual cumple el patrón de encontrarse en la URL de descarga y si el nombre del archivo empieza con &#8216;protegido_&#8217;</li>
<li>Si cumple estas condiciones entonces comprobamos que debe ser un usuario conectado</li>
<li>También comprobamos que el usuario conectado tenga alguno de los roles de: administrator o editor</li>
<li>Si se cumplen todas esas condiciones entonces accedemos al archivo y forzamos la descarga</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>En este artículo hemos visto como <strong>restringir la descarga directa de archivos que cumplen determinadas condiciones</strong>, además que <strong>sólo sean accesibles por usuarios de un determinado rol</strong> y hemos visto como hacerlo a través de código.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/evitar-la-descarga-directa-de-archivos-en-wordpress/">Evitar la descarga directa de archivos en WordPress</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/evitar-la-descarga-directa-de-archivos-en-wordpress/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Establecer ítems de menú sólo para usuarios registrados</title>
		<link>https://decodecms.com/establecer-items-de-menu-solo-para-usuarios-registrados/</link>
					<comments>https://decodecms.com/establecer-items-de-menu-solo-para-usuarios-registrados/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Tue, 14 Jan 2025 20:43:29 +0000</pubDate>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1556</guid>

					<description><![CDATA[<p>WordPress por defecto no tiene una funcionalidad para establecer ítems de menú privados, tal como lo hace con las páginas o entradas, en este artículo veremos como agregar esta funcionalidad a través de código. &#160; Resultado Final Al final queremos obtener algo similar a lo que se muestra en la siguiente imagen para cada ítem [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/establecer-items-de-menu-solo-para-usuarios-registrados/">Establecer ítems de menú sólo para usuarios registrados</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>WordPress por defecto no tiene una funcionalidad para <strong>establecer ítems de menú privados</strong>, tal como lo hace con las páginas o entradas, en este artículo veremos como agregar esta funcionalidad a través de código.<span id="more-1556"></span></p>
<p>&nbsp;</p>
<h2>Resultado Final</h2>
<p>Al final queremos obtener algo similar a lo que se muestra en la siguiente imagen para cada ítem de menú.</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Establecer%20i%CC%81tems%20de%20menu%CC%81%20so%CC%81lo%20para%20usuarios%20registrados/resultado-final-opcion-item-menu-privado.png"  title="Establecer si ítem de menú será visible sólo usuario registrado" alt="ítem de menú visible sólo usuario registrado" width="428" height="366" />
</div>
<p>&nbsp;</p>
<h2>Código para mostrar un campo adicional en la administración de ítems de menú</h2>
<p>Para facilitar la tarea de establecer cuales ítems de menú serán sólo visibles a usuarios registrados usaremos este código que nos creará un nuevo campo en la configuración de los ítems de menú.</p>
<p>El valor lo almacenamos como parte de los metadatos del ítem de menú.</p>
<div class="alert alert-success">
Puedes agregar este código y el resto de código como parte del archivo <em>functions.php</em> de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/">tema hijo</a> o usando algún <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">plugin de Snippets</a>.
</div>
<pre><code class="language-php">// Hook para agregar un nuevo campo a la configuraci&oacute;n de un &iacute;tem de men&uacute;
add_action( &apos;wp_nav_menu_item_custom_fields&apos;, &apos;agregar_checkbox_item_menu&apos;, 10, 5 );

function agregar_checkbox_item_menu( $item_id, $item, $depth, $args, $id ): void {
	?&gt;
    &lt;p class=&quot;description description-wide&quot;&gt;
        &lt;label for=&quot;edit-menu-item-registered-&lt;?php echo $item_id; ?&gt;&quot;&gt;
            &lt;input type=&quot;checkbox&quot; id=&quot;edit-menu-item-registered-&lt;?php echo $item_id; ?&gt;&quot;
                   name=&quot;menu-item-registered[&lt;?php echo $item_id; ?&gt;]&quot;
				&lt;?php checked( get_post_meta( $item_id, &apos;_menu_item_registered&apos;, true ), &apos;1&apos; ); ?&gt; /&gt;
            &lt;span&gt;S&oacute;lo mostrar para usuarios registrados&lt;/span&gt;
        &lt;/label&gt;
    &lt;/p&gt;
    &lt;br&gt;
	&lt;?php
}

// Guardar el valor del campo personalizado
add_action( &apos;wp_update_nav_menu_item&apos;, &apos;guardar_checkbox_item_menu&apos;, 10, 3 );

function guardar_checkbox_item_menu( $menu_id, $menu_item_db_id, $args ): void {
	$value = isset( $_POST[&apos;menu-item-registered&apos;][ $menu_item_db_id ] ) ? &apos;1&apos; : &apos;0&apos;;
	if ( $value === &apos;0&apos; ) {
		delete_post_meta( $menu_item_db_id, &apos;_menu_item_registered&apos; );
	} else {
		update_post_meta( $menu_item_db_id, &apos;_menu_item_registered&apos;, $value );
	}
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>La primera porción de código simplemente crea el nuevo campo HTML, que será un checkbox</li>
<li>Para esto usamos el hook <em>wp_nav_menu_item_custom_fields</em> y usamos código HTML adicional para envolver el nuevo campo</li>
<li>La otra porción de código la usamos para guardar el valor del campo si esta marcado o no, usamos el Hook <em>wp_update_nav_menu_item</em></li>
<li>Los ítems de menú, son un tipo de contenido en WordPress por lo que usamos las tablas de posts y para guardar metadata la tabla postmeta</li>
</ul>
<p>&nbsp;</p>
<h2>Ocultar el ítem de menú en el front-end del sitio</h2>
<p><strong>Los ítems que están marcados sólo deberían ser visibles por usuarios registrados</strong>, es por eso que agregaremos una clase CSS a los ítems marcados cuando lo visualice un visitante. La clase CSS se llamará &#8216;hide&#8217;.</p>
<pre><code class="language-php">// Agregar una clase CSS a los items que no deber&iacute;an aparecer en el front-end
add_filter( &apos;wp_get_nav_menu_items&apos;, &apos;ocultar_items_menu_usuarios_no_registrados&apos;, 10, 3 );

function ocultar_items_menu_usuarios_no_registrados( $items, $menu, $args ) {
	if ( ! is_user_logged_in() ) {
		foreach ( $items as $item ) {
			$only_registered = get_post_meta( $item-&gt;ID, &apos;_menu_item_registered&apos;, true );
			if ( $only_registered ) {
				$item-&gt;classes[] = &apos;hide&apos;;
			}
		}
	}

	return $items;
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Simplemente usamos el Hook <em>wp_get_nav_menu_items</em> en la función a la que hace referencia comprobamos si el usuario esta o no conectado</li>
<li>Si es un usuario visitante entonces recorremos los ítems de menú y si tiene el metadato <em>_menu_item_registered</em>, entonces agregamos una clase CSS llamada hide</li>
</ul>
<p>&nbsp;<br />
En el archivo <em>style.css</em> de tu tema hijo puedes agregar el siguiente código CSS que define la clase hide.</p>
<pre><code class="language-css">.hide {
    display: none!important;
}
</code></pre>
<p>&nbsp;</p>
<h2>Seguridad si se trata de acceder directamente a la URL</h2>
<p>Como paso final, en caso no hayas establecido el contenido como privado y todo lo quieras <strong>controlar desde los ítems de menú</strong>, se puede agregar condiciones adicionales para redireccionar en caso la URL se encuentre como privada.</p>
<pre><code class="language-php">// Redirigir si un usuario no registrado intenta acceder a la URL directamente
add_action( &apos;template_redirect&apos;, &apos;redirigir_usuarios_no_registrados&apos; );

function redirigir_usuarios_no_registrados(): void {
	if ( ! is_user_logged_in() ) {

		// ===&gt; Reemplaza &apos;Main Menu&apos; con el nombre de tu men&uacute;
		$menu_items  = wp_get_nav_menu_items( &apos;Main Menu&apos; );
		$current_url = home_url( add_query_arg() );

		foreach ( $menu_items as $item ) {
			if ( $current_url === $item-&gt;url ) {
				if ( get_post_meta( $item-&gt;ID, &apos;_menu_item_registered&apos;, true ) ) {
					wp_redirect( home_url() );
					exit;
				} else {
					break;
				}
			}
		}
	}
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>En el código anterior usamos el Hook <em>template_redirect</em></li>
<li>El código sólo se ejecutará cuando el usuario es visitante</li>
<li>Hay que obtener los items del menú que nos interesa, hay que cambiar el nombre del menú</li>
<li>Obtenemos la URL actual que se esta visitando</li>
<li>Recorremos los ítems de menú y verificamos si la URL actual coincide con alguna del menú</li>
<li>Si coincide entonces comprobamos la metadata para ver si es una URL privada</li>
<li>Si es privada entonces hacemos una redirección</li>
<li>Si no es privada simplemente terminamos el bucle</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar <strong>es posible restringir los ítems de menú de tu sitio web para que sólo sean visibles y accesibles por usuarios registrados</strong>, en este artículo hemos visto como realizarlo a través de código.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/establecer-items-de-menu-solo-para-usuarios-registrados/">Establecer ítems de menú sólo para usuarios registrados</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/establecer-items-de-menu-solo-para-usuarios-registrados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Descarga directa de un archivo desde URL sin plugins</title>
		<link>https://decodecms.com/descarga-directa-de-un-archivo-desde-url-sin-plugins/</link>
					<comments>https://decodecms.com/descarga-directa-de-un-archivo-desde-url-sin-plugins/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Mon, 06 Jan 2025 20:43:11 +0000</pubDate>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1552</guid>

					<description><![CDATA[<p>En algunos casos es posible que necesites la funcionalidad de descarga de archivos, pero quieres que se descarguen directamente y no que se muestren en el navegador (por ejemplo al descargar un PDF). &#160; Generalidades En este artículo veremos como realizar la descarga directa de un archivo de cualquier tipo directamente a través de una [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/descarga-directa-de-un-archivo-desde-url-sin-plugins/">Descarga directa de un archivo desde URL sin plugins</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En algunos casos es posible que necesites <strong>la funcionalidad de descarga de archivos</strong>, pero quieres que se descarguen directamente y no que se muestren en el navegador (por ejemplo al descargar un PDF). <span id="more-1552"></span></p>
<p>&nbsp;</p>
<h2>Generalidades</h2>
<p>En este artículo veremos como realizar la descarga directa de un archivo de cualquier tipo directamente a través de una URL, además podremos <strong>agregar condiciones a la descarga</strong>, por ejemplo <strong>que sólo se pueda realizar por usuarios registrados</strong>. Veremos como hacerlo a través de código.</p>
<p>&nbsp;</p>
<h2>Código para descargar un archivo desde una URL en WordPress</h2>
<p>Puedes agregar el siguiente código como parte del archivo <em>functions.php</em> de tu tema hijo o usando algún plugin de Snippets.</p>
<pre><code class="language-php">add_action( &apos;template_redirect&apos;, &apos;descargar_archivo_usuarios&apos; );

function descargar_archivo_usuarios() : void {
	if ( ! isset( $_GET[&apos;descargar&apos;] ) ) {
		return;
	}

	$path_file = ABSPATH . &apos;wp-content/uploads/archivo_a_descargar.zip&apos;;

	if ( ! file_exists( $path_file ) ) {
		echo &quot;El archivo no existe &lt;a href=&apos;&quot; . home_url() . &quot;&apos;&gt;Volver&lt;/a&gt;&quot;;
		exit;
	}

	if (!is_user_logged_in()) {
		echo &quot;Debes iniciar sesi&oacute;n para descargar el archivo &lt;a href=&apos;&quot; . wp_login_url() . &quot;&apos;&gt;Iniciar sesi&oacute;n&lt;/a&gt;&quot;;
		exit;
	}

	$file_info = new finfo(FILEINFO_MIME_TYPE);
	$mime_type = $file_info-&gt;file($path_file);

	header( &apos;Content-Type: &apos; . $mime_type );
	header( &apos;Content-Disposition: attachment; filename=&quot;&apos; . basename($path_file) . &apos;&quot;&apos; );
	readfile( $path_file );
	exit;
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Usamos el hook <em>template_redirect</em> que hace referencia a la función <em>descargar_archivo_usuarios</em></li>
<li>Dentro de la función comprobamos que exista un parámetro llamado «descargar» como parte de la URL, sino existe el resto del código no se ejecutará</li>
<li>Definimos la ruta del archivo a descargar, en nuestro caso será un archivo .zip pero puede ser de cualquier otra extensión</li>
<li>Comprobamos que el archivo exista</li>
<li>Hacemos otra comprobación para detectar si el usuario esta conectado</li>
<li>Finalmente tenemos el código para forzar la descarga, obtenemos información del tipo de archivo para usarla posteriormente como parte de la cabecera</li>
<li>Establecemos el nuevo nombre del archivo y forzamos la descarga</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como hemos podido comprobar, puedes <strong>habilitar la descarga de un archivo usando los parámetros de las URLs</strong>, y adicionalmente colocar <strong>condiciones a la descarga,</strong> por ejemplo que sea para usuarios conectados, hemos visto como realizar esto <strong>directamente a través de código y sin usar plugins</strong>.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/descarga-directa-de-un-archivo-desde-url-sin-plugins/">Descarga directa de un archivo desde URL sin plugins</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/descarga-directa-de-un-archivo-desde-url-sin-plugins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mostrar contenido Premium sin Plugins</title>
		<link>https://decodecms.com/mostrar-contenido-premium-sin-plugins/</link>
					<comments>https://decodecms.com/mostrar-contenido-premium-sin-plugins/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Tue, 10 Dec 2024 21:04:23 +0000</pubDate>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1549</guid>

					<description><![CDATA[<p>En este artículo veremos como mostrar el contenido de una categoría de WordPress sólo para usuarios que tengan un determinado rol, veremos como realizarlo directamente a través de código. &#160; Resultado Final Al final queremos restringir el contenido para usuarios que no tengan el rol de «premium» y que aparezca en su lugar un mensaje [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/mostrar-contenido-premium-sin-plugins/">Mostrar contenido Premium sin Plugins</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En este artículo veremos como <strong>mostrar el contenido de una categoría de WordPress sólo para usuarios que tengan un determinado rol</strong>, veremos como realizarlo directamente a través de código.<span id="more-1549"></span></p>
<p>&nbsp;</p>
<h2>Resultado Final</h2>
<p>Al final queremos <strong>restringir el contenido para usuarios que no tengan el rol de «premium»</strong> y que aparezca en su lugar un mensaje de contenido exclusivo.</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Mostrar%20contenido%20Premium%20sin%20Plugins/resultado-contenido-restringido-mensaje.png"  title="Resultado contenido restringido" alt="Contenido restringido mensaje" width="631" height="257" />
</div>
<p>&nbsp;</p>
<h2>Generalidades</h2>
<p>Existen muchos plugins con la <strong>funcionalidad de contenido restringido para WordPress</strong>, sin embargo en este artículo veremos algo que sirva como base para una <strong>funcionalidad simple de restricción de contenido por categoría y para un determinado rol.</strong></p>
<p>&nbsp;</p>
<h2>Código de creación de rol y restricción de categoría</h2>
<p>Puedes usar el siguiente código para crear un nuevo rol llamado «Premium» en WordPress</p>
<pre><code class="language-php">// Crea un nuevo rol llamado Premium
add_action( &apos;init&apos;, &apos;add_affiliate_role&apos; );
function add_affiliate_role(): void {
	if ( get_role( &apos;premium&apos; ) ) {
		return;
	}
	add_role( &apos;premium&apos;, &apos;Premium&apos;, array( &apos;read&apos; =&gt; true ) );
}
</code></pre>
<p>&nbsp;<br />
El siguiente código restringe el contenido para una categoría llamada «Premium» si el usuario no tiene el rol de «Premium».</p>
<pre><code class="language-php">// Muestra contenido de la categor&iacute;a Premium s&oacute;lo a los usuarios que tenga el rol Premium
add_filter( &apos;the_content&apos;, &apos;show_premium_content&apos; );

function show_premium_content( $content ) {
	if ( in_category( &apos;premium&apos; ) &amp;&amp; ! current_user_can( &apos;premium&apos; ) ) {
		$content = &apos;&#x279C; &lt;strong&gt;Este contenido es exclusivo para usuarios Premium.&lt;/strong&gt;&apos;;
	}

	return $content;
	}
</code></pre>
<div class="alert alert-success">
Ambos códigos puedes agregarlos como parte del archivo functions.php de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/">tema hijo</a>, o usar algún <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">plugin de Snippets</a>.
</div>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> El código anterior:</p>
<ul class="descode">
<li>Primero creamos el nuevo rol, usamos el Hook <em>init</em> de WordPress que hace referencia a la función <em>add_affiliate_role</em></li>
<li>Comprobamos si el rol <em>premium</em> ya existe, sino usamos la función <em>add_role</em> para agregarlo.</li>
<li>Para la restricción de contenido usamos el Hook de filtro <em>the_content</em> que hace referencia a la función <em>show_premium_content</em></li>
<li>Dentro de la función hacemos la comprobación si el contenido que vemos corresponde a la categoría «premium» y además si el usuario tiene el rol de «premium»</li>
<li>Si estas condiciones no se cumplen entonces mostramos un mensaje en lugar del contenido original</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar, podemos restringir fácilmente a través de código el <strong>contenido de entradas de una categoría</strong> y que sólo sea visible por usuarios que tengan un <strong>determinado rol</strong>.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/mostrar-contenido-premium-sin-plugins/">Mostrar contenido Premium sin Plugins</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/mostrar-contenido-premium-sin-plugins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Favicon para modo oscuro y modo claro en WordPress</title>
		<link>https://decodecms.com/favicon-para-modo-oscuro-y-modo-claro-en-wordpress/</link>
					<comments>https://decodecms.com/favicon-para-modo-oscuro-y-modo-claro-en-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Wed, 27 Nov 2024 15:08:01 +0000</pubDate>
				<category><![CDATA[Themes]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[mejoras]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1547</guid>

					<description><![CDATA[<p>Sabias que puedes cambiar dinámicamente el Favicon de tu sitio web en WordPress, de manera que si un usuario tiene configurado el modo oscuro o claro pueda ver una versión específica de ese ícono. &#160; Resultado Final Al final obtendremos diferentes Favicons de acuerdo a la configuración del sistema. &#160; Código para cambiar dinámicamente el [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/favicon-para-modo-oscuro-y-modo-claro-en-wordpress/">Favicon para modo oscuro y modo claro en WordPress</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Sabias que puedes <strong>cambiar dinámicamente el Favicon de tu sitio web en WordPress</strong>, de manera que si un usuario tiene configurado el modo oscuro o claro pueda ver una versión específica de ese ícono. <span id="more-1547"></span></p>
<p>&nbsp;</p>
<h2>Resultado Final</h2>
<p>Al final obtendremos diferentes Favicons de acuerdo a la configuración del sistema.</p>
<div class="borde-img">
<img loading="lazy" decoding="async" class="aligncenter" src="https://s3.sa-east-1.amazonaws.com/img.decodecms/entradas/Favicon%20para%20modo%20oscuro%20y%20modo%20claro%20en%20WordPress/resultado-final-favicon-darkmode-lightmode.jpg"  title="Resultado Final Favicon" alt="Favicon alterno para modo oscuro y claro" width="466" height="230" />
</div>
<p>&nbsp;</p>
<h2>Código para cambiar dinámicamente el Favicon</h2>
<p>Primero tienes que tener dos Favicon, tanto para el modo claro como para el modo oscuro, puedes copiar estos iconos en la raíz de tu sitio web WordPress. En nuestro ejemplo los iconos son: <em>favicon-black.png</em> y <em>favicon-white.png</em>.</p>
<p>Luego puedes copiar el siguiente código como parte de tu archivo functions.php de tu <a href="https://decodecms.com/crear-un-child-theme-en-wordpress-de-manera-correcta/">tema hijo</a> o usando algún <a href="https://decodecms.com/agregar-codigo-a-tu-sitio-sin-usar-functions-php/">plugin de Snippets</a>.</p>
<p>&nbsp;</p>
<pre><code class="language-php">add_action(&apos;wp_head&apos;, function(){
	echo &apos;&lt;link rel=&quot;icon&quot; href=&quot;favicon-black.png&quot; type=&quot;image/png&quot; media=&quot;(prefers-color-scheme: light)&quot;&gt;&apos;;
	echo &apos;&lt;link rel=&quot;icon&quot; href=&quot;favicon-white.png&quot; type=&quot;image/png&quot; media=&quot;(prefers-color-scheme: dark)&quot;&gt;&apos;;
});
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Utilizamos el <a href="https://decodecms.com/los-hooks-wordpress-usarlos/">Hook</a> <em>wp_head</em> que nos permitirá insertar código HTML en la etiqueta HTML <em>head</em></li>
<li>Insertamos el HTML tanto para el Favicon de fondo claro como para el de fondo oscuro</li>
<li>El código esta especificando que la imagen es de <em>type=»image/png»</em>, si tu imagen no es .png tienes que cambiar esto</li>
<li>Lo que condiciona la carga de un u otro icono es la propiedad <em>media</em>, a través de <em>prefers-color-scheme</em></li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar puedes <strong>mejorar el aspecto del Favicon dependiendo de las preferencias del usuario en su sistema</strong> y de esta forma tener un icono personalizado para tu sitio.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/favicon-para-modo-oscuro-y-modo-claro-en-wordpress/">Favicon para modo oscuro y modo claro en WordPress</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/favicon-para-modo-oscuro-y-modo-claro-en-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Modificar automáticamente un plugin luego de su actualización</title>
		<link>https://decodecms.com/modificar-automaticamente-un-plugin-luego-de-su-actualizacion/</link>
					<comments>https://decodecms.com/modificar-automaticamente-un-plugin-luego-de-su-actualizacion/#respond</comments>
		
		<dc:creator><![CDATA[Jhon Marreros Guzmán]]></dc:creator>
		<pubDate>Tue, 12 Nov 2024 16:49:08 +0000</pubDate>
				<category><![CDATA[Core]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[funcionalidad]]></category>
		<guid isPermaLink="false">https://decodecms.com/?p=1545</guid>

					<description><![CDATA[<p>En un artículo anterior habíamos visto cómo evitar actualizaciones de plugins, sin embargo en algunos es posible que requieras actualizar el plugin pero luego sobrescribir archivos modificados. &#160; Generalidades En algunos proyectos puede ser necesario modificar archivos de temas y plugins, la desventaja es que perderemos nuestros cambios tras una actualización. En este artículo veremos [&#8230;]</p>
<p>La entrada <a href="https://decodecms.com/modificar-automaticamente-un-plugin-luego-de-su-actualizacion/">Modificar automáticamente un plugin luego de su actualización</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En un artículo anterior habíamos visto <a href="https://decodecms.com/desactivar-la-actualizacion-para-plugins-especificos/">cómo evitar actualizaciones de plugins</a>, sin embargo en algunos es posible que requieras <strong>actualizar el plugin pero luego sobrescribir archivos modificados</strong>. <span id="more-1545"></span></p>
<p>&nbsp;</p>
<h2>Generalidades</h2>
<p>En algunos proyectos puede ser <strong>necesario modificar archivos de temas y plugins</strong>, la desventaja es que perderemos nuestros cambios tras una actualización.</p>
<p>En este artículo veremos cómo realizar <strong>alguna acción para mitigar esto</strong>, por ejemplo sobrescribir las modificaciones, enviar un correo de aviso, etc. , cuando un plugin específico ha sido actualizado.</p>
<div class="alert alert-warning">
Sabemos que WordPress es flexible y en la medida de lo posible evitaremos modificar los archivos de plugins y temas, es por eso que usamos los <a href="https://decodecms.com/los-hooks-wordpress-usarlos/">Hooks</a> para hacer cambios.
</div>
<p>&nbsp;</p>
<h2>Código que se ejecute tras finalizar la actualización de un plugin</h2>
<p>En el siguiente código detectamos si el <strong>plugin de WooCommerce ha sido actualizado</strong>, si ha sido actualizado entonces sobrescribiremos uno de sus archivos con un archivo que tenemos en la ruta del tema hijo.</p>
<div class="alert alert-info">
Las modificaciones en este archivo a modo de ejemplo simplemente cambian el icono de WooCommerce en el menú de la administración.
</div>
<pre><code class="language-php">add_action( &apos;upgrader_process_complete&apos;, &apos;process_woocommerce_update&apos;, 10, 2 );

function process_woocommerce_update( $upgrader_object, $options ) {

	// Verificamos que sea una actualizaci&oacute;n de plugin
	if ( $options[&apos;action&apos;] == &apos;update&apos; &amp;&amp; $options[&apos;type&apos;] == &apos;plugin&apos; ) {
		// Obtenemos los plugins que fueron actualizados
		$plugins_actualizados = $options[&apos;plugins&apos;];

		// Definimos el slug del plugin de WooCommerce
		$slug_woocommerce = &apos;woocommerce/woocommerce.php&apos;;

		// Verificamos si WooCommerce est&aacute; en la lista de plugins actualizados
		if ( in_array( $slug_woocommerce, $plugins_actualizados ) ) {

			// Definimos el archivo que se sobrescribir&aacute;
			$from = get_stylesheet_directory() . &apos;/updates/class-wc-admin-menus.php&apos;; // Archivo en el tema hijo
			$to = WP_PLUGIN_DIR . &apos;/woocommerce/includes/admin/class-wc-admin-menus.php&apos;; // Archivo en el plugin

			// Copiamos el archivo actualizado a la carpeta del plugin
			copy( $from, $to );

			error_log(print_r(&apos;Se ha actualizado el archivo de WooCommerce&apos;,true));
		}
	}
}
</code></pre>
<p><i class="fa fa-long-arrow-right" aria-hidden="true"></i> En el código anterior:</p>
<ul class="descode">
<li>Usamos el Hook <em>upgrader_process_complete</em> para detectar cuando una actualización ha sido completada</li>
<li>Se hace referencia a la función <em>process_woocommerce_update</em> la cual tiene dos parámetros para detectar el objeto que ha sido actualizado</li>
<li>Verificamos si se esta actualizando un plugin usando la variable <em>$options</em></li>
<li>Para verificar si se trata de WooCommerce el plugin que ha sido actualizado hacemos la verificación con la variable <em>$plugins_actualizados</em></li>
<li>Cuando nos aseguramos que es WooCommerce el plugin que ha sido actualizado entonces podemos llevar a cabo alguna acción, en nuestro ejemplo simplemente será reemplazar un archivo</li>
</ul>
<p>&nbsp;</p>
<h2>Conclusión</h2>
<p>Como has podido comprobar, es posible <strong>realizar modificaciones tras la actualización de un plugin</strong> de WordPress. En este artículo hemos visto como realizar esto con un ejemplo práctico de reemplazo de archivos a través de código.</p>
<p>&nbsp;</p>
<p>La entrada <a href="https://decodecms.com/modificar-automaticamente-un-plugin-luego-de-su-actualizacion/">Modificar automáticamente un plugin luego de su actualización</a> es un artículo reciente del sitio <a href="https://decodecms.com">DecodeCMS</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://decodecms.com/modificar-automaticamente-un-plugin-luego-de-su-actualizacion/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>