sábado, 19 de septiembre de 2020

Crear Plugin con Wordpess -01

1-CONCEPTOS BÁSICOS 

1- Crear carpeta propia para cada plugin

-Nombre unico para cada plugin - Prefijo unico para cada carpeta

-Todos los plugins llevan en la parte superior un comentario que es la metadata de ese plugin.

El nombre de la carpeta, el del archivo.php y el de text-domain debe ser el mismo

HOOKS DE ACTIVACION Y DESACTIVACION

register_activation_hook( string $filecallable $function )

register_deactivation_hook( string $filecallable $function)

Vamos a crear una funcion que active el plugin:

 function mp_install(){
    //Acción a ejecutar cuando se activa
require_once 'Activador.php';
 }

 function mp_deactivation(){
     //Accion a ejeccutar cuando se desactiva
flush_rewrite_rules();
 }

 register_activation_hook__FILE__'mp_install' );
 register_deactivation_hook__FILE__'mp_deactivation' );

La constante mágica __FILE__ hace referencia al directorio actual y al archivo actual.

En la funcion de activar podemos: crear tablas en la base de datos, llamar a archivos que necesitemos-

flush_rewrite_rules remueve todos los enlaces permanentes.


MÉTODO DE DESINSTALACION

1- Método nro. 1

register_uninstall_hook( string $filecallable $callback )

...aca las funciones de activar y desactivar...
 function mp_uninstall(){
     //Borrar tablas de base de datos
     //Quitar algunas configuraciones u opciones
 }

 register_activation_hook__FILE__'mp_install' );
 register_deactivation_hook__FILE__'mp_deactivation' );
 register_uninstall_hook__FILE__'mp_uninstall' );

2- Método nro. 2

Crear un archivo en la carpeta raiz del plugin llamada "uninstall.php"

Es importante en este archivo que si no esta definida la constante de uninstall, le decimos exit!.

<?php

if(!defined'WP_UNINSTALL_PLUGIN' )){
    exit();
}

global $wpdb;

$wpdb->query("DROP TABLE IF EXISTS {$wpdb->prefix}mitabla");

Y despues podriamo tener algo asi que elimine una tabla de la bbdd.

COMPROBAR EXISTENCIAS

variables         isset();
Funciones         function_exists();
Classes           class_exists();
Constantes        defined();

Por ejemplo:

 if( ! function_exists'mp_install' ) ){
    function mp_install(){
        //Acción a ejecutar cuando se activa
        require_once 'Activador.php';
    }
}

ESTRUCTURA DE CARPETAS 

(Puede usarse MVC o Modular), usaremos este que es mas comun:

/plugin-name
     plugin-name.php
     uninstall.php
     /languages
     /includes
     /admin
          /js
          /css
          /images
     /public
          /js
          /css
          /images

CAPACIDADES DE USUARIO

El "administrador" tiene la capacidad "manage-options", es la capacidad de administrar las opciones del panel administrativo de Wordpress.

Wp nos ofrece una funcion que sirve para saber cuales son las capacidades del usuario:

current_user_can( string $capabilitymixed $args )

Quiere decir si el usuario actual puede: 

!IMPORTANTE! 

La accion "plugin_loaded" debe ser la primera en ponerse, porque esa accion espera a que todos los plugins esten cargados.

EJEMPLO DE CODIGO DE FUNCION PARA CARGAR UNA META DESCRIPTION:

Primero voy a hacer una funcion de cargar plugins

 if( !function_exists('mp_plugin_loaded') ){
     add_action'plugins_loaded''mp_plugin_loaded' );
     function mp_plugin_loaded(){
         
     }
 }

Y despues le metemos la funcion dentro:

 if( !function_exists('mp_plugin_loaded') ){
     add_action'plugins_loaded''mp_plugin_loaded' );
     function mp_plugin_loaded(){
         if( !function_exists('mp_add_meta_description') ){
             add_action'wp_head''mp_add_meta_description' );
             function mp_add_meta_description(){
                 echo "<meta name='description' content='Creacion de plugins para wordpress'>";
             }
         }
     }
 }

 2-SEGURIDAD EN NUESTRO PLUGIN

