WordPress

Compartiendo experiencias sobre la plataforma CMS más importante del mundo

BuddyPress

El increíble y fabuloso plugin de WordPress para crear redes sociales verticales

¿Cómo crear una RED SOCIAL?

Experiencias, ideas y materiales para llevar adelante tu próximo proyecto de creación de una red social

viernes, 19 de agosto de 2016

WordPress - Query con custom fields anidados

El siguiente es un ejemplo de de query combinando dos campos personalizados con una relación AND:

    $argsFabrica = array( 
        'post_type' => 'maestro', 
        'meta_key' => 'valor_certi',
        'orderby' => 'meta_value', 
        'order' => ASC,
        'meta_query' => array(
          'relation' => 'AND',
           array(
            'key' => 'tabla_certi',
            'compare' => '=',
            'value' => 'FA'
             ),
           array(
            'key' => 'solicitantes_autorizados_certi',
            'compare' => 'LIKE',
            'value' => get_post_meta( $post_id, 'pedido_titular', true )
             ),
),
        );

  $fabricas = get_posts( $argsFabrica );



miércoles, 15 de junio de 2016

WordPress: archive page y Custom Post Type UI

Escenario

Creamos un custom post type (plugin Custom Post Type UI), pero cuando vamos a su página de archivos, encontramos un error 404:



En un primer intento de solución, vamos a la configuración del tipo de contenido y agregamos esta opción:



Pero sigue sin funcionar.

Sólo queda un paso más, ingresar a la opción de enlaces permanentes. No es necesario grabar.



Con eso queda solucionado el problema.

WordPress: ¿Cómo crear un formulario personalizado? - Parte 5 (Adjuntar archivos)

En esta quinta parte de esta serie de artículos (ver parte 4) veremos cómo subir archivos a la librería de medios y adjuntarlos al post que hemos creado. Luego los enviaremos por email.

Paso 1

Agregamos los tags para subir los archivos:

    <?php wp_nonce_field( 'archivoAutorizacion', 'archivoAutorizacion_nonce' ); ?>
    <p>Autorización<br/><input type="file" name="archivoAutorizacion" id="archivoAutorizacion" multiple="false" /></p><br/>
    <?php wp_nonce_field( 'archivoContrato', 'archivoContrato_nonce' ); ?>
    <p>Contrato<br/><input type="file" name="archivoContrato" id="archivoContrato" multiple="false" /></p><br/>


Nuestro formulario se verá así:



Paso 2

Agregamos el código para subir los dos archivos:


