Crear un plugin para wordpress (4): Opciones en menú

En los plugins podemos dar al usuario de wordpress la capacidad de poner opciones, que luego podemos usar en nuestro código. Basta poner una opción de menú y un formulario, wordpress se encarga del resto. Un ejemplo:

<?php
/*
 Plugin Name: Destacados
 Plugin URI: https://es.wikiquote.org/wiki/Portada
 Description: Destaca palabras 
 Author: Jota Peich
 Version: 1.0
 Author URI: http://intelisen.com
 */

//Las dos funciones siguientes y el add_filter son el código del plugin
function destacar_get_palabras() {
 return explode(",", get_option("destacar_palabras"));
}

function destacar_filtro($contenido) {
 $palabras = destacar_get_palabras();
 foreach ($palabras as $palabra) {
 $palabra=trim($palabra);
 $contenido = str_ireplace($palabra, "<span class=pg_destacado>" . $palabra . "</span>", $contenido);
 }
 return $contenido;
}

add_filter('the_content', 'destacar_filtro');


//Necesarios para crear un menú y registrar los campos
add_action('admin_menu', 'destacar_menu');
add_action('admin_init', 'destacar_settings');

//Registra el campo que vamos a guardar
function destacar_settings() {
 register_setting('destacar-group', 'destacar_palabras');
}


//Son las opciones que tendrá nuestro menú. Los parámetros son: título de la página, título del menú, quien puede acceder, url de esta página y función a la que se llama
function destacar_menu() {
 add_options_page('Opciones destacar', 'destacar', 'manage_options', 'destacar-identifier', 'destacar_options');
}

//Formulario que se mostrará cuando se seleccione el menú
function destacar_options() {
 if (!current_user_can('manage_options')) {
 wp_die('No tiene permiso.');
 }
 ?>

 <div>
 <?php screen_icon(); ?>
 <h2>Opciones destacar</h2>

 <form method="post" action="options.php">
 <?php
 settings_fields('destacar-group');
 do_settings_fields('destacar-group', '');
 ?>

 <p>Introduzca las palabras a destacar separadas por comas</p>
 <input size="70" type="text" name="destacar_palabras" value="<?php echo get_option('destacar_palabras'); ?>" />

 <?php
 submit_button();
 ?>
 </form>
 </div>
 <?php
}
?>

Plugin formulario de contacto

Un ejemplo tomado de aquí:

<?php
/*
Plugin Name: Formulario de contacto ejemplo
Plugin URI: http://example.com
Description: Un formulario de contacto de ejemplo para probar plugins
Version: 1.0
Author: Intelisen
Author URI: http://intelisen.com
*/

function html_form_code() {
 echo '<form method="post">';
 echo '<p>';
 echo 'Nombre (requerido) <br/>';
 echo '<input type="text" name="cf-name" pattern="[a-zA-Z0-9 ]+" value="' . ( isset( $_POST["cf-name"] ) ? esc_attr( $_POST["cf-name"] ) : '' ) . '" size="40" />';
 echo '</p>';
 echo '<p>';
 echo 'Email (requerido) <br/>';
 echo '<input type="email" name="cf-email" value="' . ( isset( $_POST["cf-email"] ) ? esc_attr( $_POST["cf-email"] ) : '' ) . '" size="40" />';
 echo '</p>';
 echo '<p>';
 echo 'Asunto (requerido) <br/>';
 echo '<input type="text" name="cf-subject" pattern="[a-zA-Z ]+" value="' . ( isset( $_POST["cf-subject"] ) ? esc_attr( $_POST["cf-subject"] ) : '' ) . '" size="40" />';
 echo '</p>';
 echo '<p>';
 echo 'Mensaje (requerido) <br/>';
 echo '<textarea rows="10" cols="35" name="cf-message">' . ( isset( $_POST["cf-message"] ) ? esc_attr( $_POST["cf-message"] ) : '' ) . '</textarea>';
 echo '</p>';
 echo '<p><input type="submit" name="cf-submitted" value="Enviar"></p>';
 echo '</form>';
}

function deliver_mail() {

 // Si se han enviado los datos, procesar
 if ( isset( $_POST['cf-submitted'] ) ) {

 // Sanear valores
 $name = sanitize_text_field( $_POST["cf-name"] );
 $email = sanitize_email( $_POST["cf-email"] );
 $subject = sanitize_text_field( $_POST["cf-subject"] );
 $message = esc_textarea( $_POST["cf-message"] );

 // Conseguir el mail del administrador
 $to = get_option( 'admin_email' );

 $headers = "From: $name <$email>" . "\r\n";

 // Si todo va bien, mensaje ok
 if ( wp_mail( $to, $subject, $message, $headers ) ) {
 echo '<div>';
 echo '<p>Gracias por contactar.</p>';
 echo '</div>';
 } else {
 echo 'Error inesperado';
 }
 }
}

function cf_shortcode() {
 
 deliver_mail();
 html_form_code();

}

add_shortcode( 'intelisen_contact_form', 'cf_shortcode' );

Crear un widget para wordpress

En este caso la cosa se complica, tenemos que tener un esqueleto que herede la clase widget. Pero básicamente es lo mismo, el código va donde el comentario:

<?php
/*
Plugin Name: Entrada aleatoria
Plugin URI: http://intelisen.com
Description: Muestra una entrada aleatoria
Author: Intelisen
Version: 1
Author URI: http://intelisen.com
*/