VALIDACION DE DATOS:

-Por funciones Php

 isset()
 empty()
 mb_strlen()
 strlen()
 preg_match()
 strpos()
 count()
 in_array()

-Funciones predifinidas Wordpress

is_email()
term_exists()
username_exists()
validate_file()
*_exists()
*_validate()
is_*()


DESINFECCION DE DATOS: sanitize SOLO SIRVE PARA ENTRADA DE DATOS !!!!!

Funciones wp incorporadas:

sanitize_*()
$input = 'Este es codigo <?php echo "DELETE" ?>malicioso';
echo sanitize_text_field($input);


ESCAPANDO DATOS DE SALIDA:(Averiguar)

NONCES

Los nonces son token de seguridad, vamos a crear un menu y en la pagina vamos a mandar un formulario con el boton eliminar, con un campo oculto, y alli le mandaremos el nonce, despues verifiremos ese noce.

add_menu_page( string $page_titlestring $menu_titlestring $capabilitystring $menu_slugcallable $function = ''string $icon_url = ''int $position = null )

//NONCES
add_action'admin_menu''mp_options_page' );
if( !function_exists('mp_options_page') ){

    function mp_options_page(){
        //Agregamos un menu 
        add_menu_page(
            'Mp Pruebas',
            'Mp Pruebas',
            'manage_options',
            'mp-pruebas',
            'mp_pruebas_page_display',
            '',
            15
        );
    }
}
if( !function_exists('(mp_pruebas_page_display') ){
    function mp_pruebas_page_display(){
        ifcurrent_user_can('edit_others_posts') ){
            $nonce = wp_create_nonce('Mi primer nonce de seguridad');
            echo $nonce;
            ifisset($_POST['nonce']) && ! empty($_POST['nonce']) ){
                if(wp_verify_nonce($nonce'Mi primer nonce de seguridad')){
                    echo "Hemos recibido el nonce: {$nonce}";
                }else{
                    echo "No hemos recibido ningun nonce";
                }
            }
            ?>
            <form action="" method="post">
            <input name="nonce" type="hidden" value="<?php echo $nonce?>">
            <input name="eliminar" type="hidden" value="eliminar">
            <button type="submit">Delete</button>
            </form>
            <?php
        }
    }
}


3- MENUS PANEL ADMIN

Vamos a hacer un menu con una imagen, con la funcion siguiente vamos a apuntar directo a la raiz del plugin.

plugin_dir_url( __FILE__)

Y __FILE__ es una constante magica que apunta al archivo donde esta ahora.

En el menu vamos a crear un formulario y vamos a usar la clase "wrap" de wordpress y para el boton submit tambien vamos a poner una clase especial para boton submit de wordpress.

//MENU
if( !function_exists('mp_options_page') ){
    add_action('admin_menu''mp_options_page');
    function mp_options_page(){
        add_menu_page(
            'Mp Prueba',//Title
            'Mp Prueba', //Title string
            'manage_options', //Capability user
            'mp-prueba', //Slug !! IDENTIFICADOR DEL MENU
            'mp_prueba_page_display',//Callback
            plugin_dir_url(__FILE__) . 'img/smiley.png', //Img
            3
        );
    }
}
if( !function_exists('mp_prueba_page_display') ){
    function mp_prueba_page_display(){
        if(current_user_can('manage_options')):
        ?>
        <!--HTML-->
        <div class="wrap">
            <form action="" method="post">
                <input type="text" placeholder="Texto">
                <?php submit_button('Enviar'); ?>
            </form>
        </div>
        <?php
        endif;
    }
}

BORRAR MENU

remove_menu_page( string $menu_slug )

if( !function_exists('mp_options_page') ){
    add_action('admin_menu''mp_options_page');
    function mp_options_page(){
        add_menu_page(
            'Mp Prueba',
            'Mp Prueba',
            'manage_options',
            'mp-prueba',
            'mp_prueba_page_display',
            plugin_dir_url(__FILE__) . 'img/smiley.png',
            3
        );
        remove_menu_page('edit.php?post_type=page');
    }
    
}

