Contenido

Deshabilitar el editor HTML de nuestro WordPress

19 ene

+ 7

Aunque sin él yo no podría escribir mis artículos, es posible deshabilitar el editor HTML de nuestro WordPress de una forma sencilla con alguna de estas opciones:

1) CSS: La opción con más estilo (¿lo pillais? :P)

Sin duda se trata de la solución más rápida y sencilla ya que simplemente tendremos que añadir un estilo CSS al panel de administrador.

// Añadir el CSS directamente
function removeHTMLEditorCSS(){
 echo '<style type="text/css">#editor-toolbar #edButtonHTML, #quicktags {display: none;}</style>';
}

add_action('admin_head', 'removeHTMLEditorCSS');

// Añadir un fichero CSS externo
fichero: removeHTMLEditor.css
#editor-toolbar #edButtonHTML, #quicktags {display: none;}

wp_register_style('removeHTMLEditorCSS', '/ruta/css/removeHTMLEditor.css');
wp_enqueue_style('removeHTMLEditorCSS');

2) Javascript: La más rápida

Desde Javascript podemos borrar directamente el botón y no permitir usar esta opción:

function removeHTMLEditorJS(){
 echo 'jQuery(document).ready(function($) {
         $("#edButtonHTML").remove();
       });';
}

add_action('admin_footer', 'removeHTMLEditorJS');

3) PHP: La más limpia

En las dos anteriores, aunque son efectivas, dejamos la opción de recuperar la opción directamente desde el mismo navegador, desde PHP podemos eliminar el botón dejando la opción perfectamente deshabilitada.

function my_default_editor() {
 $r = 'tinymce'; // html or tinymce
 return $r;
}
add_filter( 'wp_default_editor', 'my_default_editor' );

// Versión reducida
add_filter( 'wp_default_editor', create_function('', 'return "tinymce";') );

Conclusión

Siempre que puedas estas cosas, deberían ir en un fichero de configuración alojado en el servidor y todas las opciones son igual de válidas.

Truco del campo oculto antispam para WordPress más fácil todavía

4 dic

+ 13

Este artículo hace ya más de un año que comencé a escribirlo y hoy que he tenido unos minutos para repasarlo y modificar un poco el código lo termino.

Hace ya mucho tiempo, Jose Ramón (Manz) publicó en Emezeta un sistema bastante ingenioso para capear el problema del SPAM en nuestros blogs.

El sistema

antispam3
(Ver Imagen)

El sistema, se basa en pensar de forma dual a la hora de implementar el formulario de comentarios de tu blog (que apartir de este momento, va a ser WordPress), y barajar la idea de que un robot pueda rellenar los campos automáticamente haciendo que sus comentarios entraran como un comentario normal. Akismet, y demás plugins antispam, tienen una gran lista de URL’s, agentes de usuarios, emails e IP’s que comprueban para comprobar que un robot es malicioso o no, pero estos sistemas, como ya bien sabemos, no son del todo eficaces. Por eso, hemos de engañar al robot :D

¿Como lo engañamos?

La propuesta de Manz, es la de añadir un campo oculto (mediante CSS) con el nombre del elemento destinado para el nombre del usuario, en el caso de WordPress usaremos author, con un valor X predefinido.

<input type="text" name="author" value="X" class="oculto" />
// CSS
input.oculto {display:none;}

Este campo, será el señuelo que los robots editarán automáticamente al procesar la página, principalmente por que es un <input /> y además se llama author, lo que hace complicado saber si esa página lo tiene implementado o es una trampa.

Para los usuarios, incluiremos un nuevo elemento <input /> con un nombre a nuestra elección.

<input name="nombrebueno" type="text" class="author" />

El usuario, verá este campo y será en el que introducirá su nombre de usuario. A simple vista podemos ver el problema que nos encontramos al realizar este cambio, el nombre del usuario siempre será X, ya que WordPress está preparado para leer author como nombre de usuario, y evidentemente no conoce el campo nombrebueno que hemos creado nosotros.

