La mejor colección de código para su archivo functions.php [cerrado]

321

Por favor, vote sobre la pregunta y cualquier respuesta que encuentre útil haciendo clic en la flecha hacia ARRIBA que se encuentra en el lado izquierdo de la pregunta o la respuesta.

Como con muchos otros que ahora están viendo esta publicación, he estado leyendo varios blogs, foros y grupos de discusión para aprender y mejorar mis habilidades de wordpress. En los últimos 12 meses he estado en una misión para sustituir mi uso de complementos al agregar código a mi archivo functions.php en su lugar. Si bien estoy completamente de acuerdo en que los complementos son muy útiles en muchas situaciones, mi experiencia demostró que en el 90% de los casos de uso, aunque podría existir un complemento, su utilización podría crear complicaciones innecesarias y problemas de compatibilidad. Además, en muchos casos, estos complementos agregaron menús y otros elementos de administración que no quiero ni necesito.

Más a menudo que no, descubrí que al analizar el código de los complementos pude eliminar el fragmento de código que quería y lo codifiqué en mi functions.php . Esto me proporcionó la funcionalidad exacta que necesitaba sin tener que incluir elementos innecesarios.

Por lo tanto, el propósito de esta publicación es mi intento de involucrarlo a usted, el lector / administrador / desarrollador, para que comparta conmigo y otros bits de código que encuentre útiles y que haya agregado al archivo function.php de su tema para extender o mejorar WordPress sin utilizar un complemento.

Cuando envíe una respuesta aquí, le rogamos asigne un título a cada bit del código, háganos saber si con qué versión de wordpress sabe que es compatible, incluya la descripción que crea que mejor describe su función e (si corresponde) incluya un enlace al complemento original o fuente donde encontró la información.

Espero todas sus respuestas y, por supuesto, continuamente agregaré mis propios hallazgos cuando los encuentre.

    
pregunta NetConstructor.com 14.08.2012 - 12:15

108 respuestas

102

Habilitar la función de administración oculta mostrando TODAS las configuraciones del sitio

Probado en: Wordpress 3.1 RC3

Este pequeño trozo de código hace algo muy bueno. Agregará una opción adicional a su menú de configuración con un enlace a "todas las configuraciones" que le mostrará una lista completa de todas las configuraciones que tiene dentro de su base de datos relacionadas con su sitio de wordpress. El código a continuación solo hará que este enlace sea visible para un usuario administrador y lo ocultará para todos los demás usuarios.

// CUSTOM ADMIN MENU LINK FOR ALL SETTINGS
   function all_settings_link() {
    add_options_page(__('All Settings'), __('All Settings'), 'administrator', 'options.php');
   }
   add_action('admin_menu', 'all_settings_link');
    
respondido por el NetConstructor.com 26.01.2011 - 16:06
85

Modificar el logotipo de inicio de sesión & Enlace URL de imagen

Probado en: WordPress 3.0.1

Este código le permitirá modificar fácilmente el logotipo de la página de inicio de sesión de WordPress, así como el enlace href y el texto del título de este logotipo.

add_filter( 'login_headerurl', 'namespace_login_headerurl' );
/**
 * Replaces the login header logo URL
 *
 * @param $url
 */
function namespace_login_headerurl( $url ) {
    $url = home_url( '/' );
    return $url;
}

add_filter( 'login_headertitle', 'namespace_login_headertitle' );
/**
 * Replaces the login header logo title
 *
 * @param $title
 */
function namespace_login_headertitle( $title ) {
    $title = get_bloginfo( 'name' );
    return $title;
}

add_action( 'login_head', 'namespace_login_style' );
/**
 * Replaces the login header logo
 */
function namespace_login_style() {
    echo '<style>.login h1 a { background-image: url( ' . get_template_directory_uri() . '/images/logo.png ) !important; }</style>';
}

EDITAR: Si desea utilizar el logotipo del sitio para reemplazar el logotipo de inicio de sesión, puede usar lo siguiente para obtener esa información de forma dinámica (probado en WP3.5 ) :

function namespace_login_style() {
    if( function_exists('get_custom_header') ){
        $width = get_custom_header()->width;
        $height = get_custom_header()->height;
    } else {
        $width = HEADER_IMAGE_WIDTH;
        $height = HEADER_IMAGE_HEIGHT;
    }
    echo '<style>'.PHP_EOL;
    echo '.login h1 a {'.PHP_EOL; 
    echo '  background-image: url( '; header_image(); echo ' ) !important; '.PHP_EOL;
    echo '  width: '.$width.'px !important;'.PHP_EOL;
    echo '  height: '.$height.'px !important;'.PHP_EOL;
    echo '  background-size: '.$width.'px '.$height.'px !important;'.PHP_EOL;
    echo '}'.PHP_EOL;
    echo '</style>'.PHP_EOL;
}
    
respondido por el NetConstructor.com 23.01.2013 - 21:02
75

Incluir tipos de publicaciones personalizados en los resultados de búsqueda.

// MAKE CUSTOM POST TYPES SEARCHABLE
function searchAll( $query ) {
 if ( $query->is_search ) { $query->set( 'post_type', array( 'site', 'plugin', 'theme', 'person' )); } 
 return $query;
}
add_filter( 'the_search_query', 'searchAll' );

Agregue sus tipos de publicaciones personalizadas a la fuente RSS principal de sus sitios de forma predeterminada.

// ADD CUSTOM POST TYPES TO THE DEFAULT RSS FEED
function custom_feed_request( $vars ) {
 if (isset($vars['feed']) && !isset($vars['post_type']))
  $vars['post_type'] = array( 'post', 'site', 'plugin', 'theme', 'person' );
 return $vars;
}
add_filter( 'request', 'custom_feed_request' );