Por ejemplo, hemos removido el menu de paginas, poniendo el slug, podemos remover asi poniendo el slug siempre, y enganchandolo a la accion "admin_menu"

MENU CON RUTA A SLUG

//MENU
if( !function_exists('mp_options_page') ){
    add_action('admin_menu''mp_options_page');
    function mp_options_page(){
        add_menu_page(
            'Mp Prueba',
            'Mp Prueba',
            'manage_options',
            plugin_dir_path__FILE__ ) . 'admin/views.php',
            null,
            plugin_dir_url(__FILE__) . 'img/smiley.png',
            3
        );
        remove_menu_page('edit.php?post_type=page');
    }
    
}

Y hago una carpeta que se llame "admin" y un archivo que se llame "views.php"

TRAER TITULO DE LA PAGINA

En la pagina "views.php":

<h1><?php echo get_admin_page_title(); ?></h1>


SUBMENUS

add_submenu_page( string $parent_slugstring $page_titlestring $menu_titlestring $capabilitystring $menu_slugcallable $function = ''int $position = null )

if( !function_exists('mp_options_page') ){
    add_action('admin_menu''mp_options_page');
    function mp_options_page(){
        add_menu_page(
            'Mp Prueba',
            'Mp Prueba',
            'manage_options',
            plugin_dir_path__FILE__ ) . 'admin/views.php',
            null,
            plugin_dir_url(__FILE__) . 'img/smiley.png',
            3
        );
        //remove_menu_page('edit.php?post_type=page');
        add_submenu_page(
            plugin_dir_path__FILE__ ) . 'admin/views.php',
            'Mp Submenu',
            'Mp Submenu',
            'manage_options',
            'mp_submenu',
            'mp_submenu_display_page'
            
        );
        
    }
    
}


PARA AGREGAR UN HELPERS DONDE PONER LAS FUNCIONES

Creamos una carpeta en la raiz del plugin que se llama "lib" y dentro "helpers.php"

Para llamar al archivo de funciones usamos :

require_once plugin_dir_path(__FILE__) . 'lib/helpers.php';


4-HOOKS

Hay dos tipos de Hooks: Acciones y Filtros

ACCIONES

add_action( string $tagcallable $function_to_addint $priority = 10int $accepted_args = 1 )

Un hook puede recibir 4 argumentos, en el ejemplo de abajo creamos una funcion que se llama con 'save_post' , el tercer argumento es la prioridad (por defecto en 10), cuando el numero es menor mayor prioridad y el cuarto parametros cuantos argumentos le pasaremos a la funcion.

add_action'save_post''function_callback_save_post'102 );

Y ahora hacemos la funcion que recibira 2 parametros:

//1- HOOK DE ACCION
add_action'save_post''function_callback_save_post'102 );

function function_callback_save_post($post_id, $post){
    $author_id    = $post->post_author;
    $name_author  = get_the_author_meta('display_name'$author_id);
    $email_author = get_the_author_meta('email_user'$author_id);
    $title        = $post->title;
    $permalink    = get_permalink($post_id);

    //Una ve guardado el post vamos a mandar un email a su correo
    //Valores pra el envio del email
    $para[]  = sprintf('%s <%s>'$name_author$email_author);
    $asunto  = sprintf('Publicación guardada: %s'$title);
    $mensaje = sprintf('Felicitaciones! %s su publicacion %s ha sido publicada!'$name_author$title);
    $mensaje .= sprintf('Ver publicación %$'$permalink);
    $headers[] = '';

    //Funcion wp para enviar email
    wp_mail$para$asunto$mensaje$headers );
}

Ahora, todo lo metemos dentro de un if, porque necesitamos saber si esta publicacion esta en borrador para saber si tiene que ser enviado o no enviado.

wp_is_post_revision( int|WP_Post $post )

function function_callback_save_post($post_id, $post){
    ifwp_is_post_revision($post_id) ){
        return;
    }

Si esta en revision o borrador, le decimos "return" para que salga.

Tambien podriamos usar la accion : "Publish_post", que es cuando un post se pubica, se edita o se actualiza.

add_action'publish_post''function_callback_publish_post'102 );