Por este motivo hemos de modificar el código de WordPress para añadir unas pocas líneas (voy a explicar como lo tenía yo antes de implementar la funcionalidad que veremos abajo):

wp-config.php
define("SPAM_CONTROL", "kaminitos"); // No sé por que puse eso...
wp-comment-post.php
$comment_author       = ( isset($_POST['author']) )  ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
$comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

// Añadimos el control del campo nuevo
if ($_POST["author"] != SPAM_CONTROL) die("SPAM");
$comment_author       = ( isset($_POST['secure']) )  ? trim(strip_tags($_POST['secure'])) : null;

Se puede hacer más sencillo, editando únicamente el fichero wp-comment-post.php, pero de esta forma tengo control sobre lo que aparece en el campo oculto.

Evidentemente, este sistema, me obliga a añadir esas dos líneas de código cada vez que actualizo WordPress, lo que se convierte en algo, que aunque no es laborioso, es muy pesado. Para evitar tener que modificar el código de WordPress en cada actualización, yo propongo este código.

Sistema antispam de campo oculto más cómodo :D

// Mensaje que mostramos a los SPAM
define('MESSAGE', 'SPAM!!!');
// Nombre del campo que usaremos para alojar el verdadero nombre del usuario
define('NOMBRE_CAMPO', 'secure');
// Clave única que será modificada por el bot
define('WP_ANTI_SPAM', 'kko');

add_filter('pre_comment_author_name', '_pre_comment_author_name');
function _pre_comment_author_name($comment_author_name = ''){
 // Devolvemos el nombre del autor sinó estamos pasando los campos necesarios
 if (!isset($_POST['author'], $_POST[NOMBRE_CAMPO])) return $comment_author_name;

 // Matamos el proceso
 if (isset($_POST['author']) && $_POST['author'] != WP_ANTI_SPAM) die(MESSAGE);

 // Cambiamos el nombre del author
 global $wpdb;
 return $wpdb->escape(trim(strip_tags($_POST[NOMBRE_CAMPO])));
}

function get_anti_spam_input($comment_author){
 return '<input type="hidden" name="'.NOMBRE_CAMPO.'" value="'.esc_attr($comment_author).'" />';
}

function anti_spam_input($comment_author){
 echo get_anti_spam_input($comment_author);
}

function get_author_input($comment_author){
 return '<input type="hidden" name="author" value="'.WP_ANTI_SPAM.'" />';
}

function author_input($comment_author){
 echo get_author_input($comment_author);
}

Este código, lo incluimos en el fichero functions.php de nuestro theme. Como vemos en la parte superior, tenemos 3 define() que nos permiten declarar 3 variablesconstantes que nos hará nuestro sistema más personalizable. Después, vemos una función que se aplica al filtro pre_comment_author_name en la que comprobamos que el campo oculto no ha sido modificado. En caso de detectar el cambio, matamos el proceso en ese mismo momento, mostrando el mensaje que hayamos definido previamente.

En caso de que el campo oculto no haya sido modificado, entonces reemplazaremos el nombre de usuario por el del campo visible para el usuario. Este sistema nos permite intercalar este proceso y hacer que en caso comentario válido, continúe sin ningún problema.

Modificar el theme

Después para facilitar el trabajo de modificación del theme, he añadido unos métodos para pintar (o devolver como cadena) los elementos <input /> que intervienen en este sistema. Usaremos, como siempre, el theme default de WordPress, y usaremos únicamente el fichero comment.php del mismo.

Básicamente, el único cambio que tendremos que realizar es el cambio de esta línea:

<input type="text" name="author" id="author" value="<?php echo esc_attr($comment_author); ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> />

Por estas dos

<?php
 author_input($comment_author);
 anti_spam_input($comment_author);
?>

Estos dos funciones se encargarán de pintar los elementos <input /> que vamos a necesitar. Evidentemente, si tu theme tiene estilos o clases aplicados a estos elemento tendrás que modificarlos en las funciones get_anti_spam_input() get_author_input() del fichero functions.php que hemos incluido antes.