if ( isset( $_POST['archivoAutorizacion_nonce'] ) && wp_verify_nonce( $_POST['archivoAutorizacion_nonce'], 'archivoAutorizacion' ) && 
            isset( $_POST['archivoContrato_nonce'] ) && wp_verify_nonce( $_POST['archivoContrato_nonce'], 'archivoContrato' ) ) {
 
  require_once( ABSPATH . 'wp-admin/includes/image.php' );
  require_once( ABSPATH . 'wp-admin/includes/file.php' );
  require_once( ABSPATH . 'wp-admin/includes/media.php' );
    
    $attachmentAutorizacion_id = media_handle_upload( 'archivoAutorizacion', $post_id );
    if ( is_wp_error( $attachmentAutorizacion_id ) ) {
    autorizacion_response("ERROR", "No se ha podido cargar al archivo de autorización: <br/><br/>" . $attachmentAutorizacion_id->get_error_message());
    } 
    
    else {

      $attachmentContrato_id = media_handle_upload( 'archivoContrato', $post_id );
      if ( is_wp_error( $attachmentContrato_id ) ) {
          autorizacion_response("ERROR", "No se ha podido cargar al archivo de contrato: <br/><br/>" . $attachmentContrato_id->get_error_message());
      } 
      

Paso 3

Código para enviar los archivos por email.

        $adjunto1 = ABSPATH . parse_url(wp_get_attachment_url($attachmentAutorizacion_id))['path'];
        $adjunto1 = str_replace("//", "/",$adjunto1);
          
        $adjunto2 = ABSPATH . parse_url(wp_get_attachment_url($attachmentContrato_id))['path'];
        $adjunto2 = str_replace("//", "/",$adjunto2);
          
        $adjuntos = array($adjunto1, $adjunto2);
        
        $sent = wp_mail($to, utf8_decode($subject), $message, $cabeceras, $adjuntos);



Posibles errores

File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.

Este error puede darse cuando omitimos especificar enctype="multipart/form-data" en el tag FORM:

<form class="form_certi" id="nueva_autorizacion" enctype="multipart/form-data" action="<?php the_permalink(); ?>" method="post">


viernes, 10 de junio de 2016

WordPress: ¿Cómo modificar el mensaje de código incorrecto Really Simple CAPTCHA?

Escenario:

- Really Simple CAPTCHA 1.9
- Contact Form 7 4.4.2

Mensaje de error:
"Your entered code is incorrect"

No encontramos lugar donde modificarlo. No hay traducción posible.

Solución

Agregar en functions.php este filtro:

add_filter ('wpcf7_use_really_simple_captcha', '__return_true');

Resultado





Fuentes

jueves, 2 de junio de 2016

WordPress - Mostrar datos del clima con nuestros propios estilos

En este breve artículo contaré como mostrar datos del clima en nuestro sitio de WordPress usando estilos personalizados. El objetivo es mostrar la temperatura y un icono arriba a la derecha como se ve en esta imagen:



Paso 1 - Plugin

Instalamos el plugin Weather Underground. No requiere KEY.





Paso 2 - Shortcode

Agregamos el shortcode en la página en donde queremos mostrarlo, en mi caso header.php.

El código que utilicé es:

    <div class="pp_header_boton_clima pp_bk_azul">
      <?php
     echo "<a href='https://espanol.wunderground.com/q/locid:ARSF2148;loctype:1?MR=1' target='_blank'>" . do_shortcode ( '[wunderground location="-32.30,-61.41" layout="current" measurement="c"]') . "</a>";
      ?>
    </div> 

Para ver las opciones del shortcode, ir a:


Paso 3 - Estilos

Lo más probable es que los estilos originales no sirvan, con lo cual este plugin nos permite modificarlos, para lo cual seguimos estos pasos.

Primero creamos un directorio dentro de nuestro tema llamado "wunderground"



Luego copiamos dentro de ese directorio el template original. En mi caso modifiqué el llamado CURRENT:

Carpeta origen: o/wp-content/plugins/wunderground/templates



Y luego simplemente editamos el código dentro de ese template. En mi caso utilicé este código:

{% autoescape 'html' %}
<div class="pp_servicio_clima">
{% set day = wunderground.current_observation %}
  <div class="pp_servicio_clima_temperatura">
<span>{{ day.temperature|round }}<sup>&deg;</sup></span>
<small>{% if wunderground.response.units == 'english' %}F{% else %}C{% endif %}</small>
  </div>
  {% include 'snippets/icon.html' with { 'tag' : 'div', 'iconsize' : '100' } %}
</div>
{% endautoescape %}



Paso 4 - Estilos

Esto ya queda a criterio de cada uno, sólo tenemos que ir a nuestra hoja de estilos y adaptarlo al diseño de nuestro sitio.

Muestro sólo a título ilustrativo:



Eso es todo por hoy. Hasta la próxima!

martes, 31 de mayo de 2016

WordPress - Retornar posts en base a un criterio (get_posts)

En ese breve ejemplo mostraremos como:
  • Realizar una consulta de registros de un post type
  • Especificando filtro y orden
  • Y cantidad de registros
El resultado es mostrar la información dentro de un bloque HTML en nuestra página de inicio tal como se ve en esta imagen:



El código:

        <?php
        
          $hoy = date("Ymd"); 
        
          $args = array( 
            'numberposts' => 3,
            'post_type' => 'evento', 
            'meta_key' => 'fecha_evento',
            'orderby' => 'meta_value', 
            'order' => ASC,
            'meta_query' => array(
                'key' => 'fecha_evento',
                'compare' => '>=',
                'value' => $hoy
           )
          );
          $eventos = get_posts( $args );
          
        foreach ( $eventos as $evento ) {
          
            $titulo = $evento->post_title;
            if ( strlen($titulo) >20 ) {
              $titulo = substr($titulo, 0, 20) . ' ...';
            }
          
            $fecha = get_post_meta($evento->ID,'fecha_evento',true);
            $mes = substr($fecha, 4, 2);
            $dia = substr($fecha, 6, 2);
          
            echo '<a href="' . get_permalink($evento->ID) . '">' . $dia . "/" . $mes . " " . $titulo . '</a><br/>';
          
          }
        
  wp_reset_postdata();
        
        ?>

domingo, 1 de mayo de 2016

WordPress: ¿Cómo crear un formulario personalizado? - Parte 4 (Guardar datos)

En esta cuarta parte de esta serie de artículos (ver parte 3) veremos cómo almacenar los datos de nuestro formulario en un tipo de artículo personalizado (custom post type) dentro de la base de datos de WordPress. Por supuesto no accederemos en forma directa a la base, sin a través de la API.

Paso 1

Creamos un custom post type:



Paso 2

Agregamos el código para insertar dentro de WordPress y controlar el posible error.

<?php

$response = "<h1>Solicitar autorización</h1><br/>";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  
  # Datos
  
  $to = get_option('admin_email');
  $subject = "Solicitud de autorización desde ".get_bloginfo('name');
  $message = "<b>Empresa</b>: " . $_POST['razonsocial'];
  $message .= "<br/><b>Email</b>: " . $_POST['email'];
  $cabeceras = "MIME-Version: 1.0\r\n";
  $cabeceras .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
  
  # Carga de post en WodPress
  $my_post = array(
 'post_title'    => $subject,
 'post_content'  => $message,
 'post_status'   => 'publish',
 'post_type'   => 'solicitud',
);
  $post_id = wp_insert_post( $my_post , true);
  if ( is_wp_error($post_id) ) {
    autorizacion_response("ERROR", "No se ha podido cargar la solicitud: <br/><br/>" . $post_id->get_error_message());
}
  
  # Envío de mail
  else {
    
    $subject .= " - " . $post_id;

    $sent = wp_mail($to, utf8_decode($subject), $message, $cabeceras);
if($sent) 
    autorizacion_response("OK", "Solicitud de autorización enviada.");
else 
    autorizacion_response("ERROR", "No se ha podido enviar el correo electrónico: <br/><br/>" . error_get_last()["message"]);
    
    }
 
  }


function autorizacion_response($tipo, $mensaje){
    global $response;
    $response = "<div class='mensaje{$tipo}'>{$mensaje}</div><br/>";
  }


?>


<?php get_header(); 
/*


El resultado

Sin error:


Con error:



El post creado:


El mail recibido



Ir a Parte 5.