Incluya tipos de publicaciones personalizadas en el widget del panel de administración "Ahora mismo"

Esto incluirá tus tipos de publicaciones personalizadas y los recuentos de publicaciones para cada tipo en el widget del panel de control "Ahora mismo".

// ADD CUSTOM POST TYPES TO THE 'RIGHT NOW' DASHBOARD WIDGET
function wph_right_now_content_table_end() {
 $args = array(
  'public' => true ,
  '_builtin' => false
 );
 $output = 'object';
 $operator = 'and';
 $post_types = get_post_types( $args , $output , $operator );
 foreach( $post_types as $post_type ) {
  $num_posts = wp_count_posts( $post_type->name );
  $num = number_format_i18n( $num_posts->publish );
  $text = _n( $post_type->labels->singular_name, $post_type->labels->name , intval( $num_posts->publish ) );
  if ( current_user_can( 'edit_posts' ) ) {
   $num = "<a href='edit.php?post_type=$post_type->name'>$num</a>";
   $text = "<a href='edit.php?post_type=$post_type->name'>$text</a>";
  }
  echo '<tr><td class="first num b b-' . $post_type->name . '">' . $num . '</td>';
  echo '<td class="text t ' . $post_type->name . '">' . $text . '</td></tr>';
 }
 $taxonomies = get_taxonomies( $args , $output , $operator ); 
 foreach( $taxonomies as $taxonomy ) {
  $num_terms  = wp_count_terms( $taxonomy->name );
  $num = number_format_i18n( $num_terms );
  $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name , intval( $num_terms ));
  if ( current_user_can( 'manage_categories' ) ) {
   $num = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$num</a>";
   $text = "<a href='edit-tags.php?taxonomy=$taxonomy->name'>$text</a>";
  }
  echo '<tr><td class="first b b-' . $taxonomy->name . '">' . $num . '</td>';
  echo '<td class="t ' . $taxonomy->name . '">' . $text . '</td></tr>';
 }
}
add_action( 'right_now_content_table_end' , 'wph_right_now_content_table_end' );
    
respondido por el jaredwilli 09.12.2012 - 18:45
74

Eliminar notificación de actualización para todos los usuarios, excepto el usuario ADMIN

Probado en: Wordpress 3.0.1

Este código garantizará que wordpress no notifique a ningún usuario que no sea "admin" cuando haya actualizaciones disponibles.

// REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN
   global $user_login;
   get_currentuserinfo();
   if ($user_login !== "admin") { // change admin to the username that gets the updates
    add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
    add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
   }

Versión modificada para mostrar solo notificaciones de actualización para usuarios de administración (en lugar de solo el usuario 'admin'):

// REMOVE THE WORDPRESS UPDATE NOTIFICATION FOR ALL USERS EXCEPT SYSADMIN
       global $user_login;
       get_currentuserinfo();
       if (!current_user_can('update_plugins')) { // checks to see if current user can update plugins 
        add_action( 'init', create_function( '$a', "remove_action( 'init', 'wp_version_check' );" ), 2 );
        add_filter( 'pre_option_update_core', create_function( '$a', "return null;" ) );
       }
    
respondido por el NetConstructor.com 26.01.2011 - 15:33
69

Cargando jQuery desde el CDN de Google

Probado en: Wordpress 3.0.1

// even more smart jquery inclusion :)
add_action( 'init', 'jquery_register' );

