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

<channel>
	<title>wordpress &#8211; Blog</title>
	<atom:link href="https://blog.sergiorios.com.ar/tag/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sergiorios.com.ar</link>
	<description>Investigación y Desarrollo, Tecnologías Web &#38; Cloud</description>
	<lastBuildDate>Mon, 23 Feb 2026 12:14:00 +0000</lastBuildDate>
	<language>es-AR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://blog.sergiorios.com.ar/wp-content/uploads/2024/10/cropped-favicon-32x32.png</url>
	<title>wordpress &#8211; Blog</title>
	<link>https://blog.sergiorios.com.ar</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>🔁Actualización automática de precios WHMCS en WordPress</title>
		<link>https://blog.sergiorios.com.ar/trabajo/sincronizar-precios-whmcs-wordpress-whmpress-descuentos/</link>
		
		<dc:creator><![CDATA[sergio]]></dc:creator>
		<pubDate>Wed, 25 Jun 2025 16:25:17 +0000</pubDate>
				<category><![CDATA[Experiencia]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[tpl]]></category>
		<category><![CDATA[whmpress]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://blog.sergiorios.com.ar/?p=192</guid>

					<description><![CDATA[En este post te muestro cómo trabajé con WHMpress, el plugin que conecta WHMCS con WordPress, para lograr dos cosas: ✅ Automatizar la sincronización diaria de precios desde WHMCS.✅ Personalizar los templates para aplicar descuentos visuales desde WordPress. 🔁 Sincronización automática con WHMCS vía Cron WHMpress tiene una función de sincronización manual desde el panel &#8230; <a href="https://blog.sergiorios.com.ar/trabajo/sincronizar-precios-whmcs-wordpress-whmpress-descuentos/" class="more-link">Continuá leyendo <span class="screen-reader-text">🔁Actualización automática de precios WHMCS en WordPress</span></a>]]></description>
										<content:encoded><![CDATA[
<p>En este post te muestro cómo trabajé con <strong>WHMpress</strong>, el plugin que conecta <strong>WHMCS</strong> con <strong>WordPress</strong>, para lograr dos cosas:</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Automatizar la sincronización diaria de precios desde WHMCS.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Personalizar los templates para aplicar <strong>descuentos visuales</strong> desde WordPress.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f501.png" alt="🔁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sincronización automática con WHMCS vía Cron</h2>



<p>WHMpress tiene una función de sincronización manual desde el panel de WordPress. Pero para automatizarla todos los días, podés crear un archivo <code>cron.php</code> y ejecutarlo con un cron job.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c4.png" alt="📄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Código del archivo <code>cron.php</code></h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-be11171fa119b6409c30ad0ef4f50cde"><code>&lt;?php<br><br>require_once(__DIR__ . '/wp-load.php');<br><br>if (!function_exists("whmpress_cron_function")) {<br>    function whmpress_cron_function() {<br>        echo "Starting WHMPress cron job.&lt;br&gt;";<br>        echo "===========================&lt;br&gt;";<br>        echo whmp_fetch_data();<br>        echo "============================&lt;br&gt;";<br>        echo "WHMPress cron job completed.&lt;br&gt;";<br>    }<br>}<br><br>whmpress_cron_function();<br></code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ejemplo de línea en el crontab</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-5378ec69df75c4008428fabc1f28b51a"><code>0 3 * * * php /var/www/html/sitio/cron.php &gt;/dev/null 2&gt;&amp;1<br></code></pre>



<p>Este comando ejecuta la sincronización todos los días a las 3 AM desde el servidor.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9f1.png" alt="🧱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Agregar descuento personalizado en los templates de WHMpress</h2>



<p>Al usar Elementor podés insertar widgets como <code>whmpress_pricing_table</code>. WHMpress permite configurar:</p>



<ul class="wp-block-list">
<li>Producto o servicio</li>



<li>Template visual</li>



<li>Moneda</li>



<li>Ciclo de facturación</li>
</ul>



<p>Además, podés agregar <strong>descuentos personalizados</strong> desde WordPress, sin tocar WHMCS.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f527.png" alt="🔧" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Cómo se agrega el descuento en el widget y el shortcode</h3>



<p>Primero agregamos el parámetro <code>discount</code> en el <code>extract()</code> del shortcode:</p>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-cd90aa7a33a7bd8da5e7d8a4985b13df"><code>extract( shortcode_atts( [<br>    'discount' =&gt; whmpress_get_option("discount"),<br>    // otros atributos...<br>], $atts ) );<br></code></pre>



<p>Después lo agregamos al array <code>$vars</code>:</p>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-6e7857bddf5bb52738a3334328b89180"><code>$vars = [<br>    "discount" =&gt; $discount,<br>    "amountwithdiscount" =&gt; floor($tmp2['amount'] * (1 - $discount / 100)),<br>    // ...<br>];<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e6.png" alt="📦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Configuración en Elementor (archivo <code>pricing-table.php</code>)</h2>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c2.png" alt="📂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ruta: <code>/wp-content/plugins/whmpress/widgets/pricing-table.php</code></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Agregar el campo de descuento</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-8087c06d00e909bf63a44072c9809ad6"><code>$this-&gt;add_control(<br>    'discount',<br>    [<br>        'label' =&gt; 'Descuento',<br>        'type' =&gt; \\Elementor\\Controls_Manager::NUMBER,<br>        'default' =&gt; '0',<br>    ]<br>);<br></code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e4.png" alt="📤" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Usar el valor en el render</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-dfec5c45bfafb889ff074a62aff4d34f"><code>$discount = $settings['discount'];<br></code></pre>



<p>Y pasarlo al shortcode:</p>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-d3a60c031086b5ce0ac41a086c56bd7b"><code>echo do_shortcode('[whmpress_pricing_table <br>    id="' . $id . '" <br>    discount="' . $discount . '"<br>    // otros parámetros<br>]');<br></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3a8.png" alt="🎨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Cómo mostrar el descuento en el template <code>.tpl</code></h2>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c2.png" alt="📂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ruta: <code>/wp-content/plugins/whmpress/templates/whmpress_pricing_table/default</code></p>



<p>Usamos condicionales de Smarty para mostrar el monto con y sin descuento:</p>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-6e3a8e24ac3b8ec2d3caffb60ecc0ea1"><code>{if isset($amountwithdiscount) &amp;&amp; $amountwithdiscount != $amount}<br>    &lt;span class="original-amount">{$prefix}{$amount}&lt;/span><br>    &lt;span class="h-discount-tag">{$discount}% OFF&lt;/span>&lt;br><br>    &lt;div class="holder"><br>        &lt;span class="currency">{$prefix}&lt;/span>&lt;span class="amount">{$amountwithdiscount|number_format:0:',':'.'}&lt;/span><br>{/if}<br></code></pre>



<p>Esto permite mostrar visualmente el ahorro con un formato atractivo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4b0.png" alt="💰" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Moneda dinámica según la sesión o cookie</h2>



<p>Relacionado con el post anterior, también podés detectar la moneda activa con este fragmento:</p>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-9c836089b78c3f42e0e867c8071c0655"><code>if (empty($currency)) {<br>    if (isset($_SESSION["whmpress_currency"])) {<br>        $currency = $_SESSION["whmpress_currency"];<br>    }<br>}<br></code></pre>



<p>Esto se integra perfecto con los shortcodes de detección de IP y selección de moneda que documenté acá <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a class="" href="https://blog.sergiorios.com.ar/trabajo/%e2%9d%93como-integraste-whmcs-con-wordpress-usando-whmpress-y-ademas-lo-personalizaste-con-codigo-propio/">¿Cómo integraste WHMCS con WordPress usando WHMpress y además lo personalizaste con código propio?</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Resultado final</h2>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Precios actualizados automáticamente desde WHMCS<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Descuentos configurables visualmente desde WordPress<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Integración fluida con Elementor y WHMpress<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Templates visuales adaptados con lógica PHP y Smarty</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>🧩Integración avanzada WHMCS + WordPress</title>
		<link>https://blog.sergiorios.com.ar/trabajo/integracion-whmcs-wordpress-whmpress-personalizacion/</link>
		
		<dc:creator><![CDATA[sergio]]></dc:creator>
		<pubDate>Wed, 25 Jun 2025 15:09:51 +0000</pubDate>
				<category><![CDATA[Experiencia]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[moneda]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[shortcodes]]></category>
		<category><![CDATA[whmcs]]></category>
		<category><![CDATA[whmpress]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://blog.sergiorios.com.ar/?p=179</guid>

					<description><![CDATA[👉 En este artículo te muestro cómo hice una integración entre WordPress y WHMCS usando el plugin WHMpress, agregando lógica personalizada en PHP para detectar la moneda según la IP del visitante, mantenerla en sesión, permitir que el usuario la cambie manualmente y mostrar una banderita al lado 👇 ⚙️ ¿Qué es WHMpress? WHMpress es &#8230; <a href="https://blog.sergiorios.com.ar/trabajo/integracion-whmcs-wordpress-whmpress-personalizacion/" class="more-link">Continuá leyendo <span class="screen-reader-text">🧩Integración avanzada WHMCS + WordPress</span></a>]]></description>
										<content:encoded><![CDATA[
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> En este artículo te muestro cómo hice una integración entre <strong>WordPress</strong> y <strong>WHMCS</strong> usando el plugin <strong>WHMpress</strong>, agregando lógica personalizada en PHP para detectar la moneda según la IP del visitante, mantenerla en sesión, permitir que el usuario la cambie manualmente y mostrar una banderita al lado <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f447.png" alt="👇" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ¿Qué es WHMpress?</h2>



<p><a>WHMpress</a> es un plugin premium que permite conectar <strong>WordPress</strong> con <strong>WHMCS</strong>, ideal si vendés servicios como hosting, dominios o VPS.</p>



<p>Con WHMpress podés mostrar productos y precios de WHMCS directamente en WordPress, usando shortcodes o widgets.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ¿Cuál era la necesidad?</h2>



<p>Una empresa de IT necesitaba que:</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f30d.png" alt="🌍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Los precios se muestren en la moneda del país del visitante (por IP).<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9d1-200d-1f4bb.png" alt="🧑‍💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Si el usuario cambia la moneda manualmente, se respete su elección.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c1.png" alt="🏁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Agregar una banderita (o ícono) al lado del precio, según la moneda.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Solución técnica</h2>



<p>A continuación te comparto los <strong>shortcodes</strong> y funciones personalizadas que agregué al archivo <code>functions.php</code> del theme:</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 1. Mostrar la IP del visitante</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-53f8341b99e4463b5075a3067cd759a0"><code>function shortcode_ip_cliente() {<br>    $ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? <br>          $_SERVER['HTTP_X_FORWARDED_FOR'] ?? <br>          $_SERVER['REMOTE_ADDR'] ?? 'IP no detectada';<br>    return esc_html($ip);<br>}<br>add_shortcode('ip_cliente', 'shortcode_ip_cliente');<br></code></pre>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Uso: <code>[ip_cliente]</code><br>Esto permite debuggear o ver desde qué IP se está accediendo.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f30e.png" alt="🌎" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 2. Detectar moneda por IP o por URL</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-dcde2e15900339921838d2762781ee2f"><code>add_action('init', 'whmpress_definir_moneda_por_url_o_ip');<br><br>function whmpress_definir_moneda_por_url_o_ip() {<br>    if (!session_id()) session_start();<br><br>    $monedas = ['USD' => 1, 'ARS' => 2];<br><br>    if (isset($_GET['currency']) &amp;&amp; isset($monedas[strtoupper($_GET['currency'])])) {<br>        $_SESSION['whmpress_currency'] = $monedas[strtoupper($_GET['currency'])];<br>        setcookie('whmpress_currency', $_SESSION['whmpress_currency'], time() + 86400 * 30, "/");<br>        return;<br>    }<br><br>    if (!isset($_SESSION['whmpress_currency']) &amp;&amp; isset($_COOKIE['whmpress_currency'])) {<br>        $_SESSION['whmpress_currency'] = $_COOKIE['whmpress_currency'];<br>        return;<br>    }<br><br>    if (!isset($_SESSION['whmpress_currency'])) {<br>        $ip = $_SERVER['REMOTE_ADDR'];<br>        $geo = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));<br>        $pais = $geo->geoplugin_countryCode ?? 'US';<br>        $_SESSION['whmpress_currency'] = ($pais === 'AR') ? $monedas['ARS'] : $monedas['USD'];<br>        setcookie('whmpress_currency', $_SESSION['whmpress_currency'], time() + 86400 * 30, "/");<br>    }<br>}<br></code></pre>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f446.png" alt="👆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Este fragmento detecta automáticamente la moneda inicial según la IP o parámetro <code>?currency=USD</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f504.png" alt="🔄" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3. Selector visual de moneda</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-1fe40cded2edea24f28a0688508f3fa6"><code>function selector_moneda() {<br>    if (!session_id()) session_start();<br><br>    // lógica reducida para claridad...<br>    $currency_num = $_COOKIE['whmpress_currency'] ?? $_SESSION['whmpress_currency'] ?? 1;<br><br>    if ($currency_num === '1') {<br>        $currency = 'USD'; $currency2 = 'ARS'; $icon1 = '&#x1f310;'; $icon2 = '&#x1f1e6;&#x1f1f7;';<br>    } else {<br>        $currency = 'ARS'; $currency2 = 'USD'; $icon1 = '&#x1f1e6;&#x1f1f7;'; $icon2 = '&#x1f310;';<br>    }<br><br>    $html = '&lt;select onchange="if(this.value) location=this.value;">';<br>    $html .= "&lt;option value='?currency={$currency}' selected>{$icon1} {$currency}&lt;/option>";<br>    $html .= "&lt;option value='?currency={$currency2}'>{$icon2} {$currency2}&lt;/option>";<br>    $html .= '&lt;/select>';<br><br>    return $html;<br>}<br>add_shortcode('selector_moneda', 'selector_moneda');<br></code></pre>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Uso: <code>[selector_moneda]</code><br>Esto genera un pequeño dropdown para cambiar de moneda manualmente. Ideal para la cabecera del sitio.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c1.png" alt="🏁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 4. Mostrar una banderita según la moneda</h3>



<pre class="wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-4299b81b41ff10ab49de521e128a9ecf"><code>function mostrar_bandera_por_moneda() {<br>    if (session_status() == PHP_SESSION_NONE) session_start();<br>    $currency = $_SESSION['whmpress_currency'] ?? null;<br><br>    if ($currency == '2') {<br>        return '&lt;img src="https://flagcdn.com/w40/ar.png" alt="Argentina" width="24" height="18">';<br>    } elseif ($currency == '1') {<br>        return '&lt;span style="font-size:24px;">&#x1f310;&lt;/span>';<br>    }<br>    return '';<br>}<br>add_shortcode('moneda_bandera', 'mostrar_bandera_por_moneda');<br></code></pre>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Uso: <code>[moneda_bandera]</code><br>Se puede usar al lado del precio o del selector para que sea más visual <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5bc.png" alt="🖼" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Resultado final</h2>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Precios dinámicos según país<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Cambios manuales de moneda respetados<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Visualización con íconos o banderas<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Todo usando <strong>shortcodes simples</strong> en WordPress</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>📝Integración API WordPress para mostrar posts</title>
		<link>https://blog.sergiorios.com.ar/trabajo/consumir-api-wordpress-php-mostrar-posts/</link>
		
		<dc:creator><![CDATA[sergio]]></dc:creator>
		<pubDate>Wed, 07 Feb 2024 22:57:25 +0000</pubDate>
				<category><![CDATA[Experiencia]]></category>
		<category><![CDATA[Trabajo]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://blog.sergiorios.com.ar/?p=55</guid>

					<description><![CDATA[En esta publicación, quiero compartir una funcionalidad que recientemente me tocó agregar en el sitio web a una empresa, y que también he implementado en mi propia web. La idea es integrar la API de WordPress en tu sitio web o portafolio para mostrar las últimas publicaciones de tu blog. Es una funcionalidad interesante que &#8230; <a href="https://blog.sergiorios.com.ar/trabajo/consumir-api-wordpress-php-mostrar-posts/" class="more-link">Continuá leyendo <span class="screen-reader-text">📝Integración API WordPress para mostrar posts</span></a>]]></description>
										<content:encoded><![CDATA[
<p>En esta publicación, quiero compartir una funcionalidad que recientemente me tocó agregar en el sitio web a una empresa, y que también he implementado en mi propia web. La idea es integrar la API de WordPress en tu sitio web o portafolio para mostrar las últimas publicaciones de tu blog. Es una funcionalidad interesante que puede añadir valor a tu perfil profesional al mantenerlo actualizado con tu contenido más reciente.</p>



<p>Voy a explicar cómo lo hice utilizando Laravel, un framework de PHP que facilita mucho el desarrollo web. A continuación, les muestro el código que usé para obtener las publicaciones de un blog de WordPress y mostrarlas en la web.</p>



<h4 class="wp-block-heading">Paso 1: Obtener las Publicaciones del Blog</h4>



<p>Primero, creamos una función en Laravel para obtener las publicaciones. La API de WordPress ofrece un endpoint para obtener los posts, que es: <code>https://[URL DE TU BLOG]/wp-json/wp/v2/posts</code>. Vamos a solicitar las últimas 3 publicaciones, pero este número puede ajustarse según tus necesidades.</p>



<pre class="wp-block-code has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-0828fdf7b77e7587caeb95015fa66083"><code>public function getBlogPosts()
{
    // URL para obtener las publicaciones
    $url = 'https://&#91;URL DE TU BLOG]/wp-json/wp/v2/posts?per_page=3';

    // Hacer la solicitud cURL para obtener las publicaciones
    $posts = $this->makeCurlRequest($url);

    // Si hubo un error en la solicitud
    if (!$posts) {
        return view('index', &#91;'publicaciones' => &#91;]]);
    }

    // Arreglo donde guardaremos las publicaciones con las imágenes
    $postsWithImages = &#91;];

    // Recorrer las publicaciones para obtener la imagen destacada
    foreach ($posts as $post) {
        $featuredMediaId = $post&#91;'featured_media'];

        // Si la publicación tiene imagen destacada, hacer otra solicitud para obtener los detalles de la imagen
        if ($featuredMediaId) {
            $mediaUrl = "https://&#91;URL DE TU BLOG]/wp-json/wp/v2/media/$featuredMediaId";
            $mediaDetails = $this->makeCurlRequest($mediaUrl);

            if ($mediaDetails &amp;&amp; isset($mediaDetails&#91;'media_details']&#91;'sizes']&#91;'full']&#91;'source_url'])) {
                $post&#91;'featured_image_url'] = $mediaDetails&#91;'media_details']&#91;'sizes']&#91;'full']&#91;'source_url'];
            } else {
                $post&#91;'featured_image_url'] = null;
            }
        } else {
            $post&#91;'featured_image_url'] = null;
        }

        // Agregar la publicación con su imagen al arreglo
        $postsWithImages&#91;] = $post;
    }

    // Pasar las publicaciones con las imágenes a la vista
    return view('index', &#91;
        'publicaciones' => $postsWithImages,
    ]);
}
</code></pre>



<h4 class="wp-block-heading">Paso 2: Configurar la Función <code>makeCurlRequest</code></h4>



<p>Para realizar las solicitudes a la API de WordPress, utilizamos una función llamada <code>makeCurlRequest</code>, que se encarga de hacer la solicitud cURL y devolver los datos obtenidos. Asegúrate de tenerla implementada en tu código:</p>



<pre class="wp-block-code has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-d118943ed5e2b37ee3c619c9c5421869"><code>private function makeCurlRequest($url)
    {
        // Inicializar cURL
        $ch = curl_init();

        // Configurar opciones de cURL
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  

        // Ejecutar la solicitud
        $response = curl_exec($ch);

        // Manejar errores de cURL
        if (curl_errno($ch)) {
            curl_close($ch);
            return false;
        }

        // Cerrar cURL
        curl_close($ch);

        // Decodificar la respuesta JSON
        return json_decode($response, true);
    }
</code></pre>



<h4 class="wp-block-heading">Paso 3: Actualizar la Vista para Mostrar las Publicaciones</h4>



<p>Finalmente, debes actualizar la vista para mostrar las publicaciones con los títulos, extractos y, si es posible, las imágenes destacadas. El siguiente código es un ejemplo básico de cómo hacerlo en Blade, la plantilla de Laravel:</p>



<pre class="wp-block-code has-white-color has-dark-gray-background-color has-text-color has-background has-link-color has-small-font-size wp-elements-72d267687ef49abf36bff3483505de05"><code>&lt;!-- blog dinamico wp --&gt;
        &lt;div class="container py-5"&gt;
            &lt;h1 class="text-center mb-4"&gt;Últimas Publicaciones de Mi Blog&lt;/h1&gt;

            @if(isset($publicaciones) &amp;&amp; count($publicaciones) &gt; 0)
                &lt;div class="row"&gt;
                    @foreach($publicaciones as $publicacion)
                        &lt;div class="col-md-4 mb-4"&gt;
                            &lt;div class="card shadow-sm h-100"&gt;
                                &lt;a href="#" target="_blank"&gt;
                                    @if (isset($publicacion&#91;'featured_image_url']))
                                        &lt;img src="{{ $publicacion&#91;'featured_image_url'] }}"
                                            class="card-img-top img-fluid"
                                            alt="Imagen destacada del post"
                                            style="max-height: 200px; object-fit: cover;"&gt;
                                    @else
                                        &lt;img src="/ruta/a/imagen/por_defecto.jpg"
                                            class="card-img-top img-fluid"
                                            alt="Imagen por defecto"
                                            style="max-height: 200px; object-fit: cover;"&gt;
                                    @endif
                                &lt;/a&gt;
                                &lt;div class="card-body"&gt;
                                    &lt;h5 class="card-title"&gt;
                                        &lt;a href="{{ $publicacion&#91;'link'] }}" target="_blank" class="text-dark text-decoration-none"&gt;{{ $publicacion&#91;'title']&#91;'rendered'] }}&lt;/a&gt;
                                    &lt;/h5&gt;
                                    &lt;p class="card-text"&gt;{{ Str::limit(strip_tags($publicacion&#91;'excerpt']&#91;'rendered']), 150) }}&lt;/p&gt;
                                &lt;/div&gt;
                                &lt;div class="card-footer bg-transparent text-end"&gt;
                                    &lt;a href="{{ $publicacion&#91;'link'] }}" class="btn btn-primary btn-sm" target="_blank"&gt;Leer más&lt;/a&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    @endforeach

                &lt;/div&gt;
            @else
                &lt;p class="text-center"&gt;No se encontraron publicaciones.&lt;/p&gt;
            @endif
        &lt;/div&gt;
        &lt;/section&gt;
</code></pre>



<h4 class="wp-block-heading">Consideraciones Adicionales</h4>



<ul class="wp-block-list">
<li><strong>Reemplaza <code>[URL DE TU BLOG]</code> por la URL real de tu blog.</strong></li>



<li>Si las publicaciones no tienen imágenes destacadas, la propiedad <code>featured_media</code> será <code>0</code>. Puedes manejar este caso mostrando una imagen predeterminada o simplemente omitiendo la imagen.</li>



<li>Puedes personalizar la cantidad de publicaciones a mostrar cambiando el parámetro <code>per_page</code> en la URL.</li>
</ul>



<p>Espero que esta guía te sea de utilidad si alguna vez necesitas integrar publicaciones de un blog de WordPress en tu sitio web. ¡No dudes en experimentar con la API de WordPress y adaptarla a tus necesidades!</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