Cuando sean cuatom post type cambiaremos :

add_action'publish_mi_custom_post_type''function_callback_publish_post'102 );

Tambien se podria hacer una accion para cuando se envia un comentario:

add_action'comment_post''notificacion_email_comentarios'102 );
function notificacion_email_comentarios($comment_ID, $comment_approved){
    if($comment_approved === 1){
        //Si el comentario fue aprovado....
    }
}

2- HOOK DE FILTRO

//2- HOOK FILTER
add_filter'the_title''function_filter_title'102 );

function function_filter_title( $title ){
    $title = str_replace('a'''$title);
    return $title;
}

Podemos agregar una imagen destacada tambien:

add_filter'the_content''function_show_thumbnail_image' );

function function_show_thumbnail_image($contenido){

    if(is_singular('post') && has_post_thumbnail()){
        $thumbnail = get_the_post_thumbnail();
        $contenido = $thumbnail . $contenido;
    }
    return $contenido;
}

Podemos tambien usar"body_class" para borrar una clase del body


add_filter('body_class''function_borrar_clase_body');

function function_borrar_clase_body( $classes ){
    if(!is_admin()){
        ifin_array('logged-in'$classes) ){
            $indice = array_search('logged-in'$classes);
            unset($classes[$indice]);
        }
    }
}

3-HOOK PERSONALIZADO

-Accion

do_action( string $tagmixed $arg )

El de accion lo voy a agregar donde quiero que pase la accion y le voy a pasar una funcion.

-Filtro

apply_filters( string $tagmixed $value )

-ELIMINAR HOOKS

Para eliminar hooks tenemos 2 funciones:

remove_action( string $tagcallable $function_to_removeint $priority = 10 )

remove_all_actions( string $tagint|bool $priority = false )

Por ejemplo, quiero eliminar el gancho que llama a la funcion que me pone el menu
//REMOVER HOOKS
remove_action('admin_menu''mp_options_page');
remove_all_actions('admin_menu');

-DETERMINANDO EL HOOK ACTUAL

current_action()

current_filter()

Por ejemplo, voy a tener dos hooks para la misma funcion de callback: Y hago una funcion que haga una cosa si es contenido u otra cosa si es un excerpt.

//DETERMINAR HOOK ACTUAL
function mp_modify_content( $content ){
    switchcurrent_filter() ){
        case 'the_content'
        //Realizar una accion
        break;
        case 'the_excerpt'
        //Realizar otra accion
        break;
    }
}
add_filter('the_content''mp_modify_content');
add_filter('the_excerpt''mp_modify_content');


PODEMOS USAR UNA FUNCION QUE VERIFICA SI SE LANZO LA FUNCION DE ACCION O NO:

if( !function_exists('mp_options_page') ){
    add_action('admin_menu''mp_options_page');
    function mp_options_page(){
        if(did_action('admin_menu') !== 1){
            return;
        }

5-SHORTCODES API

De forma predeterminada Wp incluye los siguientes Shortcodes:

[caption] //Subtitulos alrededor de contenido
[gallery]
[audio]
[video]
[playlist] 
[embed] 

SHOTCODE API

add_shortcode( string $tagcallable $callback )

Siempre el shortcode DEBE RETORNAR ALGO ! ! ! 

//SHORTCODE API
function mi_primer_shortcode(){
    return "Este es mi primer shortcode";
}
add_shortcode'mp_shortcode''mi_primer_shortcode' );

En pagina:

[mp_shortcode]

REMOVER SHOTCODE Y verificar

//SHORTCODE API
//Funcion para add shortcode
function mi_primer_shortcode(){
    return "Este es mi primer shortcode";
}
add_shortcode'mp_shortcode''mi_primer_shortcode' );
//Funcion para remover shortcode
remove_shortcode'mp_shortcode' );
//Funcion para comprobar si existe o no
ifshortcode_exists'mp_shortcode' ) ){
    echo 'Si existe el shortcode';
}else{
    echo 'El shortcode no existe';
}

SHORTCODE CON CONTENIDO INCLUIDO

1-Shortcode con contenido y parametro:

//Shortcode con contenido dentro y parametro
function shortcode_con_contenido( $attr, $content ){
    $content = '<div style="color:red;">'.$content.'</div>';
    return $content;
}
add_shortcode'mp_short_content''shortcode_con_contenido' );

Y en la entrada 

[mp_short_content]Este es el contenido[/mp_short_content]

2-Shortcode dentro de Shortcode:

//Shortcode con contenido dentro y parametro //Este ira dentro
function shortcode_con_contenido( $attr, $content ){
    $content = '<div style="color:red;">'.$content.'</div>';
    return $content;
}
add_shortcode'mp_short_content''shortcode_con_contenido' );
//Shortcode dentro de Shortcode: //Este ira fuera
function shortcode_red_span( $attr, $content ){
    $content = $content = '<div style="background-color:yellow;">'.do_shortcode($content).'</div>';
    return $content;
}
add_shortcode'mp_span_red''shortcode_red_span' );

Asi ira:

[mp_span_red][mp_short_content]Este es el contenido[/mp_short_content][/mp_span_red]

-SHORTCODE CON PARAMETROS QUE PASA EL USUARIO

Vamos a utilizar para hacer un boton personalizado, que el usuario lo pueda personalizar, tres funciones:

2 de Php y 1 de Wordpress.

/* PHP
Cambia todas las claves en un array
Devuelve un array con todas las claves convertidas a minúsculas o mayúsculas.
Los índices numerados son dejados como están. */
array_change_key_case();
/* PHP
En array asociativo, trata a las claves como nombres de variables */
extractarray &$var_array [, int $extract_type = EXTR_OVERWRITE 
[, string $prefix = NULL ]] )
/* WP
Combine atributos de usuario con atributos conocidos y 
complete los valores predeterminados cuando sea necesario. */
shortcode_atts$pairs:array$atts:array$shortcode:string )

Vamos a hacer un boton y que el usuario pueda personalizarlo:

1- La funcion va a recibir un array de valores, que va a ser "attr_new", a este lo voy a convertir todas las letras en minuscula, por las dudas, y le voy a especificar array, por las dudas.

function shortcode_with_atts_create_custom_button( $attr_new, $content ){
    
    $attr_new = array_change_key_case( (array)$attr_new, CASE_LOWER );
}

2-Tambien voy a hacer un array por defecto, y le voy a pasar los valores por defecto.

function shortcode_with_atts_create_custom_button( $attr_new, $content ){

    $attr_default = [
        'title' => 'This is default title of button',
        'size' => '16px',
        'color' => 'white',
        'bground' => 'black',
        'url' => '#',
        'target' => '_blank'
    ];
    $attr_new = array_change_key_case( (array)$attr_new, CASE_LOWER );
}

3-Ahora, le vamos a pasar la funcion de wp "shortcode_atts", primer parametro atributos por defecto, segundo array nuevo, y esta funcion combina los dos.

$attr_new = shortcode_atts$attr_default$attr_new );

4- Ahora, como la funcion "shortcode_atts" devuelve un array, la voy a meter dentro de la funcion extract de php, para que me convierta las claves de ese array en variables, y asi las puedo poner en el boton:

extract(shortcode_atts$attr_default$attr_new ), EXTR_OVERWRITE) ;

Completo:

function shortcode_with_atts_create_custom_button( $attr_new, $content ){

    $attr_default = [
        'texto' => 'This is default title of button',
        'size' => '16px',
        'color' => 'white',
        'bground' => 'black',
        'url' => '#',
        'target' => '_blank'
    ];

    //$attr_new = array_change_key_case( (array)$attr_new, CASE_LOWER );
    extract(shortcode_atts$attr_default$attr_new ), EXTR_OVERWRITE) ;
    return "<a href='$url
            target='$target'
            style='font-size:$size; background:$bground;color:$color;padding:10px;'>
            $texto</a>";
}
add_shortcode'mp_short_atts''shortcode_with_atts_create_custom_button' );

Y en la entrada o donde se llame el shortcode:

[mp_short_atts]

Y si le paso atributos:

[mp_short_atts size='30px' texto='Enlace a Google' url='https://www.google.com/' bground='blue']