Sencillo, ¿verdad? :D

Resultado

El resultado, os puedo garántizar que es 100% satisfactorio y que junto a Akismet el SPAM (por el momento) deja de ser un problema.

Excerpt2Content, muestra todo el contenido a tus usuarios

4 nov

+ 12

Muchos son los mails que he recibido pidiendome una solución al problema de que el theme de su WordPress muestra solo una pequeña porción del contenido. Esto es debido a que el theme que están usando está haciendo uso de la función the_excerpt() en lugar de the_content().

La diferencia es que la primera nos muestra únicamente el extracto del artículo, sino lo hemos redactado este cogerá las primeras 55 palabras (por defecto) del artículo, eliminando tags HTML como <img />, <strong />,… haciendo que el contenido tenga un aspecto de “extracto” del original. Generalmente este contenido está seguido de unos puntos suspensivos indicando que el artículo no está completo ([…]). Lo que hace que el usuario tenga que acceder a leer el artículo directamente para ver el contenido completo.

Por otro lado, the_content() nos muestra el contenido completo y nos permite cortarlo donde queramos mediante el uso de 2 tags:

  • <!--more-->: Añade un texto de “Leer Más” (que puedes cambiar) al final de la página principal y que te lleva al artículo completo.
  • <!--nextpage-->: Te permite generar una paginación y cada tag generará una página nueva.

anieto2k_excerpt
(Ver Imagen)

Muchos themes traen the_excerpt() por defecto, ya que la teoría dice (y la práctica lo demuestra) que al mostrar parte del contenido, el usuario genera un mayor número de páginas vistas (una de la página principal y una por cada noticia que quiere ver completa) pero en muchos casos quieres mostrar imágenes o simplemente no quieres que el usuario tenga que acceder a ver un post completo para leer toda la noticia, en estos casos tenemos varias soluciones.

1) Reemplazar the_excerpt() por the_content()

La primera solución sería la de buscar en el theme que estamos usando la palabra the_excerpt() y reemplazarla por the_content() haciendo que siempre se muestre el contenido.

2) Añadir filtro a the_excerpt()

Otra solución más sencilla y fácil de deshacer sería la de añadir un pequeño (muy pequeño) filtro a la llamada the_excerpt() para hacer que nos devuelva el contenido completo.

function excerpt2content(){
 return get_the_content();
}
// Añadimos excerpt2content al filtro
add_filter('get_the_excerpt', 'excerpt2content');

Este código, puede ir alojado en el fichero functions.php del theme y si queremos volver al estado inicial, simplemente tendremos que eliminar estas 4 líneas para volver a la normalidad :D

Ordenar artículos por orden de comentarios más recientes

2 nov

+ 1

En Stackoverflow descubro un sistema sencillo para ordenar nuestros posts por orden de comentarios más recientes. Esto nos permitirá mostrar los últimos artículos en los que hay actividad.

<?php

$query = 'select wp_posts.*, max(comment_date) as comment_date
 from $wpdb->posts wp_posts
 right join $wpdb->comments
 on id = comment_post_id
 group by ID
 order by comment_date desc
 limit 10';

$results = $wpdb->get_results($query) or die('!');
foreach ($results as $result):

?>
[Aquí el template del post]
<?php endforeach ?>

Una interesante forma de mostrar de una forma dinámica por parte de la interacción de los usuarios los posts que han sido comentados recientemente.

Permisos y capacidades en WordPress

27 sep

+ 10

Para que podamos administrar nuestro blog lo más correctamente posible, y que cada uno de los usuarios encaje en un rol y no pueda acceder a funcionalidades que no estén dentro de las capacidades permitidas para ese rol, WordPress dispone de un sistema con el que manejar este control de permisos es posible.

1) Roles

Lo primero que debemos saber es la cantidad de roles disponibles dentro de una instalación de WordPress.

  1. Administrador
  2. Editor
  3. Autor
  4. Contribuidor
  5. Suscriptor

