WordPress: Refresh W3 Total Cache when saving or updating a PODs item

When you create or edit a PODs element in Worpdress, W3TC refresh the cache of the modified page. But sometimes you also show its content on home page or other kind of page, and in those cases you need to flush the cache through the plugin admin panel. I was tired of doing this task every time I update something, so now I have a code to do it automatically.

You have to add this code in your function.php theme file.

// REFRESH W3 Total Cache AFTER SAVE/UPDATE
function refreshCacheOnSave($pieces, $is_new_item) {
    if (function_exists('w3tc_pgcache_flush')) {
        w3tc_pgcache_flush();
        w3tc_minify_flush();
    }
}

// refresh cache after PODs creation/save/update
add_action('pods_api_post_save_pod_item', 'refreshCacheOnSave', 10, 2);
add_action('pods_api_post_create_pod_item', 'refreshCacheOnSave', 10, 2);
add_action('pods_api_post_edit_pod_item', 'refreshCacheOnSave', 10, 2);

Pods WordPress > Mi guía

Como ya sabéis me encanta usar Pods Framework para WordPress, pero siempre gasto demasiado tiempo volviendo a buscar como hacer las queries, mostrar ciertos campos, … Por este motivo, voy a intentar crearme una guía con las porciones de código que más uso en mis proyectos, y así poder usarla como guía de consulta en el futuro. Con un poco de suerte, quizás también sea útil para ti.

Tipos de Pods

Yo suelo usar dos: Custom Post Type (ampliar los post habituales de Worpdress) o los Advanced Content Type (tablas nuevas que no extienden de ningún elemento de WordPress)

Según usemos uno cambiará ligeramente las queries de busqueda:

Custom Post Type

$params = array(
  'where' =>   't.post_status="Publish"',
  'orderby' => 'position.meta_value+0 ASC',
  'limit' =>   -1  // -1 = no limit in items per page
);

$mypod = pods( 'podsTypeName', $params );
$params = array(
  // show it if wordpress status is publish & it belongs to current type
  'where' => 't.post_status="Publish" AND podTypeName.field_id="'.$typeId.'"'
);

Advanced Content Type

$params = array(
  'where' => 'active=1',
  'orderby' => 'position+0 ASC',
  'limit' => -1  // -1 = no limit in items per page
);

$mypod = pods( 'podsTypeName', $params );

Loop

while ( $mypod->fetch() ) {
  echo $mypod->data->row['ID'];
  echo $mypod->display('title');

  echo wpautop($mypod->display('content'));
    // Changes double line-breaks in the text into HTML paragraphs (<p>...</p>)

  // multiselect field:
  echo $mypod->get_field('categories');
  $array = $mypod->field('categories.category_id');
     foreach ($array as &$item) {
       echo $item;
     }

  // Image
  $portfolio_image = $portfolio->get_field('image');
  echo $portfolio_image[0]['guid'];
}
// Total records in the loop
$openingData->total();

Single Records

$slug = pods_v( 'last', 'url' );
// antes se usaba: $slug = pods_url_variable('last');

$params = array( 'where' => 'post_name = "'.$slug.'"' );
$mypod = pods( 'podsTypeName', $params );

Poco a poco iré ampliando estas porciones de código.

Espero que os sea de ayuda

Campos de fecha

$datetime = explode(" ", $mypod->display( 'start_date' ));
$date = explode("-", $datetime [0]);
$time = explode(":", $datetime [1]);
echo date(get_option('date_format'), mktime($time[0], $time[1], 0, $date[1], $date[0], $date[2]));

Mi experiencia de wordpress Multiidioma con el plugin Polylang

En varias ocasiones he tenido que crear sitios wordpress en varios idiomas. Hasta ahora venía usando el plugin WPML, pero el hecho de que se haya convertido en un plugin de pago y que me surjieran algunos bugs, me hizo buscar alguna alternativa.