FILTRANDO SHORTCODE 

Podemos filtrar (Mirar video, porque lo filtra desde otro plugin)

6-SETTINGS Y OPTIONS API

La setting API significa que podemos modificar la seccion de "Ajustes", ahora, los formularios que se envien deben ser TIPO POST, y se han enviado a la ruta wp-admin/options y el usuario debe tener permiso "manage_options"

SETTING API

Registrando una configuracion:

Lo vamos a enganchar a un hook "admin_init" con una funcion.

function mp_settings_init(){

}
add_action('admin_init''mp_settings_init');

Ahora, para registrar una configuracion en Generales vamos a usar la funcion:

register_setting( string $option_groupstring $option_namearray $args = array() )

Ahora vamos a agregar una SECCION en la pagina con la funcion:

add_settings_section( string $idstring $titlecallable $callbackstring $page )

function mp_settings_init(){
    //Registrar una configuracion en "generales"
    register_setting('general''mi_primera_configuracion' );
    //Registrando una seccion en la pagina "general"
    add_settings_section(
        'mp_config_section'//id string
        'Mi primera configuracion'//Titulo
        'mp_config_section_callback'//Callback
        'general' //Seccion
    );
}
add_action('admin_init''mp_settings_init');

function mp_config_section_callback(){
    echo '<p>Sección mi primera configuración</p>';
}

-Ahora, vamos a crear un campo para enviar datos a la base de datos

Y para ello vamos a usar la funcion:

add_settings_field( string $idstring $titlecallable $callbackstring $pagestring $section = 'default'array $args = array() )

function mp_settings_init(){
    //Registrar una configuracion en "generales"
    register_setting('general''mi_primera_configuracion' );
    //Registrando una seccion en la pagina "general"
    add_settings_section(
        'mp_config_section'//id string
        'Mi primera configuracion'//Titulo
        'mp_config_section_callback'//Callback
        'general' //Seccion
    );
    add_settings_field(
        'mp_config_field'//Id string
        'Configuración 1'//Titulo
        'mp_config_field_callback'//Callback
        'general'//page
        'mp_config_section' //Seccion nombre
    );
}
add_action('admin_init''mp_settings_init');
//Funcion seccion
function mp_config_section_callback(){
    echo '<p>Sección mi primera configuración</p>';
}
//Funcion campo 
function mp_config_field_callback(){
    $html = '<input type="text" name="mi_primera_configuracion" value="">';
    echo $html;
}

Ahora lo que hemos metido en este campo se va a la bbdd a wp_options, tenemos que traerlo para mostrarlo en el input

//Funcion campo 
function mp_config_field_callback(){
    //Traigo el dato de base de dato
    $inputValue = get_option('mi_primera_configuracion');
    $html = "<input type='text' name='mi_primera_configuracion' value='$inputValue'>";
    echo $html;
}

AHORA SI QUEREMOS HACER MAS DE 1 CAMPO, POR EJMEPLO 2 CAMPOS INPUT, tenemos que pasarle un array:

Como no es bueno duplicar, vamos a tener que guardar el name como un array que le pasaremos, y wp guarda un array lo SERIALIZA (Falta)

API OPTIONS

CRUD

Junto con la Api Setting sirve para hacer CRUD con las opciones de wp de la configuracion.

DONDE SE ALMACENAN LOS REGISTROS??

En la tabla {wpdb->prefix}_options

-AGREGAR REGISTRO

add_option( string $optionmixed $value = ''string $deprecated = ''string|bool $autoload = 'yes' )

-LEER REGISTRO

get_option( string $optionmixed $default = false )

-ACTUALIZAR REGISTRO

update_option( string $optionmixed $valuestring|bool $autoload = null )

-ELIMINAR REGISTRO

delete_option( string $option )


//GUARDAR
$string = "Soy un string";
$array  = ["Samanta"34"job" => "Sommelier"true];

add_option('string'$string);
add_option('array'$array);

//LEER
$getString = get_option('string');
echo $getString;

$getArray = get_option('array');
var_dump($array);