Estos 5 usuarios dividen una lista de 10 posibles niveles que podemos emplear como usuarios.

Continua —>

Comprobando si un plugin está activo en WordPress

7 sep

+ 0

WP-Engineer, muestra un interesante código que nos permite comprobar si un plugin está activo o no. Ideal para reusar código de otros plugins desde los nuestros.

// Cargamos todos los plugins activos
$plugins = get_option('active_plugins');

// Plugin que deseamos comprobar
$required_plugin = 'debug_queries/debug_queries.php';

// booleano que activamos si el plugin está activo
$debug_queries_on = FALSE;

// Comprobamos que el plugin está entre los activos.
if ( in_array( $required_plugin , $plugins ) ) {

 // Activamos el booleano en caso de estar activo.
 $debug_queries_on = TRUE;
}

Muy interesante y práctico.

Peticiones HTTP con WordPress

17 ago

+ 3

En PlanetOzh hacen un interesante tutorial de como lanzar peticiones HTTP mediante la API de WordPress. Desde la versión 2.7, disponemos de un interfaz muy sencillo para lanzar peticiones HTTP a servicios externos.

Peticiones HTTP

El fichero http.php que podemos encontrar en wp-includes/ nos permite hacer llamadas tan sencillas como estas:

$request = new WP_Http;
$result = $request->request( 'http://some.url.you-need.to-fetch' );

Como podemos ver, hacer las llamadas es realmente sencillo. Pero aquí no se queda la cosa:

Peticiones GET

Tambien podemos lanzar peticiones GET informando los parámetros como parte de la URL.

$url = 'http://search.twitter.com/search.json?q=rabbits';
$request = new WP_Http;
$result = $request->request( $url );
$json = $result['body'];

Peticiones POST

Si por lo contrario queremos enviar parámetros por POST, simplemente tendremos que cambiar la forma de enviarlos:

$body = array(
 'nick' => 'ozh',
 'mood' => 'happy'
);
$url = 'http://your.api.url/';
$request = new WP_Http;
$result = $request->request( $url, array( 'method' => 'POST', 'body' => $body) );

Respuesta

Una vez lanzada la petición, obtendremos una serie de parámetros con información sobre la respuesta del servidor externo.

  • headers': Un array con las cabeceras de la respuesta
  • 'body': La respuesta del servidor.
  • 'response': Un array con los códigos  HTTP  de respuesta generalmente array('code'=>200, 'message'=>'OK')
  • 'cookies': Un array con información de la cookie.

Ejemplo práctico

// Datos de Twitter
$username = 'joe'; // Twitter login
$password = '123456'; // Twitter password
$message = "Publicando desde la API";
// Lanzamos la petición HTTP
$api_url = 'http://twitter.com/statuses/update.xml';
$body = array( 'status' => $message );
$headers = array( 'Authorization' => 'Basic '.base64_encode("$username:$password") );
$request = new WP_Http;
$result = $request->request( $api_url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers ) );

Estas pocas líneas, nos permiten enviar a Twitter un actualización directamente desde nuestro WordPress, simplemente tendremos que informar los datos del usuario y lanzar la petición a la URL que obtenemos en la API de Twitter.

¿Como y donde puedo extender WordPress?

22 may

+ 14

¿Estás pensando en añadir una funcionalidad a WordPress y no sabes por donde empezar a extenderlo? ¿te gustaría hacer las tareas más comunes de tu día a día con el blog sean más fáciles? Pues solo necesitas conocer, como actuar frente a esta pregunta.

¿Como y donde puedo extender WordPress?

WordPress, por defecto, nos presenta 3 formas de extender las funcionalidades de WordPress:

  1. Mediante actions.
  2. Mediante filters.
  3. Mediante declaración de funciones.

Todas ellas sin necesidad de tocar el código propio del núcleo de WordPress, evitando así tener que hacer modificaciones cada vez que actualicemos nuestro Wordpres.

Extender WordPress mediante Actions

