Html – Desplazarse entre carpetas

Supongamos que tenemos las siguientes carpetas, imágenes y archivos:

carpeta-principal 
***carpeta-1 
******carpeta-1-1 
*********carpeta-1-1-1
************carpeta-1-1-1-1
******************imagen.jpg
************carpeta-1-1-1-2
******************archivo.jpg

Si estamos posicionados en archivo.html y deseamos mostrar la imagen.jpg, nos desplazamos hacia arriba utilizando ‘../’ por cada peldaño:

<p><img src="../carpeta-1-1-1-1/imagen.jpg"/></p>

Cakephp 3 – Http Cliente y WP REST API v2 de WordPress

Para crear, leer, actualizar y eliminar usuarios (Ccreate, Read, Uptate y Delete) de WordPress utilizando la WP REST API v2 desde Http Client de Cakephp 3, seguimos los siguientes pasos:

  • Create:
  • // Cakephp create
    $http = new Client();
    $response = $http->post('https://midominio.com/wp-json/wp/v2/users', 
        ['username' => 'prueba', 'password' => 'prueba', 'email' => 'prueba@gmail.com'], 
        ['auth' => ['username' => 'miusuario', 'password' => 'mipassword']
    ]);
    $json = $response->getJson();
    debug($json);
    $estatusPeticion = $response->getStatusCode();
    if ($estatusPeticion < 300)
    { 
        echo('Usuario creado satisfactoriamente');
    }
    else
    {
        echo('Error al crear el usuario. Código del error: ' . $estatusPeticion);
    }
    
  • Read:
  • // Cakephp read
    $http = new Client();
    // $response = $http->get('https://midominio.com/wp-json/wp/v2/users/9',
        [], 
        ['auth' => ['username' => 'miusuario', 'password' => 'mipassword']
    ]);
    $json = $response->getJson();
    debug($json);
    $estatusPeticion = $response->getStatusCode();
    if ($estatusPeticion < 300)
    { 
        echo('Búsqueda satisfactoria');
    }
    else
    {
        echo('Error en la búsqueda del usuario. Código del error: ' . $estatusPeticion);
    }
    
    
  • Update:
  • // Cakephp update
    $http = new Client();
    $response = $http->put('https://midominio.com/wp-json/wp/v2/users/3', 
        ['email' => 'nuevoemail@gmail.com'], 
        ['auth' => ['username' => 'miusuario', 'password' => 'mipassword']
    ]);
    $json = $response->getJson();
    debug($json);
    $estatusPeticion = $response->getStatusCode();
    if ($estatusPeticion < 300)
    { 
        echo('Usuario actualizado satisfactoriamente');
    }
    else
    {
        echo('Error al intentar actualizar el usuario. Código del error: ' . $estatusPeticion);
    }
    
  • Delete:
  • // Cakephp delete
    $http = new Client();
    $response = $http->delete('https://midominio.com/wp-json/wp/v2/users/7', 
        ['force' => true, 'reassign' => 1], 
        ['auth' => ['username' => 'miusuario', 'password' => 'mipassword']
    ]);
    $json = $response->getJson();
    debug($json);
    $estatusPeticion = $response->getStatusCode();
    if ($estatusPeticion < 300)
    { 
        echo('Usuario eliminado satisfactoriamente');
    }
    else
    {
        echo('Error al intentar eliminar el usuario. Código del error: ' . $estatusPeticion);
    }  
    
  • En la operación Delete se deben pasar en la variable $data los parámetros: 'force' => true y 'reassign' => idDelUsuarioAlCualSeLeAsignaranLosPostDelUsuarioQueSePretendeEliminar

Fuente: https://book.cakephp.org/3.0/en/core-libraries/httpclient.html

Php – cURL y CRUD usuarios con Wp REST API v2