//ACTUALIZAR
$string2 = "Soy otro String";
update_option'string'$string2 );
echo get_option('string');

//ELIMINAR
delete_option'string' );


PAGINA DE CONFIGURACION PERSONALIZADA

-Menú de administración

-API Setting

-API Options

1-Creo el menu

//1- Crear Menú
if( !function_exists('mp_menu_config_custom') ){
    add_action'admin_menu''mp_menu_config_custom' );
    function mp_menu_config_custom(){
        //Registro el menu
        add_menu_page(
            'Mp Test',
            'Mp Test',
            'manage_options',
            'mp-test',
            'mp_test_display_page',
            plugin_dir_url__FILE__ ) . 'img/navegador-web.png',
            4
        );
    }
}
if( !function_exists('mp_test_display_page') ){
    function mp_test_display_page(){
        //Tiene el usuario actual los permisos?
        if(current_user_can'manage_options' ) ){

        }
    }
}

2- Al registrar la pagina de configuracion le tengo que pasar el SLUG DE ESE MENU en vez de "GENERAL"

//2- Registrar Configuracion Settings API
if( !function_exists('mp_setting_init2') ){
    add_action('admin_menu''mp_setting_init2');
    function mp_setting_init2(){
        //Registrar configuracion
        register_setting'mp-test''config' );
        //Registrando una Seccion
        add_settings_section(
            'mp_config_section_test',
            'Configuración',
            'mp_config_callback_test',
            'mp-test'
        );
    }
}

Ahora, si nos vamos a wp vemos que no aparece nada en la pagina...esto es PORQUE NO UTILIZAMOS LA FUNCIONES DE "RENDERIZADO" DEL "FORMULARIO"

do_settings_sections( string $page )

do_settings_fields( string $pagestring $section )

//========PAGINA DE CONFIGURACION PERSONALIZADA====================================================
//1- Crear Menú
if( !function_exists('mp_menu_config_custom') ){
    add_action'admin_menu''mp_menu_config_custom' );
    function mp_menu_config_custom(){
        //Registro el menu
        add_menu_page(
            'Mp Test',
            'Mp Test',
            'manage_options',
            'mp-test'//Slug y IDENTIFICADOR DEL MENU
            'mp_test_display_page',
            plugin_dir_url__FILE__ ) . 'img/navegador-web.png',
            4
        );
    }
}
//Callback para mostrar pagina
if( !function_exists('mp_test_display_page') ){
    function mp_test_display_page(){
        //Tiene el usuario actual los permisos?
        if(current_user_can'manage_options' ) ){
            do_settings_sections('mp-test');
        }
    }
}
//2- Registrar Configuracion Settings API
if( !function_exists('mp_setting_init2') ){
    add_action('admin_menu''mp_setting_init2');
    function mp_setting_init2(){
        //Registrar configuracion
        register_setting'mp-test''config' );
        //Registrando una Seccion
        add_settings_section(
            'mp_config_section_test',
            'Configuración',
            'mp_config_callback_test_section',
            'mp-test'
        );
        //Registramos input fields
        add_settings_field(
            'mp_config_field_test',
            'Configuración 1',
            'mp_config_callback_test_fields',
            'mp-test',
            'mp_config_section_test'
        );
    }
}
//3- Callback para agregar sección
function mp_config_callback_test_section(){
    echo '<h1>Sección de Configuración</h1>';
}
//Callback para agregar fields (campos)
function mp_config_callback_test_fields(){
    $inputValue = get_option('config');
    $html = '<input type="text" name="config" value="">';
    echo $html;
}

Ahora, tenemos que escribir las etiquetas del FORMULARIO, CON el ACTION Y EL METOD Y EL SUBMIT:

//1- Crear Menú
if( !function_exists('mp_menu_config_custom') ){
    add_action'admin_menu''mp_menu_config_custom' );
    function mp_menu_config_custom(){
        //Registro el menu
        add_menu_page(
            'Mp Test',
            'Mp Test',
            'manage_options',
            'mp-test'//Slug y IDENTIFICADOR DEL MENU
            'mp_test_display_page',
            plugin_dir_url__FILE__ ) . 'img/navegador-web.png',
            4
        );
    }
}
//Callback para mostrar pagina
if( !function_exists('mp_test_display_page') ){
    function mp_test_display_page(){
        //Tiene el usuario actual los permisos?
        if(current_user_can'manage_options' ) ){
            echo '<form action="options.php" method="POST">';
            do_settings_sections('mp-test');
            submit_button('Save');
            echo '</form>';
        }
    }
}
//2- Registrar Configuracion Settings API
if( !function_exists('mp_setting_init2') ){
    add_action('admin_menu''mp_setting_init2');
    function mp_setting_init2(){
        //Registrar configuracion
        register_setting'mp-test''config' );
        //Registrando una Seccion
        add_settings_section(
            'mp_config_section_test',
            'Configuración',
            'mp_config_callback_test_section',
            'mp-test'
        );
        //Registramos input fields
        add_settings_field(
            'mp_config_field_test',
            'Configuración 1',
            'mp_config_callback_test_fields',
            'mp-test',
            'mp_config_section_test'
        );
    }
}
//3- Callback para agregar sección
function mp_config_callback_test_section(){
    echo '<h1>Sección de Configuración</h1>';
}
//Callback para agregar fields (campos)
function mp_config_callback_test_fields(){
    $inputValue = get_option('config');
    $html = '<input type="text" name="config" value="">';
    echo $html;
}

Ahora,  me lleva a la pagina options.php, tenemos una funcion que nos agrega los paraemtros de action, etc:

settings_fields( string $option_group )

LE TENEMOS QUE PASAR COMO VALOR EL QUE PUSIMOS COMO NOMBRE DE LA CONFIGURACION, EN:
register_setting'mp-test''config' );
if(current_user_can'manage_options' ) ){
            echo '<form action="options.php" method="POST">';
            settings_fields('mp-test');
            do_settings_sections('mp-test');
            submit_button('Save');
            echo '</form>';
        }

Ahora, para mostrar un mensaje de error o de que esta todo bien vamos a usar las funciones:

add_settings_error( string $settingstring $codestring $messagestring $type = 'error' )

Y para mostrar esos errores:

settings_errors( string $setting = ''bool $sanitize = falsebool $hide_on_update = false )

if( !function_exists('mp_test_display_page') ){
    function mp_test_display_page(){
        //Tiene el usuario actual los permisos?
        if(current_user_can'manage_options' ) ){
            //Configuracion del mensaje de error
            ifisset$_GET['settings-updated'] ) ){
                add_settings_error(
                    'mp_test_error'//Nombre
                    'mp_test_error'//ID
                    'Esta configuración se ha guardado con éxito!',
                    'updated' //Clase por defecto de wp de mensaje de exito
                );
            }

$_GET['setting-updated'] es un parametro que devuelve wp cuando nosotros hemos guardado la configuracion.

Y luego:

if(current_user_can'manage_options' ) ){
            //Configuracion del mensaje de error
            ifisset$_GET['settings-updated'] ) ){
                add_settings_error(
                    'mp_test_error'//Nombre
                    'mp_test_error'//ID
                    'Esta configuración se ha guardado con éxito!',
                    'updated' //Clase por defecto de wp de mensaje de exito
                );
            }
            settings_errors'mp_test_error' );

(Falta)- Tonteria

7-CUSTOM POST TYPE

Los post (posts, pages, revisions, attachments, custom post types, menus) se guardan todos en LA TABLA "POSTS"

register_post_type( string $post_typearray|string $args = array() )

El hook va a ser Init:

function products_custom_post_type(){
    $labels = [
        'name'          => 'Products',
        'singular_name' => 'Product'
    ];
    $args  = [
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
'supports' => ['title''editor''thumbnail'],
        'rewrite' => ['slug''productos'],

    ];
    register_post_type('product'$args);
}
add_action'init''products_custom_post_type' );























































































csdc



No hay comentarios:

Publicar un comentario

Creando plugin Wordpress - 03

  11- USUARIOS -Para crear un usuario lo mas facil desde el admin- FUNCIONES PARA AGREGAR USUARIO: wp_create_user ( string  $username , stri...