Uno de los métodos que podemos usar y que están disponibles el la API de WordPress es el uso de actions. Como su nombre indica, actions son las acciones definidas por el equipo de WordPress en las que podremos añadir nuestras propias funcionalidades.

<?php add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1); ?>

Esta función que tanto hemos visto en plugins o código que hemos mostrado para extender WordPress, hace una función muy importante y cada parámetro aporta un grado más de personalización.

  • $tag: Nombre del action (ahora los veremos).
  • $function_to_add: Nombre de la función que ejecutaremos al activarse el action ($tag).
  • $priority: Prioridad de ejecución, de menor a mayor.
  • $accepted_args: Aceptamos (o no) el paso de parámetros a nuestra función.

Ejemplo:

<?php
define("TWITTER_USER", 'username');
define("TWITTER_PASS", 'password');
define("TWITTER_MESSAGE", '[Post] %name%: %link% <-- %title%');

function update_twitter($post_ID = '')  {
	$curl_handle = curl_init();

	// Nombre del blog
	$message = str_replace("%name%", get_bloginfo('name'), TWITTER_MESSAGE);

	// Cargamos el post
	$post = get_post($post_ID);

	// Enlace y título
	$message = str_replace("%link%", $post->guid, $message);
	$message = str_replace("%title%", $post->post_title, $message);

	// Enviamos el Tweet
	curl_setopt($curl_handle, CURLOPT_URL, 'http://twitter.com/statuses/update.xml');
	curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
	curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($curl_handle, CURLOPT_POST, 1);
	curl_setopt($curl_handle, CURLOPT_POSTFIELDS, "status=$message";
	curl_setopt($curl_handle, CURLOPT_USERPWD, TWITTER_USER.":"TWITTER_PASS);
	$buffer = curl_exec($curl_handle);
	curl_close($curl_handle);
  return $post_ID;
}
// Añadimos funcionalidad a publish_post
add_action('wp_insert_post', 'update_twitter');
?>

No le hagais mucho caso al código, es ilustrativo y puede producir un funcionamiento erroneo en WordPress

En este código, vemos lo sencillo que es añadir una funcionalidad a nuestro WordPress. En este caso, estamos añadiendo al action wp_insert_post la función update_twitter(). En este caso, una vez hayamos pulsado el botón de publicar en nuestro WordPress, este ejecutará la función update_twitter() y esta enviará a Twitter un aviso de un nuevo artículo.

¿Donde se extienden los actions?

Este ejemplo solo debe servir para hacernos una idea de como añadir funcionalidades a nuestro WordPress, lo interesante es que debemos conocer los actions disponibles para extender nuestro WordPress.

La API nos muestra un listado bastante detallado de los action disponibles. Pero si tenemos alguna duda lo mejor es siempre revisar el código.

En el fichero post.php del directorio wp-includes/ podemos encontrar en la línea 1534 la llamada do_action() que lanzará las acciones asociadas al nombre wp_insert_post.

[...]
	wp_transition_post_status($post_status, $previous_status, $post);

	if ( $update)
		do_action('edit_post', $post_ID, $post);

	do_action('save_post', $post_ID, $post);
	do_action('wp_insert_post', $post_ID, $post);

	return $post_ID;
}
[...]

do_action(), es la función encargada de lanzar el array de acciones asociadas a la key definida por el primer parámetro. En este caso wp_insert_post, lanzará nuestra función que recibirá por parámetro $post_ID que estamos pasando con el do_action(). Suplementaríamente estamos paando un segundo parámetro con $post, que contiene el objeto con los valores que componen el post que acabamos de insertar en la BD.

Revisando el código de WordPress encontraremos una infinidad de do_action() que permiten extender WordPress en casi todos los puntos en los que queramos añadir una nueva funcionalidad.

Mediante filters

Los filters, están mucho más extendidos por el núcleo de WordPress. Como su nombre indica, sirven para filtrar variables que nos podemos encontrar en cualquier funcionalidad de WordPress.