// register from google and for footer
function jquery_register() {

if ( !is_admin() ) {

    wp_deregister_script( 'jquery' );
    wp_register_script( 'jquery', ( 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js' ), false, null, true );
    wp_enqueue_script( 'jquery' );
}
}

Eliminar la información de la versión de WordPress para seguridad

Probado en: Wordpress 3.0.1

// remove version info from head and feeds
function complete_version_removal() {
    return '';
}
add_filter('the_generator', 'complete_version_removal');

Añadir spam & Eliminar enlaces a comentarios en Front End

Probado en: Wordpress 3.0.1

Esto hace que sea mucho más fácil administrar los comentarios desde la parte frontal al agregar spam y eliminar enlaces. **

// spam & delete links for all versions of wordpress
function delete_comment_link($id) {
    if (current_user_can('edit_post')) {
        echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&c='.$id.'">del</a> ';
        echo '| <a href="'.get_bloginfo('wpurl').'/wp-admin/comment.php?action=cdc&dt=spam&c='.$id.'">spam</a>';
    }
}

Retrasa la publicación pública a RSS Feed

Probado en: Wordpress 3.0.1

Finalmente, me gusta retrasar la publicación en mis feeds RSS durante 10-15 minutos porque siempre encuentro al menos un par de errores en mi texto. Hay otros usos en caso de que desee que el contenido sea exclusivo de su sitio durante un día o una semana antes de publicarlo en sus lectores RSS.

// delay feed update
function publish_later_on_feed($where) {
    global $wpdb;

    if (is_feed()) {
        // timestamp in WP-format
        $now = gmdate('Y-m-d H:i:s');

        // value for wait; + device
        $wait = '10'; // integer

        // http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff
        $device = 'MINUTE'; // MINUTE, HOUR, DAY, WEEK, MONTH, YEAR

        // add SQL-sytax to default $where
        $where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
    }
    return $where;
}
add_filter('posts_where', 'publish_later_on_feed');
    
respondido por el Derek Perkins 31.01.2012 - 11:48
54

Herramientas de generación de perfiles de Wordpress

Me gusta agregar herramientas de perfiles en un archivo separado, que luego incluyo desde functions.php cuando sea necesario:

<?php
if ( !defined('SAVEQUERIES') && isset($_GET['debug']) && $_GET['debug'] == 'sql' )
    define('SAVEQUERIES', true);
if ( !function_exists('dump') ) :
/**
 * dump()
 *
 * @param mixed $in
 * @return mixed $in
 **/

function dump($in = null) {
    echo '<pre style="margin-left: 0px; margin-right: 0px; padding: 10px; border: solid 1px black; background-color: ghostwhite; color: black; text-align: left;">';
    foreach ( func_get_args() as $var ) {
        echo "\n";
        if ( is_string($var) ) {
            echo "$var\n";
        } else {
            var_dump($var);
        }
    }
    echo '</pre>' . "\n";
    return $in;
} # dump()
endif;

/**
 * add_stop()
 *
 * @param mixed $in
 * @param string $where
 * @return mixed $in
 **/

function add_stop($in = null, $where = null) {
    global $sem_stops;
    global $wp_object_cache;
    $queries = get_num_queries();
    $milliseconds = timer_stop() * 1000;
    $out =  "$queries queries - {$milliseconds}ms";
    if ( function_exists('memory_get_usage') ) {
        $memory = number_format(memory_get_usage() / ( 1024 * 1024 ), 1);
        $out .= " - {$memory}MB";
    }
    $out .= " - $wp_object_cache->cache_hits cache hits / " . ( $wp_object_cache->cache_hits + $wp_object_cache->cache_misses );
    if ( $where ) {
        $sem_stops[$where] = $out;
    } else {
        dump($out);
    }
    return $in;
} # add_stop()


/**
 * dump_stops()
 *
 * @param mixed $in
 * @return mixed $in
 **/

function dump_stops($in = null) {
    if ( $_POST )
        return $in;
    global $sem_stops;
    global $wp_object_cache;
    $stops = '';
    foreach ( $sem_stops as $where => $stop )
        $stops .= "$where: $stop\n";
    dump("\n" . trim($stops) . "\n");
    if ( defined('SAVEQUERIES') && $_GET['debug'] == 'sql' ) {
        global $wpdb;
        foreach ( $wpdb->queries as $key => $data ) {
            $query = rtrim($data[0]);
            $duration = number_format($data[1] * 1000, 1) . 'ms';
            $loc = trim($data[2]);
            $loc = preg_replace("/(require|include)(_once)?,\s*/ix", '', $loc);
            $loc = "\n" . preg_replace("/,\s*/", ",\n", $loc) . "\n";
            dump($query, $duration, $loc);
        }
    }
    if ( $_GET['debug'] == 'cache' )
        dump($wp_object_cache->cache);
    if ( $_GET['debug'] == 'cron' ) {
        $crons = get_option('cron');
        foreach ( $crons as $time => $_crons ) {
            if ( !is_array($_crons) )
                continue;
            foreach ( $_crons as $event => $_cron ) {
                foreach ( $_cron as $details ) {
                    $date = date('Y-m-d H:m:i', $time);
                    $schedule = isset($details['schedule']) ? "({$details['schedule']})" : '';
                    if ( $details['args'] )
                        dump("$date: $event $schedule", $details['args']);
                    else
                        dump("$date: $event $schedule");
                }
            }
        }
    }
    return $in;
} # dump_stops()
add_action('init', create_function('$in', '
    return add_stop($in, "Load");
    '), 10000000);
add_action('template_redirect', create_function('$in', '
    return add_stop($in, "Query");
    '), -10000000);
add_action('wp_footer', create_function('$in', '
    return add_stop($in, "Display");
    '), 10000000);
add_action('admin_footer', create_function('$in', '
    return add_stop($in, "Display");
    '), 10000000);

/**
 * init_dump()
 *
 * @return void
 **/

function init_dump() {
    global $hook_suffix;
    if ( !is_admin() || empty($hook_suffix) ) {
        add_action('wp_footer', 'dump_stops', 10000000);
        add_action('admin_footer', 'dump_stops', 10000000);
    } else {
        add_action('wp_footer', 'dump_stops', 10000000);
        add_action("admin_footer-$hook_suffix", 'dump_stops', 10000000);
    }
} # init_dump()
add_action('wp_print_scripts', 'init_dump');


/**
 * dump_phpinfo()
 *
 * @return void
 **/

function dump_phpinfo() {
    if ( isset($_GET['debug']) && $_GET['debug'] == 'phpinfo' ) {
        phpinfo();
        die;
    }
} # dump_phpinfo()
add_action('init', 'dump_phpinfo');


/**
 * dump_http()
 *
 * @param array $args
 * @param string $url
 * @return array $args
 **/

function dump_http($args, $url) {
    dump(preg_replace("|/[0-9a-f]{32}/?$|", '', $url));
    return $args;
} # dump_http()


/**
 * dump_trace()
 *
 * @return void
 **/

function dump_trace() {
    $backtrace = debug_backtrace();
    foreach ( $backtrace as $trace )
        dump(
            'File/Line: ' . $trace['file'] . ', ' . $trace['line'],
            'Function / Class: ' . $trace['function'] . ', ' . $trace['class']
            );
} # dump_trace()
if ( $_GET['debug'] == 'http' )
    add_filter('http_request_args', 'dump_http', 0, 2);
?>
    
respondido por el Denis 26.01.2011 - 15:14
53

Establezca un número máximo de revisiones de publicaciones para evitar el aumento de DB.

Probado en: Wordpress 3.0.1

El valor predeterminado es infinito, esto lo configurará para recordar solo las últimas 5 ediciones:

/**
 * Set the post revisions unless the constant was set in wp-config.php
 */
if (!defined('WP_POST_REVISIONS')) define('WP_POST_REVISIONS', 5);

FWIW hay un montón de grandes ideas para CONSTANTES que se pueden configurar en la página del Codex Edición de wp-config.php .

    
respondido por el Jeremy Clarke 26.01.2011 - 15:33
48

Enfocar las imágenes redimensionadas (solo jpg)

Esta función afila imágenes jpg redimensionadas. Un ejemplo de diferencia:

function ajx_sharpen_resized_files( $resized_file ) {

    $image = wp_load_image( $resized_file );
    if ( !is_resource( $image ) )
        return new WP_Error( 'error_loading_image', $image, $file );

    $size = @getimagesize( $resized_file );
    if ( !$size )
        return new WP_Error('invalid_image', __('Could not read image size'), $file);
    list($orig_w, $orig_h, $orig_type) = $size;

    switch ( $orig_type ) {
        case IMAGETYPE_JPEG:
            $matrix = array(
                array(-1, -1, -1),
                array(-1, 16, -1),
                array(-1, -1, -1),
            );

            $divisor = array_sum(array_map('array_sum', $matrix));
            $offset = 0; 
            imageconvolution($image, $matrix, $divisor, $offset);
            imagejpeg($image, $resized_file,apply_filters( 'jpeg_quality', 90, 'edit_image' ));
            break;
        case IMAGETYPE_PNG:
            return $resized_file;
        case IMAGETYPE_GIF:
            return $resized_file;
    }

    return $resized_file;
}   

add_filter('image_make_intermediate_size', 'ajx_sharpen_resized_files',900);
    
respondido por el Ünsal Korkmaz 04.12.2011 - 22:33
47

Eliminar cajas de metadatos de Wordpress predeterminadas

Probado en: Wordpress 3.0.1

Este código le permitirá eliminar Meta Boxes específicos que wordpress agrega de manera predeterminada a las pantallas predeterminadas Agregar / Editar Publicación y Agregar / Editar Página.

// REMOVE META BOXES FROM DEFAULT POSTS SCREEN
   function remove_default_post_screen_metaboxes() {
 remove_meta_box( 'postcustom','post','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','post','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','post','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','post','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','post','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','post','normal' ); // Author Metabox
 }
   add_action('admin_menu','remove_default_post_screen_metaboxes');


// REMOVE META BOXES FROM DEFAULT PAGES SCREEN
   function remove_default_page_screen_metaboxes() {
 remove_meta_box( 'postcustom','page','normal' ); // Custom Fields Metabox
 remove_meta_box( 'postexcerpt','page','normal' ); // Excerpt Metabox
 remove_meta_box( 'commentstatusdiv','page','normal' ); // Comments Metabox
 remove_meta_box( 'trackbacksdiv','page','normal' ); // Talkback Metabox
 remove_meta_box( 'slugdiv','page','normal' ); // Slug Metabox
 remove_meta_box( 'authordiv','page','normal' ); // Author Metabox
 }
   add_action('admin_menu','remove_default_page_screen_metaboxes');
    
respondido por el NetConstructor.com 19.02.2012 - 14:27
44

Eliminar "Wordpress" al filtro "WordPress"

Probado en: Wordpress 3.0.1

Se agregó un filtro con WordPress versión 3.0 que convierte automáticamente todas las instancias de "Wordpress" (sin mayúscula P) a "WordPress" (con una P mayúscula) en el contenido de la publicación, los títulos de las publicaciones y el texto de los comentarios. Algunas personas ven esto como algo intrusivo, solo tengo la necesidad de malinterpretar WordPress de vez en cuando y el filtro me resulta un poco molesto.

// Remove annoying P filter
if(function_exists('capital_P_dangit')) {
    foreach ( array( 'the_content', 'the_title' ) as $filter ) 
        remove_filter( $filter, 'capital_P_dangit', 11 ); 

    remove_filter('comment_text', 'capital_P_dangit', 31 );
}
    
respondido por el EAMann 26.02.2011 - 00:15
42

Personalizar el panel de control

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

Eliminar estos widgets del panel ...

   unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);
   unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
   unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);

Agregue un widget personalizado llamado 'Ayuda y soporte'

   wp_add_dashboard_widget('custom_help_widget', 'Help and Support', 'custom_dashboard_help');
}

Este es el contenido de tu widget personalizado

 function custom_dashboard_help() {
    echo '<p>Lorum ipsum delor sit amet et nunc</p>';
}
    
respondido por el George Wiscombe 21.10.2010 - 16:52
41

Añadir campos de perfil de usuario personalizados

Coloque el código a continuación en su archivo functions.php para agregar campos de perfil de usuario personalizados. Edite o agregue líneas como mejor le parezca.

Recuerde no quitar la línea: return $ contactmethods; de lo contrario esto no funcionará.

// CUSTOM USER PROFILE FIELDS
   function my_custom_userfields( $contactmethods ) {

    // ADD CONTACT CUSTOM FIELDS
    $contactmethods['contact_phone_office']     = 'Office Phone';
    $contactmethods['contact_phone_mobile']     = 'Mobile Phone';
    $contactmethods['contact_office_fax']       = 'Office Fax';

    // ADD ADDRESS CUSTOM FIELDS
    $contactmethods['address_line_1']       = 'Address Line 1';
    $contactmethods['address_line_2']       = 'Address Line 2 (optional)';
    $contactmethods['address_city']         = 'City';
    $contactmethods['address_state']        = 'State';
    $contactmethods['address_zipcode']      = 'Zipcode';
    return $contactmethods;
   }
   add_filter('user_contactmethods','my_custom_userfields',10,1);

Para mostrar campos personalizados, puede utilizar uno de los dos métodos que se enumeran a continuación.

Opción 1:

the_author_meta('facebook', $current_author->ID)

Opción 2:

<?php $current_author = get_userdata(get_query_var('author')); ?>
<p><a href="<?php echo esc_url($current_author->contact_phone_office);?>" title="office_phone"> Office Phone</a></p>
    
respondido por el NetConstructor.com 26.01.2011 - 15:15
38

Personaliza el orden del menú de administración

probado en: Wordpress 3.0.1

Este código le permitirá reorganizar el orden de los elementos en el menú de administración. Todo lo que necesita hacer es hacer clic en un enlace existente en el menú de administración y copiar todo antes de / wp-admin / URL. El orden a continuación representa el orden que tendrá el nuevo menú de administración.

// CUSTOMIZE ADMIN MENU ORDER
   function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array(
        'index.php', // this represents the dashboard link
        'edit.php?post_type=events', // this is a custom post type menu
        'edit.php?post_type=news', 
        'edit.php?post_type=articles', 
        'edit.php?post_type=faqs', 
        'edit.php?post_type=mentors',
        'edit.php?post_type=testimonials',
        'edit.php?post_type=services',
        'edit.php?post_type=page', // this is the default page menu
        'edit.php', // this is the default POST admin menu 
    );
   }
   add_filter('custom_menu_order', 'custom_menu_order');
   add_filter('menu_order', 'custom_menu_order');
    
respondido por el NetConstructor.com 10.10.2010 - 12:29
37

Añadir miniaturas en Administrar publicaciones / Lista de páginas

Puede agregar esto a sus funciones para mostrar en la lista Administrar / Editar publicaciones y páginas una nueva columna con la vista previa en miniatura.

/****** Add Thumbnails in Manage Posts/Pages List ******/
if ( !function_exists('AddThumbColumn') && function_exists('add_theme_support') ) {

    // for post and page
    add_theme_support('post-thumbnails', array( 'post', 'page' ) );

    function AddThumbColumn($cols) {

        $cols['thumbnail'] = __('Thumbnail');

        return $cols;
    }

    function AddThumbValue($column_name, $post_id) {

            $width = (int) 35;
            $height = (int) 35;

            if ( 'thumbnail' == $column_name ) {
                // thumbnail of WP 2.9
                $thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
                // image from gallery
                $attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
                if ($thumbnail_id)
                    $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
                elseif ($attachments) {
                    foreach ( $attachments as $attachment_id => $attachment ) {
                        $thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
                    }
                }
                    if ( isset($thumb) && $thumb ) {
                        echo $thumb;
                    } else {
                        echo __('None');
                    }
            }
    }

    // for posts
    add_filter( 'manage_posts_columns', 'AddThumbColumn' );
    add_action( 'manage_posts_custom_column', 'AddThumbValue', 10, 2 );

    // for pages
    add_filter( 'manage_pages_columns', 'AddThumbColumn' );
    add_action( 'manage_pages_custom_column', 'AddThumbValue', 10, 2 );
}
    
respondido por el Philip 26.01.2011 - 15:03
37

Función para cambiar la longitud del extracto

Probado en: Wordpress 3.0.1

Por defecto, todos los extractos tienen un límite de 55 palabras. Utilizando el código de abajo, puede anular esta configuración predeterminada:

function new_excerpt_length($length) { 
    return 100;
}

add_filter('excerpt_length', 'new_excerpt_length');

Este ejemplo cambia la longitud del extracto a 100 palabras, pero puedes usar el mismo método para cambiarlo a cualquier valor.

    
respondido por el Name-AK 26.01.2011 - 15:37
37

Eliminar pings a tu propio blog

Probado en: Wordpress 3.0.1

//remove pings to self
function no_self_ping( &$links ) {
    $home = get_option( 'home' );
    foreach ( $links as $l => $link )
        if ( 0 === strpos( $link, $home ) )
            unset($links[$l]);
}
add_action( 'pre_ping', 'no_self_ping' );
    
respondido por el Dan Gayle 26.01.2011 - 15:38
33

Habilitar la compresión de salida GZIP

Normalmente, el servidor debe configurarse para hacer esto automáticamente, pero muchos hosts compartidos no lo hacen t hacer esto (probablemente para aumentar el uso del ancho de banda del cliente)

 if(extension_loaded("zlib") && (ini_get("output_handler") != "ob_gzhandler"))
   add_action('wp', create_function('', '@ob_end_clean();@ini_set("zlib.output_compression", 1);'));
    
respondido por el onetrickpony 23.12.2010 - 13:13
31

Mostrar consultas de base de datos, tiempo empleado y consumo de memoria

Probado en: Wordpress 3.0.1

function performance( $visible = false ) {

    $stat = sprintf(  '%d queries in %.3f seconds, using %.2fMB memory',
        get_num_queries(),
        timer_stop( 0, 3 ),
        memory_get_peak_usage() / 1024 / 1024
        );

    echo $visible ? $stat : "<!-- {$stat} -->" ;
}

Luego, este código debajo del código anterior, que insertará automáticamente el código anterior en el pie de página de su sitio web público (asegúrese de que su tema esté llamando a wp_footer):

add_action( 'wp_footer', 'performance', 20 );

Se puede llamar varias veces.

    
respondido por el Rarst 26.01.2011 - 15:38
31

Anular el registro de los widgets predeterminados de WP

Probado en: WordPress 3.0.1

// unregister all default WP Widgets
function unregister_default_wp_widgets() {
    unregister_widget('WP_Widget_Pages');
    unregister_widget('WP_Widget_Calendar');
    unregister_widget('WP_Widget_Archives');
    unregister_widget('WP_Widget_Links');
    unregister_widget('WP_Widget_Meta');
    unregister_widget('WP_Widget_Search');
    unregister_widget('WP_Widget_Text');
    unregister_widget('WP_Widget_Categories');
    unregister_widget('WP_Widget_Recent_Posts');
    unregister_widget('WP_Widget_Recent_Comments');
    unregister_widget('WP_Widget_RSS');
    unregister_widget('WP_Widget_Tag_Cloud');
}
add_action('widgets_init', 'unregister_default_wp_widgets', 1);
    
respondido por el bueltge 19.04.2016 - 08:41
30

Extraer automáticamente la primera imagen del contenido de la publicación

Probado en: Wordpress 3.0.1

Este código extraerá automáticamente la primera imagen asociada con una publicación y le permitirá mostrarla / usarla llamando a la función getImage.

// AUTOMATICALLY EXTRACT THE FIRST IMAGE FROM THE POST 
function getImage($num) {
    global $more;
    $more = 1;
    $link = get_permalink();
    $content = get_the_content();
    $count = substr_count($content, '<img');
    $start = 0;
    for($i=1;$i<=$count;$i++) {
        $imgBeg = strpos($content, '<img', $start);
        $post = substr($content, $imgBeg);
        $imgEnd = strpos($post, '>');
        $postOutput = substr($post, 0, $imgEnd+1);
        $postOutput = preg_replace('/width="([0-9]*)" height="([0-9]*)"/', '',$postOutput);;
        $image[$i] = $postOutput;
        $start=$imgEnd+1;
    }
    if(stristr($image[$num],'<img')) { echo '<a href="'.$link.'">'.$image[$num]."</a>"; }
    $more = 0;
}
    
respondido por el NetConstructor.com 26.01.2011 - 15:34
27

Muestra el archivo de plantilla de tema que usa una publicación / página en el encabezado

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    print_r($template);
}

Acorta la salida DIV predeterminada si tu tema está usando post_class.

si tu tema está usando algo como

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

Puedes tener divs largos y locos en tu fuente que podrían tener este aspecto o incluso más:

<div id="post-4" class="post-4 post type-post hentry category-uncategorized category-test category-test-1-billion category-test2 category-test3 category-testing"> 

Esto realmente puede comenzar a desordenar su fuente y parecer bastante innecesario en la mayoría de los casos, con una profundidad de 3-4 es suficiente.

Para el ejemplo superior, podemos dividir la salida de la siguiente manera:

// slice crazy long div outputs
    function category_id_class($classes) {
        global $post;
        foreach((get_the_category($post->ID)) as $category)
            $classes[] = $category->category_nicename;
            return array_slice($classes, 0,5);
    }
    add_filter('post_class', 'category_id_class');

esto divide la salida para incluir solo los primeros 5 valores, por lo que el ejemplo anterior se convierte en:

<div id="post-4" class="post-4 post type-post hentry category-uncategorized"> 

Hacer que los archivos de categorías muestren todas las publicaciones, independientemente del tipo de publicación: bueno para los tipos de publicaciones personalizadas

function any_ptype_on_cat($request) {
 if ( isset($request['category_name']) )
  $request['post_type'] = 'any';

 return $request;
}
add_filter('request', 'any_ptype_on_cat');

Eliminar elementos del tablero no deseados

Esto ya se publicó, pero no tenía la lista completa de elementos. Especialmente esos molestos "enlaces entrantes"

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
global $wp_meta_boxes;
 //Right Now - Comments, Posts, Pages at a glance
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']);
//Recent Comments
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']);
//Incoming Links
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']);
//Plugins - Popular, New and Recently updated Wordpress Plugins
unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']);

//Wordpress Development Blog Feed
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']);
//Other Wordpress News Feed
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']);
//Quick Press Form
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']);
//Recent Drafts List
unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']);
}

Eliminar los saltos de página "Leer más" **

en lugar de volver a la parte superior de la página. Sabes como cuando haga clic en "leer más"; saltará al lugar en la página, lo que puede ser molesto, esto hace que solo cargue la página normalmente, ¡no hay que saltar!

function remove_more_jump_link($link) { 
$offset = strpos($link, '#more-');
if ($offset) {
$end = strpos($link, '"',$offset);
}
if ($end) {
$link = substr_replace($link, '', $offset, $end-$offset);
}
return $link;
}
add_filter('the_content_more_link', 'remove_more_jump_link');

Restrinja los elementos del menú ADMIN en función del nombre de usuario , reemplace el nombre de usuario con un nombre de usuario real.

function remove_menus()
{
    global $menu;
    global $current_user;
    get_currentuserinfo();

    if($current_user->user_login == 'username')
    {
        $restricted = array(__('Posts'),
                            __('Media'),
                            __('Links'),
                            __('Pages'),
                            __('Comments'),
                            __('Appearance'),
                            __('Plugins'),
                            __('Users'),
                            __('Tools'),
                            __('Settings')
        );
        end ($menu);
        while (prev($menu)){
            $value = explode(' ',$menu[key($menu)][0]);
            if(in_array($value[0] != NULL?$value[0]:"" , $restricted)){unset($menu[key($menu)]);}
        }// end while

    }// end if
}
add_action('admin_menu', 'remove_menus');

// alternativamente, puedes usar if ($ current_user- > user_login! = 'admin') en su lugar, probablemente sea más útil

Estilo de la nube de etiquetas

//tag cloud custom
add_filter('widget_tag_cloud_args','style_tags');
function style_tags($args) {
$args = array(
     'largest'    => '10',
     'smallest'   => '10',
     'format'     => 'list',
     );
return $args;
}

Referencia completa de opciones aquí (¡hay muchas!) enlace

Cambiar el temporizador de actualización del widget RSS predeterminado

(el valor predeterminado es 6 o 12 horas, lo olvido (1800 = 30min).

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );
    
respondido por el Wyck 05.09.2011 - 19:48
25

Eliminar el aviso de actualización de complemento SOLO para complementos INACTIVOS

function update_active_plugins($value = '') {
    /*
    The $value array passed in contains the list of plugins with time
    marks when the last time the groups was checked for version match
    The $value->reponse node contains an array of the items that are
    out of date. This response node is use by the 'Plugins' menu
    for example to indicate there are updates. Also on the actual
    plugins listing to provide the yellow box below a given plugin
    to indicate action is needed by the user.
    */
    if ((isset($value->response)) && (count($value->response))) {

        // Get the list cut current active plugins
        $active_plugins = get_option('active_plugins');    
        if ($active_plugins) {

            //  Here we start to compare the $value->response
            //  items checking each against the active plugins list.
            foreach($value->response as $plugin_idx => $plugin_item) {

                // If the response item is not an active plugin then remove it.
                // This will prevent WordPress from indicating the plugin needs update actions.
                if (!in_array($plugin_idx, $active_plugins))
                    unset($value->response[$plugin_idx]);
            }
        }
        else {
             // If no active plugins then ignore the inactive out of date ones.
            foreach($value->response as $plugin_idx => $plugin_item) {
                unset($value->response);
            }          
        }
    }  
    return $value;
}
add_filter('transient_update_plugins', 'update_active_plugins');    // Hook for 2.8.+
//add_filter( 'option_update_plugins', 'update_active_plugins');    // Hook for 2.7.x
    
respondido por el NetConstructor.com 26.01.2011 - 15:08
25

Eliminar información superflua y HTML dentro de la etiqueta <head>

// remove unnecessary header info
add_action( 'init', 'remove_header_info' );
function remove_header_info() {
    remove_action( 'wp_head', 'rsd_link' );
    remove_action( 'wp_head', 'wlwmanifest_link' );
    remove_action( 'wp_head', 'wp_generator' );
    remove_action( 'wp_head', 'start_post_rel_link' );
    remove_action( 'wp_head', 'index_rel_link' );
    remove_action( 'wp_head', 'adjacent_posts_rel_link' );         // for WordPress < 3.0
    remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); // for WordPress >= 3.0
}

// remove extra CSS that 'Recent Comments' widget injects
add_action( 'widgets_init', 'remove_recent_comments_style' );
function remove_recent_comments_style() {
    global $wp_widget_factory;
    remove_action( 'wp_head', array(
        $wp_widget_factory->widgets['WP_Widget_Recent_Comments'],
        'recent_comments_style'
    ) );
}
    
respondido por el 4 revs, 4 users 63%Andrew Ryno 12.02.2015 - 18:54
22

Habilite la depuración y el registro de errores para usar en sitios en vivo

Este es un fragmento de código que escribí para hacer uso de las constantes WP_DEBUG que normalmente están deshabilitadas de forma predeterminada. Bueno, creé una manera de no solo habilitar WP_DEBUG para que pueda usarlo en un sitio en vivo sin efectos secundarios negativos, sino que también utilicé las otras constantes de depuración para forzar que se muestren los errores y para crear un archivo de registro de los errores y avisos en el directorio / wp-content.

Coloque este código en su archivo wp-config.php (DESPUÉS DE GUARDAR UN RESPALDO SOLO EN CASO) y luego puede pasar los parámetros? debug = 1, 2 o 3 al final de cualquier url en su sitio.

? debug = 1 = muestra todos los errores / avisos ? debug = 2 = obliga a que se muestren ? debug = 3 = crea un archivo debug.log de todos los errores en / wp-content dir.

/**
* Written by Jared Williams - http://new2wp.com
* @wp-config.php replace WP_DEBUG constant with this code
* Enable WP debugging for usage on a live site
* http://core.trac.wordpress.org/browser/trunk/wp-includes/load.php#L230
* Pass the '?debug=#' parameter at the end of any url on site
*
* http://example.com/?debug=1, /?debug=2, /?debug=3
*/
if ( isset($_GET['debug']) && $_GET['debug'] == '1' ) {
    // enable the reporting of notices during development - E_ALL
    define('WP_DEBUG', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '2' ) {
    // must be true for WP_DEBUG_DISPLAY to work
    define('WP_DEBUG', true);
    // force the display of errors
    define('WP_DEBUG_DISPLAY', true);
} elseif ( isset($_GET['debug']) && $_GET['debug'] == '3' ) {
    // must be true for WP_DEBUG_LOG to work
    define('WP_DEBUG', true);
    // log errors to debug.log in the wp-content directory
    define('WP_DEBUG_LOG', true);
}

Para más detalles sobre el post de invitado que escribí para Comluv si está interesado, aquí: enlace

Todavía estoy trabajando en una forma de hacer que esto esté protegido por contraseña, o preferiblemente de alguna manera hacerlo funcionar en if (current_user_can ('manage_themes') e is_logged_in ().

Pero ahí es donde se vuelve mucho más complicado.

    
respondido por el jaredwilli 13.11.2010 - 11:26
20

Nuevos roles y capacidades: ¡solo se ejecutan una vez!

Tengo esto a mano, esta es la forma correcta de hacerlos sin un complemento. Establecen un solo campo (prefix_user_roles) en la base de datos de opciones, y no necesita un complemento para establecerlos. Consulte la página del Codex para obtener una lista de las capacidades disponibles y las descripciones de lo que hacen. Usted solo necesito descomentar uno de estos bloques, cargar cualquier página y luego comentarlos nuevamente. Aquí estoy creando un rol que tiene las capacidades que necesito:

/* Capabilities */

// To add the new role, using 'international' as the short name and
// 'International Blogger' as the displayed name in the User list and edit page:
/*
add_role('international', 'International Blogger', array(
    'read' => true, // True allows that capability, False specifically removes it.
    'edit_posts' => true,
    'delete_posts' => true,
    'edit_published_posts' => true,
    'publish_posts' => true,
    'edit_files' => true,
    'import' => true,
    'upload_files' => true //last in array needs no comma!
));
*/


// To remove one outright or remove one of the defaults:
/* 
remove_role('international');
*/

A veces es útil agregar / eliminar de una función existente en lugar de eliminar y volver a agregar una. Nuevamente, solo necesita descomentarlo, volver a cargar una página y luego comentarla nuevamente. Esto almacenará el rol / la capacidad adecuadamente en la tabla de opciones. (Esto le permite al desarrollador controlarlos y elimina la sobrecarga de los voluminosos complementos que hacen lo mismo). Aquí, estoy cambiando el rol de autor para eliminar sus publicaciones publicadas (la opción predeterminada), pero permitiéndoles la capacidad de editar. sus publicaciones publicadas (lo que no es posible para este rol de forma predeterminada), utilizando * add_cap * o * remove_cap *.

/*
$edit_role = get_role('author');
   $edit_role->add_cap('edit_published_posts');
   $edit_role->remove_cap('delete_published_posts');
*/

Guardo una hoja de cálculo con la cuadrícula de la página de Codex para los sitios que se modifican de esta manera, por lo que puedo recordar cómo se configuran las cosas, aunque dejar el código comentado en el archivo functions.php funcionará. No deje estos ejemplos sin comentar, ¡o se escribirá en la base de datos con cada carga de página!

    
respondido por el tomcat23 12.03.2011 - 00:44
19

Agregar automáticamente títulos dinámicos a páginas públicas

Probado en: Wordpress 3.0.1

El uso del código a continuación creará automáticamente títulos de página dinámicos basados en las páginas / publicaciones que se ven públicamente.

/* Dynamic Titles **/
// This sets your <title> depending on what page you're on, for better formatting and for SEO
// You need to set the variable $longd to some custom text at the beginning of the function
function dynamictitles() {
$longd = __('Enter your longdescription here.', 'texdomainstring');
    if ( is_single() ) {
      wp_title('');
      echo ' | '.get_bloginfo('name');

} else if ( is_page() || is_paged() ) {
      bloginfo('name');
      wp_title('|');

} else if ( is_author() ) {
      bloginfo('name');
      wp_title(' | '.__('Author', 'texdomainstring'));

} else if ( is_category() ) {
      bloginfo('name');
      wp_title(' | '.__('Archive for', 'texdomainstring'));

} else if ( is_tag() ) {
      echo get_bloginfo('name').' | '.__('Tag archive for', 'texdomainstring');
      wp_title('');

} else if ( is_archive() ) {
      echo get_bloginfo('name').' | '.__('Archive for', 'texdomainstring');
      wp_title('');

} else if ( is_search() ) {
      echo get_bloginfo('name').' | '.__('Search Results', 'texdomainstring');
} else if ( is_404() ) {
      echo get_bloginfo('name').' | '.__('404 Error (Page Not Found)', 'texdomainstring');

} else if ( is_home() ) {
      echo get_bloginfo('name').' | '.get_bloginfo('description');

} else {
      echo get_bloginfo('name').' | '.($blog_longd);
}
}
    
respondido por el Chris_O 01.03.2011 - 17:52
18

Pie de página de administrador personalizado de Wordpress

// customize admin footer text
function custom_admin_footer() {
        echo 'add your custom footer text and html here';
} 
add_filter('admin_footer_text', 'custom_admin_footer');

Lo uso para sitios de clientes como un simple punto de referencia para contactarme como el desarrollador.

    
respondido por el chuck reynolds 28.12.2010 - 01:45
18

Habilitar códigos cortos en widgets

// shortcode in widgets
if ( !is_admin() ){
    add_filter('widget_text', 'do_shortcode', 11);
}
    
respondido por el CommentLuv 26.01.2011 - 15:09
17

Función para deshabilitar fuentes RSS

Probado en: Wordpress 3.0.1

Puede deshabilitar las fuentes RSS si desea mantener su sitio web basado en Wordpress como estático.

Puedes usar esta función:

function fb_disable_feed() {
wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') );
}

add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);
    
respondido por el Name-AK 26.01.2011 - 15:33
14

Cambia el mensaje "Howdy" a "Bienvenido"

Con esta función, puede personalizar el mensaje "Howdy" en la parte superior derecha de su área de administración.
Esta función utiliza JQuery para cambiar el mensaje "Hola" a "Bienvenido".

/****** Customize admin message "Howdy" to "Welcome" ******/
$nohowdy = "Welcome";

if (is_admin()) {
    add_action('init', 'artdev_nohowdy_h');
    add_action('admin_footer', 'artdev_nohowdy_f');
}
// Load jQuery
function artdev_nohowdy_h() {
    wp_enqueue_script('jquery');
}
// Modify
function artdev_nohowdy_f() {
global $nohowdy;
echo <<<JS
<script type="text/javascript">
//<![CDATA[
var nohowdy = "$nohowdy";
jQuery('#user_info p')
    .html(
    jQuery('#user_info p')
        .html()
        .replace(/Howdy/,nohowdy)
    );
//]]>
JS;
}

Versión de PHP, usando gettext filter:

add_filter('gettext', 'change_howdy', 10, 3);

function change_howdy($translated, $text, $domain) {

    if (!is_admin() || 'default' != $domain)
        return $translated;

    if (false !== strpos($translated, 'Howdy'))
        return str_replace('Howdy', 'Welcome', $translated);

    return $translated;
}
    
respondido por el Philip 26.02.2011 - 00:47

Lea otras preguntas en las etiquetas