Al final he dado con el plugin Polylang, y de momento mi experiencia es muy buena. En la parte negativa puedo destacar la falta de documentación, que todavía se encuentra en una fase temprana de desarrollo (aunque su funcionamiento de momento es correcto), y que la integración con PODs no es todavía completa.

Algunos de mis problemas de momento:

Lo estoy usando junto con PODs, y al mostrar los registros de PODs muestra todos los que encuentran, sin importar el idioma:

En su día cree esta entrada en el foro de PODs


/*= GET CASES STUDIES */
$params = array(
'where' => 'active.meta_value = 1',
'orderby' => 'position ASC',
'limit' => 4
);

// Get the Pods object
$mypod = pods( 'case_studies', $params );

// Loop through the items returned
while ( $mypod->fetch() ) {
?>

<? echo $mypod->display( 'title' ); ?>
<? echo $mypod->display( 'short_description' ); ?>

Para solucionarlo he tenido que hacer esta modificación:


while ( $mypod->fetch() ) {
// it show all matched pods, from all language,
  // so we check if current pod is in current language
$post_id = $mypod->data->row['ID'];
$translated_post_id = pll_get_post($post_id, pll_current_language());

// if both id are equal, then it is in the right laguage
if ($post_id == $translated_post_id) {
?>

<? echo $mypod->display( 'title' ); ?>
<? echo $mypod->display( 'short_description' ); ?>

}
}

Link a la home page con el idioma correcto


<?= pll_home_url(); ?>

No se me muestran algunas páginas

Este es el error que más me preocupa, y estoy francamente preocupado por que se me pueda reproducir en producción

De repente (no se que desencadena el fallo) los links a las páginas de worpdress muestran el contenido del index.php en lugar de mostrar el page.php

Hasta ahora lo he podido solucionar desactivando y volviendo a activar los plugins de PODs, y de WordPress SEO

Configuración de WordPress para mejorar seguridad

Últimamente no dejo de hacer WordPress cada dos por tres, y es muy habitual que se repitan siempre los mismos problemas de unos a otros. He decidido redactar este artículo con los principales pasos que yo estoy siguiendo en mis proyectos para que WordPress tenga la mayor seguridad posible y de menos problemas de configuración.

wp_secure

(más…)

WordPress: Añade nuevas formas de contacto a los perfiles de usuario

Nunca entendí por que los perfiles de usuario de WordPress tenian esos campos de contacto ¿AIM, Yahoo IM…? Esta muy bien que los tenga, pero echaba en falta otros mas comunes como Twiiter, Facebook, Linkedin,…

Ahora gracias a la receta que he visto en WpRecipes.com he encontrado este método tan sencillo para poner añadir nuevas formas de contacto a los perfiles de tus usuarios.

Es suficiente con añadir este código al fichero function.php:

add_filter('user_contactmethods', 'my_user_contactmethods');

function my_user_contactmethods($user_contactmethods){
  $user_contactmethods['twitter'] = 'Twitter Username';
  $user_contactmethods['facebook'] = 'Facebook Username';

  return $user_contactmethods;
}

Convierte tu WP e-commerce Plugin en multi imagen

Estoy empezando a trastear con el Plugin de WordPress WP e-commerce y de momento me parece muy completo y sencillo.

En la tienda que estoy haciendo necesito que los productos que quiero vender tengan varias imagenes asociadas, y con la versión gratuita de este plugin esta opción esta capada. Podría comprar su version de pago, Gold Cart, que tiene dicha función y solo cuesta 40$, pero he preferido buscarme las castañas por mi cuenta, y tras pelearme un poco con el codigo lo he conseguido.

Tras investigar unas cuantas páginas para ver como podía convertir mi WP e-commerce plugin en multi imagen y ver que ninguna me funcionaba decidi crear una nueva función que me hiciera este trabajo.

Encontré una buena aproximación, pero la estructura de la base de datos ya no era la misma, así que hice unos cambios:

Añadir este codigo en el fichero functions.php

// function to receive all the images related to one product
function get_all_images($product) {
	global $wpdb;
	return $wpdb->get_results( "SELECT guid, menu_order FROM wp_posts WHERE post_type='attachment' AND post_parent=$product ORDER BY menu_order ASC" );
}

Y en la pagina donde se presenta el detalle de mi producto, wpsc-single-product.php añado esto donde se mostraba la imagen individual:

// multimage product hack for e-commerce
if ( function_exists( 'get_all_images' ) ) { // check if function exists
	foreach ( get_all_images(wpsc_the_product_id()) as $product_image )
		{
		echo "<img src='".$product_image->guid."' alt='".wpsc_the_product_title()."' />";
		}
} else {
  // simple image
}

Con estos dos sencillos pasos ya puedes mostrar tantas imagenes como quieras a tus productos en el WP e-commerce Plugin.

Ahora solo queda presentarlo de una manera mas bonito.

¿ Conocéis algún sistema mejor?

Pods CMS, mejora tu WordPress

Pods es un plugin que convierte tu WordPress en un completo CMS. Cierto que WordPress ya es un CMS, pero se queda un poco limitado con los tipos de contenido que puedes crear.

Existen plugins como Custom Field Template o los propios Custom Fields de WordPress para añadir campos especificos a tus post, y esto está muy bien para muchos casos, pero yo prefiero usar Pods, ya que es mucho mas completo y cambia completamente la forma de trabajar con tus entradas.

Los Custom Fields son muy faciles de implementar, pero pueden ser poco intuitivos cuando nuestros clientes son los que tienen que introducir el contenido en la web. Con Pods haremos la vida mucho más facil a los editores de la web.

INSTALACIÓN

Se instala igual que cualquier otro plugin. Basta con descargar el plugin, descomprimirlo en la carpeta plugins y activarlo.

Puede que tengas que editar el fichero .htaccess para que el plugin funcione bien con las URLs amigables. El plugin te dirá que codigo debes de introducir y donde.

Una vez instalado, se añadirá en el menu izquierdo con los siguientes enlaces:

  • Manage Content: Ver el contenido de las tablas de Pods
  • Pachage Manager: Herramienta de exportación e importación
  • Menu Editor: Te permite crear una estructura de navegación como en las páginas de WordPress

CREAR UN POD

Es conveniente crear un Pod cuando una sección, o incluso una página, requiere campos especificos.

En mi caso, voy a crear un Pod para la sección Portfolio de mi web.

El nombre del pod debe de estar en minúsculas y no tener caracteres especiales ni espacios.

Una vez creado, verás el gestor de Pods, donde pondrás los campos que tendrá esta sección. Por defecto creara un campo “name”, que es obligatorio.

Los tipos de campos diponibles son:

  • Date
  • Number
  • Boolean: Renderiza un checkbox
  • Single Line Text: renderiza un input
  • Paragraph Text: Textarea con botones de formato HTML
  • Code: Campo para introducir código
  • File Upload: Permite añadir ficheros a la WordPress Media Library
  • Permalink: Genera el slug para la entrada
  • Relationship: Permite enlazar la entrada con otra entrada Pod o WordPress (pagina, post, usuario)

Con los atributos, puedes definir el campo como único o requerido.

Puedes añadir tantos campos como sean necesarios. En nuestro caso de ejemplo para el portfolio, añadiremos los siguientes:

  • intro: Single Line text
  • description: Paragraph text
  • image: Fule upload
  • tasks: Single Line text
  • endDate: Date
  • siteUrl: Single Line text
  • position: Number

Machine Name es el identificador del campo, no puede tener espacios ni caracteres especiales. Label es la descripción del campo que verá el usuario.

GESTIONAR EL CONTENIDO

Una vez creado el Pod se añadira un link en el menu de la izquierda (en nuestro caso Add Portfolio)

Si hacemos clic en este link, podremos gestionar su contenido.

Una vez creado, tendremos acceso al listado con todas las entradas creadas para este grupo

Para integrar Pods mas dentro de nuestro WordPres podemos marcar “Top Level Menu?” en la administración del Pod. Esto hará que nuestro Pod se muestre en la barra de menus de la adminsitracion de WordPress.

Otra útil caracteristica de este plugin es la posibilidad de limitar el acceso a ciertos apartados del plugin segun el rol de usuario.

MOSTRAR EL CONTENIDO DE TUS PODS EN TU TEMA

Aunque el plugin tiene una seccion llamada Page para gestionar esto, yo prefiero editar los ficheros de mi tema para mostrar la información de mis Pods.

Tendremos que añadir el siguiente código:

<?PHP
findRecords('position ASC');

$total_portfolio = $portfolio->getTotalRows();
if( $total_portfolio > 0 )
{
// Retrieves the next record from our object
?>
fetchRecord() ) : ?>

get_field('id');
$portfolio_name     = $portfolio->get_field('name');
$portfolio_intro    = $portfolio->get_field('intro');
$portfolio_description	= $portfolio->get_field('description');
$portfolio_image  = $portfolio->get_field('image');
$portfolio_tasks  = $portfolio->get_field('tasks');
$portfolio_endDate  = $portfolio->get_field('endDate');
$portfolio_siteUrl  = $portfolio->get_field('siteUrl');
$portfolio_position = $portfolio->get_field('position');

// data cleanup
$portfolio_description       = wpautop( $portfolio_description );
$portfolio_image     = $portfolio_image[0]['guid'];
?>

<!-- show data -->
<div id="portfolio_<?= $portfolio_id; ?>"><img src="<?= $portfolio_image; ?>" alt="" /></div>


CAMPOS TIPO RELATIONSHIP

Estos campos tienen un gran potencial, ya que podemos relacionar una entrada con cualquier otra entrada, pod, o pagina del wordpress.

Más Información

Para obtener mas información sobre este tipo de campos, podeis leer este articulo.

Para obtener más información, os recomiendo leer estos ariculos, en los que yo me h basasdo:

  • Introduction to pods cms wordpress
  • Pods basics installation and setup
  • Pulling pods data
  • How to use pick columns relationships in pods
  • Pods pagination sorting

Gestiona los menús en WordPress con wp_nav_menu

administración del plugin

Después de pegarme con la ordenación de las categorías he descubierto la funcion wp_nav_menu().

La funcion wp_nav_menu() ha aparecido con WordPress 3, y con ella puede gestionar en profundidad los menús de tu WordPress. Podrás crear los apartados de menú que quieras, ordenarlos a tu antojo y mostarlos como y donde quieras.

Hasta ahora, si querías gestionar el orden en el que mostrar las categorias tenías que recurrir a plugins como My Category Order o Category Order. Pero esto tenía problemas con plugins como el WordPress Multi Language (WPML)  si tenías la página multi-idioma.

Algunas de las cosas que puedes gestionar son:

  • El contenedor en el que se mostrara
  • Las clases que tendrá
  • El HTML con el que recubrir cada una de las secciones
  • Y mucho mas…

Un pequeño inconveniente, es que no todos los temas lo aceptan por defecto, aunque agrerar esta funcionalidad a tu tema es realmente fácil. Basta con añadir esta linea en el fichero function.php de tu theme:

add_theme_support( 'menus' );

Posteriormente tan solo tienes que añadir este código donde quieras que aparezca el menú:

<?php wp_nav_menu(array(
'container' => '',    // para que no tenga contenedor
'menu_id' => 'topMenu',    // id del menu
'link_before' => '<span>', // HTML previo al texto de cada sección
'link_after' => '</span>'    // HTML posterior al texto de cada sección
)); ?>

Y vosotros ¿Conoceis algún otro método para mostrar tus categorías en WordPress?