Al igual que los actions, podemos extender la funcionalidad de nuestro WordPress en ellos.

Ejemplo

<?php
	function noShowIPs($IP = '') {
		// Mostramos solo los primeros 7 carácteres
		return substr($IP, 0, 7);
	}
	// Aplicamos el filtro
	add_filter('get_comment_author_IP', 'noShowIPs');
?>

En este pequeño ejemplo, indicamos que no queremos mostrar la IP completa del usuario que comenta en nuestro WordPress cuando se usa la función get_comment_author_IP(). Mediante un substr() devolvemos los 7 primeros dígitos de $IP.

¿Donde se extienden los filters?

Al igual que los actions, los filters están en los ficheros que componen WordPress. En el ejemplo que hemos montado previamente hemos hecho uso de get_comment_author_IP() que se encuentra en el fichero comment-template.php del directorio wp-includes/. Si nos dirigimos a la línea 173 veremos el siguiente código.

[...]
function get_comment_author_IP() {
	global $comment;
	return apply_filters('get_comment_author_IP', $comment->comment_author_IP);
}
[...]

apply_filters() es el do_action() de los filters, ya que se encarga de recorrer el array de filtros definidos para la key establecida y los va aplicando uno trás otro. En nuestro caso, recibimos la IP del comentarista para posteriormente devolver una IP recortada.

Mediante declaración de funciones

Esta forma, es quizas la más obvia, pero no por ello deja de ser potente.

En muchos casos, usamos plugins por que son más fáciles de instalar, pero bien bien, podrían ser sustituidos por funciones alojadas en ficheros concretos de WordPress. Obtendríamos el mismo resultado.

Ejemplo