class EntradasWidget extends WP_Widget
{
 function EntradasWidget()
 {
 $widget_ops = array('classname' => 'EntradasWidget', 'description' => 'Muestra entrada aleatoria' );
 $this->WP_Widget('EntradasWidget', 'Entrada aleatoria con thumbnail', $widget_ops);
 }
 
 function form($instance)
 {
 $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
 $title = $instance['title'];
?>
 <p><label for="<?php echo $this->get_field_id('title'); ?>"><?=_e('Title')?>: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo attribute_escape($title); ?>" /></label></p>
<?php
 }
 
 function update($new_instance, $old_instance)
 {
 $instance = $old_instance;
 $instance['title'] = $new_instance['title'];
 return $instance;
 }
 
 function widget($args, $instance)
 {
 extract($args, EXTR_SKIP);
 
 echo $before_widget;
 $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);
 
 if (!empty($title))
 echo $before_title . $title . $after_title;;
 
 // CóDIGO DEL WIDGET
$posts = get_posts('orderby=rand&numberposts=1');
$post=$posts[0];

?><a href="<?=get_permalink ($post); ?>" title="<?=$post->post_title; ?>"><?=$post->post_title; ?></a>
<?php
 echo $after_widget;
 }
 
}

add_action( 'widgets_init', create_function('', 'return register_widget("EntradasWidget");') );?>

Crear un plugin para WordPress (3): Shortcode

El 'Shortcode' es asociar un texto entre corchetes con una función de php (normalmente implica imprimir algo de HTML). Por ejemplo:

function google_shortcode(){
 return '<input type="button" value="Ir a google" />';
}


add_shortcode('google_atajo', 'google_shortcode');

El ejemplo anterior nos crea un 'atajo' que crea un botón que, sencillamente, nos dirige a google. Un ejemplo algo más sofisticado sería el siguiente, que crea un botón que nos envía al validador de webs de w3c:

function validator_get_url(){
 return get_permalink();
}

function validator_shortcode(){
 return '<input type="button" value="Valida la página" onclick="location.href=\'http://validator.w3.org/check?uri='.urlencode(validator_get_url()).'\'"/>'; } 

add_shortcode('validator', 'validator_shortcode');

Crear un plugin para wordpress (2)

Para añadir nuestro código a wordpress tenemos dos opciones:

add_filter('gancho','funcion')

Cuando se muestre el contenido del 'gancho' se llamará a nuestra función 'función'. Lo que devuelva nuestra función será el valor del gancho, con lo que tenemos que asegurarnos de que devolvemos un valor. Veamos dos ejemplos:

add_filter( 'the_content', 'cambiar_contenido' );

function cambiar_contenido($contenido){
return $contenido." ¡Mega artículo!";
}

El código anterior cambiaría el contenido de las entradas añadiendo el texto '¡Mega artículo al final!'.

add_filter( 'the_title', 'cambia_titulo' );

function cambia_titulo($contenido){
return "###==>".$contenido;
}

El código anterior cambiaría los títulos añadiendo el texto '###==>' al principio.

add_filter('the_content', 'cambiar_contenido');

function cambiar_contenido($contenido) {
    if (strlen($contenido)<300){
        return $contenido;
    }
    else{
        $palabras=explode(" ",$contenido);
        $inicio=implode(" ",array_slice($palabras,0,40));
        $fin=implode(" ",array_slice($palabras,40));
        return $inicio.
                '
'
                . '";
    }
}

El código anterior, si el texto es largo, añade un botón de 'Ver más'.

add_action('gancho', 'función')

Cuando se ejecute la acción de wordpress 'gancho' se llamará a nuestra acción -que puede o no mostrar un contenido. Veamos ejemplos:

add_action( 'admin_notices', 'saludo' );

function saludo(){
echo "ola k ase???";
}

El código anterior hace que cuando se muestren las noticias de administración, se escriba el mensaje 'ola k ase?'.

add_action( 'wp_head', 'ponjquery' );

function ponjquery(){
echo '<El código que pongamos aquí se pintará en la cabecera (head) del wordpress>'; }

El código anterior nos pone jquery en la cabecera.

Crear un plugin para wordpress (1)

Debemos crear una carpeta dentro de wp-content\plugins, y dentro un arhivo index.php con lo siguiente:

/*
Plugin Name: Nombre del plugin
Plugin URI: http://intelisen.com/plugins
Description: Descripción del plugin
Author: Intelisen
Version: 1
Author URI: http://intelisen.com
*/

Temas hijos en wordpress

Para crear un tema hijo sólo tenemos que crear una carpeta y dentro un archivo style.css con lo siguiente:

/*
 Theme Name:   Twenty Fourteen Child
 Theme URI:    http://example.com/twenty-fourteen-child/
 Description:  Twenty Fourteen Child Theme
 Author:       John Doe
 Author URI:   http://example.com
 Template:     twentyfourteen
 Version:      1.0.0
 Tags:         light, dark, two-columns, right-sidebar, responsive-layout, accessibility-ready
 Text Domain:  twenty-fourteen-child
*/
@import url("../twentyfourteen/style.css");

Ojo al apartado Template y al import del url.

Tutorial:

Temas hijos

https://ayudawp.com/como-crear-un-tema-hijo-en-wordpress/

https://www.webempresa.com/blog/crear-temas-hijo-child-themes-en-wordpress.html