WordPress

Compartiendo experiencias sobre la plataforma CMS más importante del mundo

BuddyPress

El increíble y fabuloso plugin de WordPress para crear redes sociales verticales

¿Cómo crear una RED SOCIAL?

Experiencias, ideas y materiales para llevar adelante tu próximo proyecto de creación de una red social

lunes, 28 de octubre de 2019

WordPress - Agregar campo editable desde Edición Rápida

# Nuevo campo para ordenar

function pampa_quickedit_custom_posts_columns( $posts_columns ) {
    $posts_columns['pampa_orden'] = __( 'Orden', 'pampa' );
    return $posts_columns;
}
add_filter( 'manage_portfolio_posts_columns', 'pampa_quickedit_custom_posts_columns' );

# Visibilidad de columna en el backend

function pampa_quickedit_custom_column_display( $column_name, $post_id ) {
    if ( 'pampa_orden' == $column_name ) {
        $pampa_orden = get_post_meta( $post_id, 'pampa_orden', true );

        if ( $pampa_orden ) {
            echo esc_html( $pampa_orden );
        } else {
            esc_html_e( 'N/D', 'pampa' );
        }
    }
}
add_action( 'manage_portfolio_posts_custom_column', 'pampa_quickedit_custom_column_display', 10, 2 );

# Visibilidad en Edición Rápida

function pampa_quickedit_fields( $column_name, $post_type ) {
    if ( 'pampa_orden' != $column_name )
        return;

    $pampa_orden = get_post_meta( $post_id, 'pampa_orden', true );
    ?>
    <fieldset class="inline-edit-col-right">
        <div class="inline-edit-col">
            <label>
                <span class="title"><?php esc_html_e( 'Orden', 'pampa' ); ?></span>
                <span class="input-text-wrap">
                    <input type="number" min="1" name="pampa_orden" class="pampaOrden" value="" style="width: auto; margin-left: -31px;">
                </span>
            </label>
        </div>
    </fieldset>
    <?php
}
add_action( 'quick_edit_custom_box', 'pampa_quickedit_fields', 10, 2 );

# Almacenar datos en la base de datos

function pampa_quickedit_save_post( $post_id, $post ) {
    // if called by autosave, then bail here
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return;

    // if this "post" post type?
    if ( $post->post_type != 'portfolio' )
        return;

    // does this user have permissions?
     if ( ! current_user_can( 'edit_post', $post_id ) )
         return;

    // update!
    if ( isset( $_POST['pampa_orden'] ) ) {
        update_post_meta( $post_id, 'pampa_orden', $_POST['pampa_orden'] );
    }
}
add_action( 'save_post', 'pampa_quickedit_save_post', 10, 2 );

# Cargar el valor del campo en la edición rápida

function pampa_quickedit_javascript() {
    $current_screen = get_current_screen();
    if ( $current_screen->id != 'edit-portfolio' || $current_screen->post_type != 'portfolio' )
        return;

    // Ensure jQuery library loads
    wp_enqueue_script( 'jquery' );
    ?>
    <script type="text/javascript">
        jQuery( function( $ ) {
            $( '#the-list' ).on( 'click', 'button.editinline', function( e ) {
                e.preventDefault();
                var pampaOrden = $(this).data( 'pampa-orden' );
                inlineEditPost.revert();
                $( '.pampaOrden' ).val( pampaOrden ? pampaOrden : '' );
            });
        });
    </script>
    <?php
}
add_action( 'admin_print_footer_scripts-edit.php', 'pampa_quickedit_javascript' );

function pampa_quickedit_set_data( $actions, $post ) {
    $found_value = get_post_meta( $post->ID, 'pampa_orden', true );

    if ( $found_value ) {
        if ( isset( $actions['inline hide-if-no-js'] ) ) {
            $new_attribute = sprintf( 'data-pampa-orden="%s"', esc_attr( $found_value ) );
            $actions['inline hide-if-no-js'] = str_replace( 'class=', "$new_attribute class=", $actions['inline hide-if-no-js'] );
        }
    }

    return $actions;
}
add_filter('post_row_actions', 'pampa_quickedit_set_data', 10, 2);

WordPress - Ordenar por campos custom teniendo en cuenta nulos

Esta es una primera solución

    add_action( 'pre_get_posts', 'orden_portfolio' );
    function orden_portfolio( $query ) {
     
        if( ! is_admin() ) {
     
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
            $query->set( 'meta_query', [
                'relation' => 'OR',
                [
                    'key' => 'ce_orden',
                    'compare' => 'NOT EXISTS' ],
                [
                    'key' => 'ce_orden',
                    'compare' => 'EXISTS',
                ],
            ] );
   
            return $query;
   
        }
     
    }

