() translation by (you can also view the original English article)
WordPress básicamente se divide en dos partes, la sección frontal donde las personas pueden venir y leer publicaciones o artículos en el sitio. La otra es la sección de administración de WordPress desde la cual se pueden crear publicaciones y páginas. Esto funciona muy bien si WordPress se utiliza como un sitio de blogs general. Pero como WordPress se usa para diferentes tipos de sitios, a veces se hace necesario dar al usuario una forma de crear publicaciones desde la parte frontal del sitio sin obligarlo a ingresar en la sección de administración de WordPress.
Pero como WordPress se usa para diferentes tipos de sitios, a veces se puede ser necesario para el usuario una forma de crear publicaciones en la parte frontal del sitio sin obligar a ingresar en la sección de administración de WordPress.
Paso 1 Creando el Plugin
Para crear un complemento, cree un archivo ajaxpostfromfront.php en su carpeta wp-content / plugins / ajaxpostfromfront. Para crear un complemento en WordPress tenemos que agregar el encabezado del complemento de la siguiente manera:
1 |
/*
|
2 |
Plugin Name: Ajax post from front
|
3 |
Plugin URI:
|
4 |
Description:Allows to post from front end
|
5 |
Author: Abbas Suterwala
|
6 |
Version:
|
7 |
Author URI:
|
8 |
*/
|
También definiremos algunas constantes con nombre para nuestra URL base del complemento y la ruta del complemento de la siguiente manera:
1 |
define('APFSURL', WP_PLUGIN_URL."/".dirname( plugin_basename( __FILE__ ) ) ); |
2 |
define('APFPATH', WP_PLUGIN_DIR."/".dirname( plugin_basename( __FILE__ ) ) ); |
Esto nos ayudará a usarlos fácilmente cuando sea necesario en el complemento. También cree una carpeta js en su carpeta ajaxpostfromfront y agregue un archivo apf.js en ella. Por lo tanto, la estructura de carpetas del complemento sería la siguiente:

Ahora pondremos en cola los scripts enganchándolos al gancho de acción 'wp_enqueue_scripts
' y encolaremos nuestro archivo javascript y lo localizaremos para almacenar la URL de WordPress ajax que usaremos para nuestras llamadas ajax.
1 |
function apf_enqueuescripts() |
2 |
{
|
3 |
wp_enqueue_script('apf', APFSURL.'/js/apf.js', array('jquery')); |
4 |
wp_localize_script( 'apf', 'apfajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ); |
5 |
}
|
6 |
add_action('wp_enqueue_scripts', apf_enqueuescripts); |
Si todo ha ido bien hasta ahora, podremos ver nuestro complemento en la lista de complementos y deberíamos activarlo.



Paso 2: Comprender las funciones de WordPress para crear una nueva publicación
WordPress tiene un amplio conjunto de API o funciones que están expuestas a realizar tareas para complementos. Tiene funciones para todo tipo de tareas como crear una publicación, crear una página, comentarios, etc. En este complemento vamos a utilizar la función de WordPress wp_insert_post
.
wp_insert_post
toma en una matriz la información diferente requerida para crear una publicación en WordPress. Toma diferentes parámetros como el título de la publicación, contenido de la publicación, estado de la publicación, etc. También incluye el conjunto de categorías que se asociarán con la publicación. También contiene algunos otros parámetros como post password y extracto de post etc.
Para obtener una lista completa de los parámetros, puede visitar la página wp_insert_post
en el Códice de WordPress.
Paso 3 Creando la interfaz de usuario para crear una publicación desde el extremo frontal
A continuación, vamos a crear la interfaz de usuario para nuestra publicación desde el complemento front-end. Para esto vamos a escribir la siguiente función:
1 |
function apf_post_form() |
2 |
{ |
3 |
?> |
4 |
|
5 |
<form id="apfform" action="" method="post"enctype="multipart/form-data"> |
6 |
|
7 |
<div id="apf-text"> |
8 |
|
9 |
<div id="apf-response" style="background-color:#E6E6FA"></div> |
10 |
|
11 |
<strong>Title </strong> <br/> |
12 |
<input type="text" id="apftitle" name="apftitle"/><br /> |
13 |
<br/>
|
14 |
|
15 |
<strong>Contents </strong> <br/> |
16 |
<textarea id="apfcontents" name="apfcontents" rows="10" cols="20"></textarea><br /> |
17 |
<br/>
|
18 |
|
19 |
<a onclick="apfaddpost(apftitle.value,apfcontents.value);" style="cursor: pointer"><b>Create Post</b></a> |
20 |
|
21 |
</div>
|
22 |
</form>
|
23 |
|
24 |
<?php
|
25 |
}
|
En la función, primero crearemos un formulario utilizando la etiqueta <form>
. En esto crearemos un div con la ID apf-response
que se actualizará con el mensaje que proviene de la respuesta AJAX que obtendremos. Luego, hemos creado un cuadro de texto para el título y un área de texto para el contenido de la publicación.
A continuación, creamos un enlace llamado 'crear publicación' que llama a una función javascript apfaddpost
que realizará una llamada AJAX para crear la publicación. Veremos la implementación de la llamada AJAX en los pasos a continuación.
En caso de que llamemos a la función apf_post_form
en los archivos de tema, la verá de la siguiente manera. En mi tema lo acabo de llamar antes del bucle principal.



Paso 4: Creación de un widget para mostrar la interfaz de usuario en el extremo frontal
Ahora vamos a crear un widget para nuestra publicación desde el complemento frontal. Este widget mostrará la interfaz de usuario para la publicación desde el frente que creamos. A continuación se muestra el código para el widget.
1 |
class AjaxPostFromFrontWidget extends WP_Widget { |
2 |
function AjaxPostFromFrontWidget() { |
3 |
// widget actual processes
|
4 |
$widget_ops = array('classname' => 'AjaxPostFromFrontWidget', 'description' => 'Lets you create post from front end' ); |
5 |
$this->WP_Widget('AjaxPostFromFrontWidget','AjaxPostFromFrontWidget', $widget_ops); |
6 |
}
|
7 |
|
8 |
function form($instance) { |
9 |
// outputs the options form on admin
|
10 |
$defaults = array( 'title' => 'Ajax Post From Front' ); |
11 |
$instance = wp_parse_args( (array) $instance, $defaults ); |
12 |
|
13 |
?>
|
14 |
<p>
|
15 |
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php echo 'Title:'; ?></label> |
16 |
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" class="widefat" /> |
17 |
</p>
|
18 |
<?php
|
19 |
}
|
20 |
|
21 |
function update($new_instance, $old_instance) { |
22 |
// processes widget options to be saved
|
23 |
$instance = $old_instance; |
24 |
$instance['title'] = strip_tags( $new_instance['title'] ); |
25 |
|
26 |
return $instance; |
27 |
}
|
28 |
|
29 |
function widget($args, $instance) { |
30 |
// outputs the content of the widget
|
31 |
extract( $args ); |
32 |
|
33 |
$title = apply_filters('widget_title', $instance['title'] ); |
34 |
echo $before_widget; |
35 |
if ( $title ) |
36 |
echo $before_title . $title . $after_title; |
37 |
echo '<ul>'; |
38 |
echo apf_post_form(); |
39 |
echo '</ul>'; |
40 |
echo $after_widget; |
41 |
}
|
42 |
}
|
En el constructor le damos el nombre de la clase y la descripción del widget. En la función de formulario actualmente, solo mostramos un campo que es el título que se mostrará para el widget. Actualizamos el campo de título en la función de actualización.
En la función del widget obtenemos el título guardado en la instancia del widget y lo mostramos. Luego llamamos a la función apf_post_form
que mostrará el formulario que creamos en el paso anterior.
Registraremos el widget de la siguiente manera:
1 |
function apf_widget_init() { |
2 |
// Check for the required API functions
|
3 |
if ( !function_exists('register_widget') ) |
4 |
return; |
5 |
|
6 |
register_widget('AjaxPostFromFrontWidget'); |
7 |
}
|
8 |
add_action('widgets_init', 'apf_widget_init'); |
Ahora podemos arrastrar y soltar nuestro nuevo widget en la barra lateral.



Una vez que el widget se coloca en la barra lateral, debería poder ver el formulario en la página de inicio en la barra lateral de la siguiente manera:



Paso 5 Creando una publicación vía AJAX desde el extremo frontal
Ahora vamos a crear una función para manejar la solicitud AJAX de crear la publicación. La función para manejar la solicitud AJAX es la siguiente:
1 |
function apf_addpost() { |
2 |
$results = ''; |
3 |
|
4 |
$title = $_POST['apftitle']; |
5 |
$content = $_POST['apfcontents']; |
6 |
|
7 |
$post_id = wp_insert_post( array( |
8 |
'post_title' => $title, |
9 |
'post_content' => $content, |
10 |
'post_status' => 'publish', |
11 |
'post_author' => '1' |
12 |
) ); |
13 |
|
14 |
if ( $post_id != 0 ) |
15 |
{
|
16 |
$results = '*Post Added'; |
17 |
}
|
18 |
else { |
19 |
$results = '*Error occurred while adding the post'; |
20 |
}
|
21 |
// Return the String
|
22 |
die($results); |
23 |
}
|
En esta función obtenemos los valores del título y el contenido de la variable $ _POST
. Con esos valores, utilice la función wp_insert_post
de WordPress para crear la publicación. La función wp_insert_post
devuelve el ID de publicación recién creado si tuvo éxito y cero si falla. Entonces, usando ese valor, enviamos un mensaje de éxito o error desde AJAX.
Para registrar esta función con el sistema WordPress AJAX llamaremos lo siguiente:
1 |
// creating Ajax call for WordPress
|
2 |
add_action( 'wp_ajax_nopriv_apf_addpost', 'apf_addpost' ); |
3 |
add_action( 'wp_ajax_apf_addpost', 'apf_addpost' ); |
Una vez que nuestro controlador AJAX haya terminado, solo tenemos que hacer la solicitud AJAX desde nuestro código javascript de la siguiente manera:
1 |
function apfaddpost(posttitle,postcontent) { |
2 |
|
3 |
jQuery.ajax({ |
4 |
|
5 |
type: 'POST', |
6 |
|
7 |
url: apfajax.ajaxurl, |
8 |
|
9 |
data: { |
10 |
action: 'apf_addpost', |
11 |
apftitle: posttitle, |
12 |
apfcontents: postcontent |
13 |
},
|
14 |
|
15 |
success: function(data, textStatus, XMLHttpRequest) { |
16 |
var id = '#apf-response'; |
17 |
jQuery(id).html(''); |
18 |
jQuery(id).append(data); |
19 |
|
20 |
resetvalues(); |
21 |
},
|
22 |
|
23 |
error: function(MLHttpRequest, textStatus, errorThrown) { |
24 |
alert(errorThrown); |
25 |
}
|
26 |
|
27 |
});
|
28 |
}
|
29 |
|
30 |
function resetvalues() { |
31 |
|
32 |
var title = document.getElementById("apftitle"); |
33 |
title.value = ''; |
34 |
|
35 |
var content = document.getElementById("apfcontents"); |
36 |
content.value = ''; |
37 |
|
38 |
}
|
En la función apfaddpost
solo hacemos una solicitud AJAX pasando el título de la publicación y el contenido de la publicación. Una vez que se recibe la respuesta, solo mostramos el mensaje devuelto por el controlador AJAX en la div apf-response
. Después de eso restablecemos los valores en el formulario.



Después de hacer clic en crear publicación, la publicación se creará y el mensaje se verá de la siguiente manera:



Paso 6: Agregar la opción de permitir que solo los usuarios registrados inicien sesión
Ahora agregaremos la funcionalidad para permitir que el administrador elija si no desea que los usuarios que no han iniciado sesión para crear publicaciones.
Para esto, actualizamos el apf_post_form
como sigue para tomar un argumento $ allowNotLoggedInuser
. En ese caso, cuando el usuario no ha iniciado sesión, no mostrará el formulario pero mostrará un mensaje para iniciar sesión.
1 |
function apf_post_form($allowNotLoggedInuser='yes') { |
2 |
if ( $allowNotLoggedInuser == 'no' && !is_user_logged_in() ) { |
3 |
echo "Please Login to create new post"; |
4 |
return; |
5 |
}
|
6 |
?>
|
7 |
|
8 |
<form id="apfform" action="" method="post"enctype="multipart/form-data"> |
9 |
|
10 |
<div id="apf-text"> |
11 |
|
12 |
<div id="apf-response" style="background-color:#E6E6FA ;color:blue;"></div> |
13 |
|
14 |
<strong>Title </strong> <br/> |
15 |
<input type="text" id="apftitle" name="apftitle"/><br /> |
16 |
<br/>
|
17 |
|
18 |
<strong>Contents </strong> <br/> |
19 |
<textarea id="apfcontents" name="apfcontents" rows="10" cols="20"></textarea><br /> |
20 |
|
21 |
<br/>
|
22 |
|
23 |
<a onclick="apfaddpost(apftitle.value,apfcontents.value);" style="cursor: pointer"><b>Create Post</b></a> |
24 |
|
25 |
</div>
|
26 |
</form>
|
27 |
|
28 |
<?php
|
29 |
}
|
También actualizaremos el widget para mostrar una opción más en la función de formulario para mostrar un campo de selección preguntando si está permitido que los usuarios que no han iniciado sesión publiquen. También actualizaremos los valores en la función de actualización. En la función de widget ahora leemos el valor que se estableció en el widget y luego lo pasamos a la función apf_post_form
.
El código del widget actualizado debería verse así:
1 |
class AjaxPostFromFrontWidget extends WP_Widget { |
2 |
function AjaxPostFromFrontWidget() { |
3 |
// widget actual processes
|
4 |
$widget_ops = array('classname' => 'AjaxPostFromFrontWidget', 'description' => 'Lets you create post from front end' ); |
5 |
$this->WP_Widget('AjaxPostFromFrontWidget','AjaxPostFromFrontWidget', $widget_ops); |
6 |
}
|
7 |
|
8 |
function form($instance) { |
9 |
// outputs the options form on admin
|
10 |
$defaults = array( 'title' => 'Ajax Post From Front','allow_not_logged_users' => 'no' ); |
11 |
$instance = wp_parse_args( (array) $instance, $defaults ); |
12 |
|
13 |
?>
|
14 |
<p>
|
15 |
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php echo 'Title:'; ?></label> |
16 |
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" class="widefat" /> |
17 |
</p>
|
18 |
|
19 |
<p>
|
20 |
<label for="<?php echo $this->get_field_id( 'allow_not_logged_users' ); ?>">allow_not_logged_users:</label> |
21 |
<select id="<?php echo $this->get_field_id( 'allow_not_logged_users' ); ?>" name="<?php echo $this->get_field_name( 'allow_not_logged_users' ); ?>" class="widefat" style="width:100%;"> |
22 |
<option <?php if ( 'no' == $instance['allow_not_logged_users'] ) echo 'selected="selected"'; ?>>no</option> |
23 |
<option <?php if ( 'yes' == $instance['allow_not_logged_users'] ) echo 'selected="selected"'; ?>>yes</option> |
24 |
</select>
|
25 |
</p>
|
26 |
|
27 |
<?php
|
28 |
}
|
29 |
|
30 |
function update($new_instance, $old_instance) { |
31 |
// processes widget options to be saved
|
32 |
$instance = $old_instance; |
33 |
|
34 |
$instance['title'] = strip_tags( $new_instance['title'] ); |
35 |
$instance['allow_not_logged_users'] = $new_instance['allow_not_logged_users']; |
36 |
return $instance; |
37 |
}
|
38 |
|
39 |
function widget($args, $instance) { |
40 |
// outputs the content of the widget
|
41 |
extract( $args ); |
42 |
$allow_not_logged_users = isset( $instance['allow_not_logged_users'] ) ? $instance['allow_not_logged_users'] : 'no'; |
43 |
|
44 |
$title = apply_filters('widget_title', $instance['title'] ); |
45 |
echo $before_widget; |
46 |
if ( $title ) |
47 |
echo $before_title . $title . $after_title; |
48 |
echo '<ul>'; |
49 |
echo apf_post_form($allow_not_logged_users); |
50 |
echo '</ul>'; |
51 |
echo $after_widget; |
52 |
}
|
53 |
}
|
Ahora desde el widget podemos elegir la opción de permitir o no usuarios registrados como se ve a continuación.

Ahora, en caso de que la opción esté configurada en no y alguien visite la página de inicio sin iniciar sesión, verá el siguiente mensaje para iniciar sesión y publicar.

Paso 7: Agregar la opción de agregar categorías para publicar a través del widget front-end
Ahora agregaremos la funcionalidad para agregar categorías a la publicación que estamos creando desde el extremo delantero. Para lograr esto primero, obtendremos la lista de todas las categorías y las mostraremos como casillas de verificación en la interfaz de usuario.
Para ello agregamos el siguiente código a la función apf_post_form
.
1 |
<strong>Contents </strong> <br/> |
2 |
<textarea id="apfcontents" name="apfcontents" rows="10" cols="20"></textarea><br /> |
3 |
|
4 |
<?php
|
5 |
$categories = get_categories(array('hide_empty'=> 0)); |
6 |
foreach ( $categories as $category ) { |
7 |
echo "<input type='checkbox' name='apfcategorycheck' id='apfcategorycheck' value='$category->term_id' />"; |
8 |
echo $category->cat_name; |
9 |
echo '<br>'; |
10 |
}
|
11 |
?>
|
12 |
<br/>
|
13 |
|
14 |
<a onclick="apfaddpost(apftitle.value,apfcontents.value,apfcategorycheck);" style="cursor: pointer"><b>Create Post</b></a> |
El código anterior solo obtiene la lista de todas las categorías y las muestra como casillas de verificación. Ese valor se pasa a nuestra función javascript apfaddpost
como un parámetro adicional.
En la función apfaddpost
obtenemos los valores que se verifican y los pasamos en la llamada AJAX de la siguiente manera:
1 |
function apfaddpost ( posttitle,postcontent,postcategory ) { |
2 |
|
3 |
var postCatergoryArray = new Array(); |
4 |
|
5 |
for ( var i=0; i < postcategory.length; i++ ) { |
6 |
if ( postcategory[i].checked ) { |
7 |
postCatergoryArray[postCatergoryArray.length] = postcategory[i].value; |
8 |
}
|
9 |
}
|
10 |
|
11 |
jQuery.ajax({ |
12 |
|
13 |
type: 'POST', |
14 |
|
15 |
url: apfajax.ajaxurl, |
16 |
|
17 |
data: { |
18 |
action: 'apf_addpost', |
19 |
apftitle: posttitle, |
20 |
apfcontents: postcontent, |
21 |
apfcategory:postCatergoryArray |
22 |
}
|
23 |
});
|
Necesitaremos actualizar el controlador AJAX de la siguiente manera para tomar el conjunto de identificadores de las categorías y luego pasarlo a la función wp_insert_post
, para que la publicación recién creada tenga las categorías apropiadas.
1 |
function apf_addpost() { |
2 |
$results = ''; |
3 |
|
4 |
$title = $_POST['apftitle']; |
5 |
$content = $_POST['apfcontents']; |
6 |
$category = $_POST['apfcategory']; |
7 |
|
8 |
$post_id = wp_insert_post( array( |
9 |
'post_title' => $title, |
10 |
'post_content' => $content, |
11 |
'post_status' => 'publish', |
12 |
'post_category' => $category, |
13 |
'post_author' => '1' |
14 |
) ); |
15 |
|
16 |
if ( $post_id != 0 ) { |
17 |
$results = '*Post Added'; |
18 |
}
|
19 |
else { |
20 |
$results = '*Error occured while adding the post'; |
21 |
}
|
22 |
// Return the String
|
23 |
die($results); |
24 |
}
|
Ahora si vemos el widget se verá como sigue:

Y la publicación creada tendrá esas categorías seleccionadas asociadas como se ve a continuación.



Conclusión
WordPress es una plataforma extensible. Podemos extender WordPress para agregar una funcionalidad diferente para que la plataforma de WordPress se pueda usar para diferentes tipos de sitios en lugar de solo blogs. Al igual que en este complemento, hemos agregado la funcionalidad de crear publicaciones desde el front-end, WordPress se puede extender de diferentes maneras. Muy feliz la codificación de WordPress!