Para crear, leer, actualizar y eliminar usuarios (Ccreate, Read, Uptate y Delete) de WordPress utilizando la WP REST API v2 desde un programa cliente Php, seguimos los siguientes pasos:

  • Create:
  • // Php Create
    $host = 'https://miDominio/wp-json/wp/v2/users';
    $data = array('username' => 'pedroperez', 'password' => 'pedro123', 'email' => 'pedro@gmail.com', 'first_name' => 'Pedro', 'last_name' => 'Pérez');
    $data_string = json_encode($data);
    $headers = array(
        'Content-Type:application/json',
        'Content-Length: ' . strlen($data_string),
        'Authorization: Basic '. base64_encode('miUsuarioWordpress:miClaveWordpress')
    );
    $ch = curl_init($host);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $result = curl_exec($ch);
    curl_close($ch);  
    echo($result);
    
  • Read:
  • // Php Read
    $host = 'https://miDominio/wp-json/wp/v2/users/2';
    $headers = array(
        'Content-Type:application/json',
        'Authorization: Basic '. base64_encode('miUsuarioWordpress:miClaveWordpress')
    );
    $ch = curl_init($host);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $result = curl_exec($ch);
    curl_close($ch);  
    echo($result);
    
  • Update:
  • // Php Update
    $host = 'https://dapliw.org.ve/wp-json/wp/v2/users/2';
    $data = array('email' => 'nuevoemail@gmail.com');
    $data_string = json_encode($data);
    $headers = array(
        'Content-Type:application/json',
        'Content-Length: ' . strlen($data_string),
        'Authorization: Basic '. base64_encode('miUsuarioWordpress:miClaveWordpress')
    );
    $ch = curl_init($host);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $result = curl_exec($ch);
    curl_close($ch);  
    echo($result);  
    
  • Delete:
  • // Php Delete
    $host = 'https://dapliw.org.ve/wp-json/wp/v2/users/2';
    $data = array('force' => true, 'reassign' => 1);
    $data_string = json_encode($data);
    $headers = array(
        'Content-Type:application/json',
        'Content-Length: ' . strlen($data_string),
        'Authorization: Basic '. base64_encode('miUsuarioWordpress:miClaveWordpress')
    );
    $ch = curl_init($host);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $result = curl_exec($ch);
    curl_close($ch);  
    echo($result);
    
  • En la operación Delete se deben pasar en la variable $data los parámetros: ‘force’ => true y ‘reassign’ => idDelUsuarioAlCualSeLeAsignaranLosPostDelUsuarioQueSePretendeEliminar

Fuente: https://decodecms.com/como-usar-la-rest-api-de-wordpress/

WordPress – WP REST API v2, CRUD usuarios con Jquery Ajax