<?php
function ult_comments($cuantos = 5) {
    global $wpdb;
    $comentarios = $wpdb->get_results($wpdb->prepare("
                            SELECT  wc.comment_date, wc.comment_author, wp.post_title, wp.guid, wp.comment_count
                            FROM ".$wpdb->comments." as wc, ".$wpdb->posts." as wp
                            WHERE wc.comment_post_ID = wp.ID
                            AND  wc.comment_approved = '1'
                            AND wc.comment_type = ''
                            ORDER BY wc.comment_date DESC LIMIT 0,%d;",$cuantos ));
    foreach ($comentarios as $comentario) {
			echo '<li>
				<a href="'.$comentario->guid.'" title="'.$comentario->post_title.'">'.$comentario->post_title.'
				  <small>'.$comentario->comment_count.'</small>
                                </a>
        			<small>Por '.$comentario->comment_author.' hace '.since_date($comentario->comment_date).'</small>
                              </li>';
    }
}
?>

Uno de los puntos recomendados para alojar este tipo de funciones, es el fichero functions.php de nuestro theme. Todas las funciones definidas en él serán visibles desde nuestro themes, plugins, …

En este caso, definimos esta función que nos devolverá los últimos 5 comentarios del blog en el fichero functions.php. Una vez definida, podremos usarla en nuestro theme, donde más rábia nos dé, simplementa llamándola.

<ul>
<?php ult_comments(10); // 10 últimos comentarios ?>
</ul>

¿Que podemos hacer con todo esto?

Pues lo que queramos, podemos hacer que WordPress se transforme a nuestra voluntad. Nos permite desde añadir funcionalidades que nos ayudan en el día a día, hasta cambiar el concepto de blog por el de CMS, Miniblog, …

Edito:

NUNCA SE DEBE TOCAR EL CÓDIGO DE WORDPRESS

Este artículo intenta mostrar las diferentes formas de extender WordPress, sin necesidad de tocar los ficheros que componen el núcleo de WordPress, osea la raíz y wp-includes/ y wp-admin/. Para poder extenderlo puedes hacer uso de los fichero functions.php de tu theme o generar un plugin con dichas funcionalidades dentro.

La limitación, está en nuestra cabeza :D

wp_insert_post(), la insercción de posts en WordPress

13 may

+ 6

WordPress está pensado para que uno o varios autores introduzcan entradas en él. Y despues los usuarios puedan comentar estas entradas, pero previamente estas deben estar introducidas sinó, el concepto Blog en sí, no tiene ningún sentido. Pero WordPress va un poco más allá y nos permite hacer que el sistema de insercción de entradas no esté, necesariamente, vinculado al WordPress.

Para ello, tenemos la función wp_insert_post(), una función a la que le pasaremos los parámetros que compondrán una entrada en nuestro Blog.

Los chicos de WPEngineer.com hacen un repaso a estos parámetros y nos muestran un sistema muy sencillo de realizar insercciones ajenas a nuestro Blog. Está claro que este sistema es peligroso, y que requiere que el usuario esté logueado para realizar la insercción.

wp_insert_post()

wp_insert_post($postarr = array())

Vemos que esta función recibe un parámetro, un array que estará compuesto con los parámetros necesarios para formar una entrada.

Los valores de este parámetro pueden ser:

<?php
$post = array(
  'comment_status' => [ 'closed' | 'open' ] // 'closed' no permite comentarios.
  'ID' => [ <post id> ] // únicamente si estamos actualizando un comentario.
  'menu_order' => [ <order> ] //Si es una nueva página, especifica el orden en el que debería aparecer
  'page_template => [ <template file> ] // Indica el template para la página.
  'ping_status' => [ ? ] // Activamos o desactivamos los pingbacks
  'pinged' => [ ? ] //?
  'post_author' => [ <user ID> ] //ID del usuario
  'post_category => [ array(<category id>, <...>) ] // Categorías del post.
  'post_content' => [ <the text of the post> ] // Contenido del post.
  'post_date' => [ Y-m-d H:i:s ] // Fecha de creación del post.
  'post_date_gmt' => [ Y-m-d H:i:s ] // Fecha de creación en GMT.
  'post_excerpt' => [ <an excerpt> ] // El resumen del post.
  'post_parent' => [ <post ID> ] // El post padre.
  'post_password' => [ ? ] // El password del post.
  'post_status' => [ 'draft' | 'publish' | 'pending' ] // Estado de la publicación
  'post_title' => [ <the title> ] // Título del post.
  'post_type' => [ 'post' | 'page' ] // Post o Página.
  'tags_input' => [ '<tag>, <tag>, <...>' ] // Tags asociados al post.
  'to_ping' => [ ? ] //?
);
// Insertamos el post
wp_insert_post( $post );
?>

Conociendo esto, ya podemos usar funcionalidades de WordPress fuera de WordPress.

// Incluimos las funcionalidades de WordPress
require( '../my_wordpress_install_root/wp-load.php' );

// Creamos el array
$my_post = array();
$my_post['post_title']    = 'Mi post';
$my_post['post_content']  = 'This is my post.';
$my_post['post_status']   = 'publish';
$my_post['post_author']   = 1;
$my_post['post_category'] = array(0);

// Insertamos el post en la base de datos
wp_insert_post( $my_post );"

Ocultar contenido a los usuarios no registrados

13 may

+ 12

AyudaWordpress nos muestra un tutorial muy interesante para ocultar contenido a los usuario no registrados mediante el uso de ShortCodes.

Y es que con unas pocas líneas en WordPress se pueden hacer cosas realmente útiles y potentes.

// Functions.php
add_shortcode( 'visitante', 'shortcode_para_visitantes' );
function shortcode_para_visitantes( $atts, $content = null ) {
if ( ( is_user_logged_in() && !is_null( $content ) ) || is_feed() )
return $content;
return 'Para ver este contenido, <a href="' . site_url('wp-login.php?action=register', 'login') . '">debes estár registrado</a>';
}

Una vez añadido a nuestro functions.php podremos usar [visitante][/visitante] para ocultar el contenido que queramos a los visitantes no registrados.

[visitante]
Aquí pones lo que te apetezca que quieras que vean solo los no registrados
[/visitante]

Más opciones en AyudaWordpress.