Sin duda, ha visto Temas y complementos de WordPress que afirman instalar automáticamente ‘datos ficticios’ cuando los instala, de modo que inmediatamente tiene un sitio web en pleno funcionamiento. Les mostraré un método para lograr esto usando solo funciones PHP.
Esto podría resultar útil si:
- Su tema o complemento requiere ciertas publicaciones o páginas.
- Desea proporcionar una instalación ficticia premium como se describe anteriormente.
- Quieres automatizar la creación de publicaciones.
- Solo quieres aprender.
En este tutorial crearemos una función simple para principiantes para lograr una solución de trabajo ‘rápida y sucia’. Más adelante, en un tutorial diferente, aprenderemos cómo extender lo que hemos aprendido aquí para crear un sistema de publicación robusto y fácil de usar.
Para aquellos de ustedes que prefieren jugar con código preexistente en lugar de leer todos los procedimientos, aquí está nuestra función final junto con un ejemplo de su uso y notas.
if ( ! function_exists( 'PostCreator' ) ) {
function PostCreator(
$name = 'AUTO POST',
$type = 'post',
$content = 'DUMMY CONTENT',
$category = array(1,2),
$template = NULL,
$author_id = '1',
$status = 'publish'
) {
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, '' );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
if ( $type == 'page' ) {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
function hbt_create_post() {
$post_data = array(
'post_title' => wp_strip_all_tags( POST_NAME ),
'post_content' => POST_CONTENT,
'post_status' => POST_STATUS,
'post_type' => POST_TYPE,
'post_author' => POST_AUTH_ID,
'post_category' => POST_CATEGORY,
'page_template' => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
if ( ! isset( $post ) ) {
add_action( 'admin_init', 'hbt_create_post' );
return $error_obj;
}
}
}
/* All available options for PostCreator()
PostCreator( 'TITLE' , 'POST TYPE' , 'POST CONTENT' , 'POST CATEGORY' , 'TEMPLATE FILE NAME' , 'AUTHOR ID NUMBER' , 'POST STATUS');
TITLE - HTML Stripped Out. Simple String.
POST TYPE - Post type slug. Eg 'post' or 'page'. Custom Post Types are supported.
POST CONTENT - Content of the Post/Page. HTML allowed.
POST CATEGORY - An array of the integer ID's of the category/categories you want to link to your post
TEMPLATE FILE NAME - File name of the template. Only for Pages. In the format 'file_name.php'.
AUTHOR ID NUMBER - Integer value. Default is 1.
POST STATUS - Available options; [ 'draft' | 'publish' | 'pending'| 'future' | 'private' | custom registered status ]
If successful, PostCreator() returns nothing.
If there is an error PostCreator() returns a WP_error object.
*/
PostCreator( 'My Lorem Ipsum', 'page', 'With a sizable serving of Dolor. This was created using Harri Bell-Thomas's PostCreator function.' );
Guía paso por paso
Crearemos una función PHP llamada PostCreator (), y la necesitaremos para tomar ciertos parámetros. A cada parámetro se le ha dado un valor predeterminado, por lo que técnicamente al llamar a la función no es necesario especificar ninguno de ellos, pero bueno, ¿dónde está la diversión en eso?
function PostCreator(
$name = 'AUTO POST',
$type = 'post',
$content = 'DUMMY CONTENT',
$category = array(1,2),
$template = NULL,
$author_id = '1',
$status = 'publish'
) {
// function output here
}
A continuación, voy a definir algunas constantes que son necesarias para la siguiente función incrustada. (Esto podría reescribirse para no usar constantes, pero las he usado porque las encuentro útiles al extender la función básica PostCreator (), pero esa es una historia para otro tutorial.
define( POST_NAME, $name );
define( POST_TYPE, $type );
define( POST_CONTENT, $content );
define( POST_CATEGORY, $category );
define( POST_TEMPLATE, '' );
define( POST_AUTH_ID, $author_id );
define( POST_STATUS, $status );
OK, hasta ahora todo bien. Ahora, he incluido algo de validación para evitar que se generen publicaciones / páginas duplicadas (lo cual es una pesadilla, ¡créame!). Esta validación comprueba si ya existe una publicación / página con el mismo nombre. Si lo hace, no crea uno nuevo, pero si no lo hace, lo crea para usted.
La razón por la que elegí verificar el título de la publicación es porque eso es todo lo que WordPress requiere para generar una página (el resto se genera automáticamente). Otras formas de realizar esta validación incluyen la comprobación con ‘slugs’ o ID de publicaciones. Todo esto lo veremos en un tutorial posterior.
Esto es especialmente útil si su complemento o tema requiere la publicación / página. Primero desarrollé esto para uno de mis complementos porque requería que una página estuviera presente con una determinada plantilla de página. Con esta función, simplemente mantuve PostCreator () es WordPress » admin_init ‘, lo que significa que si alguien intentaba eliminarlo (¡cómo se atreven!), Se volvería a crear de inmediato para evitar problemas con el resto del complemento.
Tenga en cuenta que nadie quiere que su blog sea secuestrado, así que asegúrese de decirles claramente lo que está sucediendo y quizás proporcione una opción para que lo apaguen.
Ahora volvamos a la validación. Aquí está el siguiente fragmento de código.
if ( $type == 'page' ) {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_page( $post_id );
define( POST_TEMPLATE, $template );
} else {
$post = get_page_by_title( POST_NAME, 'OBJECT', $type );
$post_id = $post->ID;
$post_data = get_post( $post_id );
}
Entonces, ¿qué diablos está pasando aquí?
Bueno, este es esencialmente el mismo proceso repetido dos veces. Hago esto porque las publicaciones y las páginas se tratan de manera ligeramente diferente. Además, la constante POST_TEMPLATE solo se define si estás intentando crear una página, porque solo las páginas pueden aceptar ese parámetro (es decir, se ignorará si estás intentando crear una publicación estándar).
En la primera línea de la cláusula IF (su nombre técnico es ‘apodosis’ si aún no lo sabía) se define la variable $ post. Si hay una publicación / página con el mismo nombre que se está intentando crear, $ publicación se completa con los datos de la entrada existente (como un objeto, no como una matriz, pero esto se puede cambiar si es absolutamente necesario). Esta variable se usa para probar si su título es único. Las siguientes dos líneas las he incluido porque, nuevamente, son muy útiles si desea extender esta función. Un ejemplo de esto podría ser actualizar la publicación existente si ya existe.
La siguiente es nuestra función anidada que se agregará al gancho ‘admin_head’. Aquí está;
function hbt_create_post() {
$post_data = array(
'post_title' => wp_strip_all_tags( POST_NAME ),
'post_content' => POST_CONTENT,
'post_status' => POST_STATUS,
'post_type' => POST_TYPE,
'post_author' => POST_AUTH_ID,
'post_category' => POST_CATEGORY,
'page_template' => POST_TEMPLATE
);
wp_insert_post( $post_data, $error_obj );
}
Simplemente, esto está utilizando la función incorporada de WordPress (wp_insert_post) para generar nuestra publicación / página. Completamos $ post_data con una matriz de nuestros parámetros (puede ver nuestras constantes en uso aquí). Este se crea y si hay un error genera un valor booleano $ error_obj. VERDADERO = Un problema. FALSO = Todo bien. Lo último que debe hacer es ejecutar la función anterior en el cabezal de administración, pero solo si pasa la validación y devolver el objeto de error.
if ( ! isset( $post ) ) {
add_action( 'admin_init', 'hbt_create_post' );
return $error_obj;
}
¡Excelente! Ahora que hemos creado nuestra increíble función, ¡usémosla!
Uso
Simplemente incluya la función PostCreator () y ejecútela.
Esto se ejecutará usando los valores predeterminados, pero ¿y si queremos personalización? Luego usamos nuestros parámetros.
PostCreator(
'TITLE',
'POST TYPE',
'POST CONTENT',
'POST CATEGORY',
'TEMPLATE FILE NAME',
'AUTHOR ID NUMBER',
'POST STATUS'
);
Con todas estas opciones, tenga cuidado al usar apóstrofos. Asegúrese de que si desea utilizar un apóstrofo (excepto los que rodean los parámetros en sí), lo antepone con una barra inclinada hacia atrás. P.ej;
PostCreator( 'Alex's Post' );
El parámetro TITLE acepta un valor de cadena. Esto está despojado de etiquetas HTML.
El parámetro POST TYPE acepta el slug del tipo de publicación, por ejemplo; ‘publicación’ o ‘página’. Se admiten tipos de publicaciones personalizadas.
PostCreator( 'Alex's Post', 'page' );
El POST CONTENT ‘acepta un valor de cadena. Este será el contenido de la publicación / página creada. HTML está permitido aquí.
PostCreator( 'Alex's Post', 'page', 'The force is strong with this one…' );
POST CATEGORY acepta una matriz de números enteros. Los números enteros corresponden al ID de la categoría / categorías atribuidas a la publicación / página.
PostCreator( 'Alex's Post', 'page' , 'The force is strong with this one…' , array( 1, 2 ) );
El NOMBRE DE ARCHIVO DE LA PLANTILLA es un valor de cadena que define la plantilla de página deseada de su nueva página. Esto solo funciona para las páginas. El formato será; ‘nombre_archivo.php’.
PostCreator(
'Alex's Post',
page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php'
);
El NÚMERO DE ID DEL AUTOR es un valor entero del ID del autor.
PostCreator(
'Alex's Post',
'page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php',
'1'
);
El ESTADO DE LA POST le permite definir el estado de la publicación / página creada. De forma predeterminada, está «publicado».
Opciones Disponibles; [ ‘draft’ | ‘publish’ | ‘pending’| ‘future’ | ‘private’ | custom registered status ]
PostCreator(
'Alex's Post',
'page',
'The force is strong with this one…',
array( 1, 2 ) ,
'fullwidth_page.php',
'1',
'publish'
);
Terminando
WordPress es una herramienta excepcionalmente poderosa, pero definitivamente puede ser rebelde a veces. Espero que este sencillo fragmento le resulte útil, y quizás aprenda un par de cosas a lo largo del camino. Estén atentos para el próximo donde voy a convertir lo que ya hemos hecho en este artículo en una clase PHP, agregando más funcionalidad y estabilidad. Para obtener una vista previa, consulte el código en Github: PostController
Si tiene alguna pregunta, solo pregunte en la sección de comentarios a continuación.