Para crear, leer, actualizar y eliminar usuarios de WordPress (Create, Read, Update y Delete) usando la WP REST API v2 desde un script Jquery Ajax procedemos a:

  • En el documento Html creamos los botones que harán la llamada a Jquery Ajax:
  • <a href="#" id="create" class='btn btn-info'>Create</a>
    <a href="#" id="read" class='btn btn-info'>Read</a>
    <a href="#" id="update" class='btn btn-info'>Update</a>
    <a href="#" id="delete" class='btn btn-info'>Delete</a>
    
  • En el script agregamos la función de encriptación base64:
  • /**
    *
    *  Base64 encode / decode
    *  http://www.webtoolkit.info/
    *
    **/
    var Base64 = {
    
    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    
    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;
    
        input = Base64._utf8_encode(input);
    
        while (i < input.length) {
    
            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);
    
            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;
    
            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }
    
            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
    
        }
    
        return output;
    },
    
    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;
    
        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    
        while (i < input.length) {
    
            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));
    
            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;
    
            output = output + String.fromCharCode(chr1);
    
            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }
    
        }
    
        output = Base64._utf8_decode(output);
    
        return output;
    
    },
    
    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";
    
        for (var n = 0; n < string.length; n++) {
    
            var c = string.charCodeAt(n);
    
            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
    
        }
    
        return utftext;
    },
    
    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;
    
        while ( i < utftext.length ) {
    
            c = utftext.charCodeAt(i);
    
            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
    
        }
    
        return string;
    }
    }
    
  • Además agregamos en el script las llamadas Ajax para Create, Read, Update y Delete:
  • $(document).ready(function(){
        // Create
        $('#create').click(function(e) 
        {        
            $.ajax({
                url: 'https://midominio.com/wp-json/wp/v2/users',
                type: 'POST',
                crossDomain: true,
                beforeSend: function ( xhr ) {
                    xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'usuario:password' ) );
                },
                data: {username: 'pedroperez', password : 'pedro123', email : 'pedro@gmail.com', first_name : 'Pedro', last_name : 'Pérez'},
                success: function( data, txtStatus, xhr ) {
                    console.log( data.username );
                    console.log( xhr.status );
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    console.log(xhr.status);
                    console.log(thrownError);
                }
            }); 
        });
    
        // Read
        $('#read').click(function(e) 
        {
            $.ajax({
                url: 'https://midominio.com/wp-json/wp/v2/users/10',
                type: 'GET',
                crossDomain: true,
                beforeSend: function ( xhr ) {
                    xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'usuario:password' ) );
                },
                    success: function( data, txtStatus, xhr ) {
                    console.log( data.name );
                    console.log( data);
                    console.log( xhr.status );
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    console.log(xhr.status);
                    console.log(thrownError);
                }
            });
        ;});
    
        // Update
        $('#update').click(function(e) 
        {
            $.ajax({
                url: 'https://midominio.com/wp-json/wp/v2/users/10',
                type: 'PUT',
                crossDomain: true,
                beforeSend: function ( xhr ) {
                    xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'usuario:password' ) );
                },
                data: {name: 'Pedro Santaella'},
                success: function( data, txtStatus, xhr ) {
                    console.log( data.username );
                    console.log( xhr.status );
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    console.log(xhr.status);
                    console.log(thrownError);
                }
            });
        });
    
        // Delete 
        $('#delete').click(function(e) 
        {
            $.ajax({
                url: 'https://midominio.com/wp-json/wp/v2/users/10',
                method: 'DELETE',
                crossDomain: true,
                beforeSend: function ( xhr ) {
                    xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'usuario:password' ) );
                },
                data: {force : 'true', reassign : 1},
                success: function( data, txtStatus, xhr ) {
                    console.log( data );
                    console.log( xhr.status );
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    console.log( xhr.status );
                    console.log( thrownError );
                }
            });     
        });
    });
    
  • En la operación Delete se deben pasar en la variable data los parámetros: 'force' : true y 'reassign' : idDelUsuarioAlCualSeLeAsignaranLosPostDelUsuarioQueSePretendeEliminar

Cakephp 3 – Crear una aplicación con bake console

  • Para crear una aplicación predeterminada con bake console, abrimos una terminal de Linux, nos desplazamos hasta la carpeta de nuestro proyecto y ejecutamos los siguientes comandos:
  • bin/cake bake controller nombreDeLaTabla
    bin/cake bake model nombreDelaTabla
    bin/cake bake template nombreDeLaTabla
    
  • El nombre de la tabla debe tener inicial mayúscula, ejemplo: Users.
  • Al ejecutar esos comandos se crearán automáticamente los módulos index, view, add y edit

Linux – CHMOD numérico (permisos a archivos y directorios)

  • Para utilizar el CHMOD numérico nos guiamos por la siguiente lista de permisos:
    • 0: Sin permisos
    • 1: Ejecución
    • 2: Escritura
    • 3: Lectura y escritura
    • 4: Lectura
    • 5: Lectura y ejecución
    • 6: Lectura y escritura
    • 7: Lectura, escritura y ejecución
  • En el CHMOD se utiliza una combinación de tres números «nnn» donde la primera posición corresponde a los permisos del propietario del archivo o directorio, la segunda al grupo y la tercera a otros.
  • En el siguiente ejemplo se dan permisos en el directorio «logs» al Propietario (lectura, escritura y ejecución), al grupo (lectura y ejecución) y a otros (lectura y ejecución).
  • chmod 755 logs
    
  • Si en el directorio «logs» queremos dar permiso recursivo a todos los sub-directorios que se encuentren dentro de él, escribimos
  • chmod -R 755 logs
    
  • Otro caso: Podemos posicionarnos en un directorio cualquiera y dar permiso a todos los archivos que tengan cualquier extensión. Ejemplo
  • cd tmp
    chmod 755 *.*
    
  • También podemos posicionarnos en un directorio y dar permiso a todo: ya sean archivos o directorios. Ejemplo
  • cd tmp
    chmod 755 *
    

Fuente: https://www.solvetic.com/tutoriales/article/1458-entender-los-permisos-linux-chmod/