Sin embargo, esta solución muestra primero los registros con meta_value nulo. Esta otra solución, muestra orden ASC y nulos al final:

    function custom_join($join) {
        global $wpdb;
   
        if( ! is_admin() ) {
            $join .= $wpdb->prepare(
            ' LEFT JOIN ' . $wpdb->postmeta . ' cpm ON cpm.post_id = ' . $wpdb->posts . '.ID AND cpm.meta_key = %s'
            , 'ce_orden' );
        }
   
        return $join;
    }
   
    add_filter('posts_join','custom_join');
   
    function custom_orderby($orderby_statement){
        global $wpdb;
   
        if ( ! is_admin() ) {
            $orderby_statement = "CAST( COALESCE(cpm.meta_value,99999) as SIGNED INTEGER) ASC";
        }
   
        return $orderby_statement;
    }
   
    add_filter('posts_orderby','custom_orderby', 10, 2 );

miércoles, 17 de abril de 2019

Redireccionamiento erróneo en copia de sitio WordPress

Muchas veces necesitamos crear una copia de nuestro sitio WordPress de producción para hacer pruebas. Esto puede hacerse dentro del mismo servicio de hosting, en un subdominio o dominio diferente.

Es posible que al ingresar al nuevo subdominio, nos redireccione al stio de producción. Esto puede deberse a dos motivos (o más):

1) No hemos configurado dentro de WordPress el nuevo dominio o subdominio

Para ello hay que modificar la tabla de opciones de la base de datos siguiendo estas reglas: https://codex.wordpress.org/Changing_The_Site_URL

2) Podemos tener algún problema de caché

Lo primero que debemos hacer es ingresar desde una ventana de navegador en modo incógnito. Si esto funciona, ya sabemos que el problema se de caché.
En ese caso, limpiamos el caché local o accedemos con esa opción des habilitada como muestra esta imagen:


lunes, 8 de abril de 2019

Laravel - proc_open - Schedule:run

El siguiente error se produce al utilizar el programador de tareas de Laravel.

The Process class relies on proc_open, which is not available on your PHP installation. 



Si no existe forma de habilitar proc_open, una alternativa es saltear al programador de tareas de Laravel y programar el comando directamente en el cron:




/usr/local/bin/php -q /home/bdig/mm/artisan command:CronJobEncuestas  

viernes, 29 de marzo de 2019

Laravel - Limpiar caché en un hosting

A veces no tenemos acceso SSH y no podemos ejecutar comandos artisan como el siguiente en un alojamiento compartido:

php artisan config:cache

Una alternativa es crear una ruta como:

Route::get('/config-cache', function() {      $exitCode = Artisan::call('config:cache');      return '<h1>Clear Config cleared</h1>';  });

Otras opciones:

//Clear Cache facade value:  Route::get('/clear-cache', function() {      $exitCode = Artisan::call('cache:clear');      return '<h1>Cache facade value cleared</h1>';  });    //Reoptimized class loader:  Route::get('/optimize', function() {      $exitCode = Artisan::call('optimize');      return '<h1>Reoptimized class loader</h1>';  });    //Route cache:  Route::get('/route-cache', function() {      $exitCode = Artisan::call('route:cache');      return '<h1>Routes cached</h1>';  });    //Clear Route cache:  Route::get('/route-clear', function() {      $exitCode = Artisan::call('route:clear');      return '<h1>Route cache cleared</h1>';  });    //Clear View cache:  Route::get('/view-clear', function() {      $exitCode = Artisan::call('view:clear');      return '<h1>View cache cleared</h1>';  });    //Clear Config cache:  Route::get('/config-cache', function() {      $exitCode = Artisan::call('config:cache');      return '<h1>Clear Config cleared</h1>';  });
Fuente de esta gran solución: https://stackoverflow.com/a/41650432/2144424

miércoles, 20 de marzo de 2019

Laravel - proc_open - Composer

En caso de encontrar el siguiente error al tratar de ejecutar algún comando de Composer en un servidor compartido, particularmente cuando usan Laravel (o no), es posible que la única solución sea pedir al soporte del hosting que se lo habilite temporalmente (en mi caso lo solucioné así). O pasar a un VPS:

The Process class relies on proc_open, which is not available on your PHP installation.


Laravel - Rendimiento

En caso que experimenten problemas de rendimiento en Laravel, especialmente en la pantalla de inicio (login), un comando que realmente mejora mucho es:

composer dumpautoload -o