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


332

Vote la pregunta y las respuestas que encuentre útiles haciendo clic en la flecha ARRIBA en el lado izquierdo de la pregunta o respuesta.

Al igual que 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 tenido la misión de sustituir mi uso de complementos agregando código a mi functions.phparchivo. 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 uso podría crear complicaciones innecesarias y problemas de compatibilidad. Además, en muchos casos, tales complementos agregaron menús y otros elementos de administración que no quiero ni necesito.

La mayoría de las veces descubrí que al analizar el código de los complementos pude eliminar el fragmento de código que quería y codificarlo 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 aquí cualquier fragmento de código que encuentre útil y haya agregado al function.phparchivo de su tema para extender o mejorar WordPress sin utilizar un enchufar.

Cuando envíe una respuesta aquí, por favor, dele un título a cada bit de código, infórmenos si con qué versión de wordpress sabe que es compatible, incluya la descripción que considere que mejor describe su función y (si corresponde) incluya un enlace al original plugin o fuente donde encontraste la información.

Espero con interés todas sus respuestas y, por supuesto, agregaré continuamente mis nuevos hallazgos cada vez que los encuentre.


13
Teniendo en cuenta que las primeras 5 respuestas fueron del OP y la pregunta parece más orientada a recopilar una serie de respuestas en lugar de una respuesta única y definitiva, esta debería ser una wiki comunitaria.
EAMann

17
Todas las respuestas no relacionadas con un tema deben eliminarse. Este hilo es un buen ejemplo de malas prácticas de codificación.
fuxia

17
Creo que sería mejor alentar a las personas a crear un complemento de funcionalidad personalizado en lugar de usar las funciones de su tema.php
Ian Dunn

3
@ NetConstructor.com El número puro de visitas a la página no es un indicador de calidad. Deberíamos alentar preguntas específicas con respuestas específicas y buenas prácticas de codificación. Este hilo es lo contrario.
fuxia

66
@ NetConstructor.com Discuta en Meta donde la gente puede ver mejor sus argumentos. :)
fuxia

Respuestas:


107

Habilite la función de administrador oculto que muestra TODAS las configuraciones del sitio

Probado en: Wordpress 3.1 RC3

Este pequeño fragmento de código hace algo genial. 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 siguiente código 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');

Fantástico para el desarrollo! Utilizo la tabla de opciones con frecuencia para almacenar versiones de base de datos para mis complementos ... usar phpMyAdmin para restablecer una versión de base de datos anterior para probar un script de actualización es una molestia ... ¡esto lo hará mucho más fácil !
EAMann

3
También puede acceder a la misma página de opciones (cuando haya iniciado sesión) yendo a yoursite / wp-admin /
options.php

89

Modificar el logotipo de inicio de sesión y el enlace de 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 utilizar lo siguiente para extraer dinámicamente esa información (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;
}

79

Incluya tipos de publicaciones personalizadas 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 su sitio 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á sus tipos de publicaciones personalizadas y los recuentos de publicaciones para cada tipo en el widget del panel "En este momento".

// 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' );

Respecto al último fragmento de esta respuesta. Esta es una gran adición, ya que las agregué manualmente para cada tipo de publicación. El único problema que tengo con esto es que agrega los datos después de la entrada predeterminada de "categoría" y "etiqueta". ¿Podría actualizar su respuesta para mover las "categorías" o "etiquetas" predeterminadas hacia abajo o eliminarlas para que puedan agregarse manualmente?
NetConstructor.com

@ NetConstructor.com No creo entender su solicitud. Si lo hago, creo que sería un poco más difícil de hacer, y realmente no tengo tiempo en este momento para descubrir cómo hacerlo.
jaredwilli

Incluya tipos de publicaciones personalizadas en los resultados de búsqueda - Supongo que ahora puede hacerlo con el exclude_from_searchparámetro de register_post_type...
Krzysiek Dróżdż

78

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

Probado en: Wordpress 3.0.1

Este código asegurará que ningún usuario que no sea "admin" sea notificado por WordPress 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;" ) );
   }

Se modificó la versión para mostrar solo las notificaciones de actualización para los usuarios administradores (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;" ) );
       }

8
Esto es mucho menos que ideal. Solo funcionará si el inicio de sesión del administrador sigue siendo el 'administrador' predeterminado, que no debería ser por razones de seguridad. En su lugar, debe verificar la capacidad específica que desea que las personas tengan para ver los mensajes.
jerclarke

1
Es decir, si (! Current_user_can ('manage_options')) {... add_filter ...} - Perdón por el doble comentario, olvidé que al
presionar enter enviar

Es por eso que agregué el comentario al código donde puedes cambiar el nombre de usuario administrador. ¿Cómo lo mejorarías / reescribirías?
NetConstructor.com

La mejor manera es eliminar global $ user_login y get_currentuserinfo () y en su lugar usar current_user_can en su cláusula if. Es solo 1 línea en lugar de 3 y es la forma estándar. Puede verificar la capacidad específica que se necesitaría para ACTUAR en los mensajes, en este caso hay 'update_core' y 'update_plugins'.
jerclarke

2
entonces: if (! current_user_can ('update_plugins')) {/ * ELIMINAR MENSAJES * /}
jerclarke

72

Cargando jQuery desde Google CDN

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');

Agregue spam y elimine enlaces a comentarios en el front-end

Probado en: Wordpress 3.0.1

Esto hace que sea mucho más fácil administrar los comentarios desde el front end 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>';
    }
}

Retrasar la publicación pública en RSS Feed

Probado en: Wordpress 3.0.1

Finalmente, me gusta retrasar la publicación en mis canales RSS durante 10-15 minutos porque siempre encuentro al menos un par de errores en mi texto. Otros usos son en caso de que desee que el contenido sea exclusivo de su sitio durante un día o una semana antes de enviarlo a 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');

fuente en mi publicación: wpengineer.com/320/publish-the-feed-later con más información
bueltge

1
También puede simplemente eliminar el filtro del generador:remove_action('wp_head', 'wp_generator');
Gipetto

25
ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js caduca después de solo una hora. Utilice siempre la información completa de la versión, como ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js , que caduca después de un año.
fuxia

55
El código "Eliminar la información de versión de WordPress para seguridad" en realidad no hace nada para aumentar la seguridad de su sitio. Ni siquiera detiene la exposición de la versión WP que se utiliza en su sitio.
Joseph Scott

1
No es cierto Joseph, si tu versión de WordPress está expuesta, la gente puede ver si estás ejecutando una versión anterior, exponiendo así tus vulnerabilidades. Siempre es una buena decisión eliminar eso de todas las instalaciones de WordPress. Personalmente, ni siquiera sé por qué lo pusieron allí, ya que ES un problema de seguridad.
Jeremy

58

Establezca un número máximo de revisiones posteriores para evitar la hinchazón de la base de datos.

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 muchas ideas geniales para CONSTANTS que se pueden configurar en la página del Codex Edición wp-config.php .


¿Se puede establecer esto por tipo de publicación?
NetConstructor.com

Mirando su uso en wp_save_post_revision () no parece haber una manera de distinguir según los tipos de publicación. No hay filtro ni nada en el valor, aunque probablemente debería haberlo.
jerclarke

gracias Jeremy - Para cualquier otra persona, si sabes cómo hacerlo, publícalo aquí.
NetConstructor.com

1
personalmente prefiero 10. Sé que es doble pero siempre que necesito una revisión siempre es anterior a 5
enero

56

Herramientas de perfiles de Wordpress

Me gusta agregar herramientas de creación de perfiles en un archivo separado, que luego incluyo de 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);
?>

¿hay alguna forma rápida de modificar esto para que solo se llame a la secuencia de comandos cuando eres un administrador Y añada algo a la URL para mostrar la información de depuración?
NetConstructor.com

1
Así es como se hace en mi tema: semiologic.com/software/sem-reloaded : el /inc/debug.php está incluido en /functions.php o /inc/init.php (no puedo recordar la parte superior de mi cabeza).
Denis de Bernardy

52

Enfocar imágenes redimensionadas (solo jpg)

Esta función enfoca las imágenes jpg redimensionadas. Un ejemplo de diferencia:http://dl.dropbox.com/u/1652601/forrst/gdsharpen.png

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);

jpegs mucho mejores, muchas gracias! probado en 3.4-alpha
brasofilo

2
si ustedes quieren esto como complemento: wordpress.org/extend/plugins/sharpen-resized-images
Ünsal Korkmaz

¿A dónde va esta función?
StevieD

@StevieD: como sugiere el título, va dentro de functions.php, en su plantilla. Sin embargo, tendría cuidado, esta función tiene casi 8 años.
timofey.com

51

Eliminar meta cuadros predeterminados de Wordpress

Probado en: Wordpress 3.0.1

Este código le permitirá eliminar Meta Boxes específicos que WordPress agrega de forma 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');

44
De acuerdo con este wordpress.stackexchange.com/questions/34030/… No ocultaría el slugdiv de esta manera, pero use este gist.github.com/1863830 en su lugar

@CorvanNoorloos Su enlace github está roto.
user7003859

48

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 P mayúscula) a "WordPress" (con una P mayúscula) en el contenido de la publicación, los títulos de la publicación y el texto del comentario. Algunas personas ven esto como intrusivo, solo tengo la necesidad de confundir WordPress de vez en cuando y encuentro el filtro algo 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 );
}

Pequeño gran descubrimiento. Una de esas cosas que simplemente elimina otra pieza de código que no es necesaria
NetConstructor.com

55
En WordPress 3.0.1, este filtro se agrega con prioridad 11 , por lo que debe agregarlo 11como el tercer parámetro para eliminarlo.
Jan Fabry

46

Personalizar el tablero

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

Eliminar estos widgets del tablero ...

   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>';
}

44

Agregar 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 eliminar 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 usar uno de los dos métodos enumerados a continuación.

Opción 1:

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

Opcion 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>

41

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 siguiente orden 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');

¿Existe realmente un filtro central llamado custom_menu_order? No pude encontrar uno ...
Kaiser


40

Función para cambiar la duración del ejercicio

Probado en: Wordpress 3.0.1

Por defecto, todos los extractos tienen un límite de 55 palabras. Utilizando el siguiente código, 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 puede usar el mismo método para cambiarlo a cualquier valor.


@ user402 ... ¿este límite por palabras o caracteres? ¿Podrías publicar cómo hacer ambas cosas?
NetConstructor.com

3
@ NetConstructor.com Esta función (y el excerpt_lengthgancho) se limita por palabras .
EAMann

Je Tengo ese filtro agregado al núcleo. :)
Dougal Campbell

38

Agregar miniaturas en Administrar publicaciones / Lista de páginas

Puede agregar esto a sus funciones para mostrar en la Lista Administrar / Editar Publicación 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 );
}

¿Cómo mover la columna al extremo izquierdo?
Rico

38

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' );

¿con qué frecuencia y cuándo se hace wordpress?
NetConstructor.com

De hecho, tengo ese problema con bastante frecuencia. Si hago referencia a un enlace interno a otra publicación en mi blog de WP, obtengo un trackback o pingback (no recuerdo cuál) de mí mismo. Es molesto.
Sahas Katta

Igual que aquí. Tengo un blog de noticias / revistas y enlaces a otros artículos con bastante frecuencia.
Steven

35

Habilitar compresión de salida GZIP

Normalmente, el servidor debe configurarse para hacer esto automáticamente, pero muchos hosts compartidos no lo hacen (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);'));

32

Visualizar consultas DB, tiempo gastado 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 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 llame a wp_footer):

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

Se puede llamar varias veces.


para php <5.2 usomemory_get_usage()
onetrickpony

31

Anular registro de 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);

Lo he usado en la versión 3.1.4. Pero los widgets siguen ahí. ¿Alguien tiene idea?
user391

Todavía funciona en WP 4.5 :)
Tim Malone

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;
}

66
Agradable, pero get_the_image también hace un muy buen trabajo con esto. wordpress.org/extend/plugins/get-the-image
artlung

correcta pero éste funciona de forma diferente y corrige varios problemas, que get_the_image no tiene en cuenta
NetConstructor.com

3
¿Qué hace diferente al script get_the_image?
mate

1
@matt: en WordPress hay diferentes maneras de agregar imágenes a las publicaciones y creo que el script get_the_image solo mira una de ellas. Esto verifica si hay una imagen destacada y la usa primero si está disponible, luego creo que verifica la primera imagen agregada al contenido de la publicación y, si no se encuentra, verifica la galería de medios para la imagen con el tipo más alto orden (al menos así es como recuerdo el orden en marcha).
NetConstructor.com

sugiero wordpress.org/extend/plugins/auto-post-thumbnail Genere automáticamente la Miniatura de la publicación (Miniatura destacada) a partir de la primera imagen en la publicación o cualquier tipo de publicación personalizada solo si la Miniatura de la publicación no está configurada
Ünsal Korkmaz

27

Salida del archivo de plantilla de tema que utiliza una publicación / página en el encabezado

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

Acorte la salida DIV predeterminada si su tema está usando post_class.

si tu tema usa algo como

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

Puede tener divs largos y locos en su fuente que podrían verse así 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 saturar su fuente y parecer bastante innecesario en la mayoría de los casos, ir de 3 a 4 de profundidad es lo suficientemente bueno.

Para el ejemplo superior, podemos dividir la salida de esta 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 corta 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ía muestren todas las publicaciones, independientemente del tipo de publicación: bueno para tipos de publicación personalizados

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 de panel no deseados

Esto ya estaba publicado 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 cambio regrese a la parte superior de la página. Sabes cómo cuando haces clic en "leer más" saltará al lugar de la página, lo que puede ser molesto, ¡esto hace que simplemente cargues la página normalmente, no saltes!

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 según el nombre de usuario , reemplace el nombre de usuario con el nombre de un 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, puede usar if ($ current_user-> user_login! = 'admin') en su lugar, probablemente sea más útil

Aplicar estilo a 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!) Http://codex.wordpress.org/Function_Reference/wp_tag_cloud

Cambiar el temporizador de actualización del widget RSS predeterminado

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

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );

¿podría dividir cada uno de estos en respuestas separadas en las próximas semanas? Lo iba a hacer por usted, pero no quería que pareciera que me estoy dando crédito por sus respuestas. En cualquier caso, estoy tratando de mantener esto organizado para que los usuarios puedan encontrar fácilmente la información que están buscando. Gracias de antemano
NetConstructor.com

Estaba usando el código "Restringir los elementos del menú ADMIN basados ​​en el nombre de usuario, reemplazar el nombre de usuario con un nombre de usuario real", lo cual es excelente, pero ¿podría actualizar el código para mostrar también cómo se puede hacer esto para un "rol de usuario" específico? ¡Creo que esto sería muy útil!
NetConstructor.com

Lo siento NetConstructor Acabo de ver tu comentario ahora. Para el rol de usuario, usaría "current_user_can". No tengo tiempo para probarlo, pero cuando lo haga, lo agregaré.
Wyck

el valor predeterminado para wp_feed_cache_transient_lifetime es 43200 (12 horas)
brasofilo

26

Eliminar el aviso de actualización del 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

1
Esto no es necesariamente una buena idea: un complemento inactivo todavía está presente en el sistema de archivos, y todavía se puede utilizar uno inseguro para hackear el sitio. Los complementos siempre deben mantenerse actualizados.
Tim Malone

25

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

// 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'
    ) );
}

23

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

Este es un fragmento de código que escribí para hacer uso de las constantes WP_DEBUG que normalmente están deshabilitadas por defecto. Bueno, creé una forma 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 la visualización de 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 QUE HAYA GUARDADO UNA COPIA DE SEGURIDAD EN CASO MÁXIMO) 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);
}

Entro en más detalles sobre la publicación de invitado que escribí para Comluv si está interesado, aquí: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/

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

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


Utilizamos algo similar para configurar los detalles de conexión de la base de datos en vivo, provisional y de desarrollo.
Tom

20

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 visualizan 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);
}
}

20

Nuevos roles y capacidades: ¡solo corre una vez!

Los tengo a mano, esta es la forma correcta de hacerlo sin un complemento. Establecen un solo campo (prefix_user_roles) en la base de datos de opciones, y no necesita un complemento para configurarlos. Consulte la página del Codex para obtener una lista de las capacidades disponibles y las descripciones de lo que hacen. ¡Solo necesita 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 comentarlo nuevamente. Esto almacenará el rol / capacidad correctamente en la tabla de opciones. (Esto le permite al desarrollador controlarlos y eliminar la sobrecarga de los complementos voluminosos que hacen lo mismo). Aquí estoy cambiando el rol de autor para eliminar sus publicaciones publicadas (el valor predeterminado), pero les permite la capacidad de editar sus publicaciones publicadas (que no es posible para este rol de manera predeterminada), usando * add_cap * o * remove_cap *.

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

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


Las funciones que menciono anteriormente escriben en un campo en la base de datos de opciones. Comentar y descomentarlos es el camino a seguir. Hay complementos para los roles de usuario, pero si usa las funciones mencionadas anteriormente, no puede dejar estas funciones en ejecución, y NO necesita configurarlas más de una vez, o establecerlas en función de si un usuario específico está accediendo a algo. Si lo desea, configure ese usuario con un rol específico y único. Y consulte el códice, todo lo que escribo arriba es 100% correcto si lo hace sin un complemento. Para casi todos los casos, solo necesita establecer los roles de usuario una vez.
tomcat23

@ tomcat23: Para ilustrarlo, lo envolví en una función para agregar solo el rol, cuando aún no existe. Otra nota: supongo que sería más fácil ubicar el rol en algún lugar de la jerarquía de roles, recuperando los límites de algunos roles integrados y luego agregar / quitar las capacidades del rol incorporado. Lo haría más claro y más fácil de recordar si sus tapas se colocan en algún lugar entre ex. administrador y editor. - Espero que no te importe que edite tu respuesta. Si lo hace, por favor repórtelo. :)
kaiser

1
@ tomcat23 - Agua debajo del puente en este punto. Todo lo que digo es que no me interesa culpar, solo tener paz para todos. :)
MikeSchinkel

2
@ MikeSchinkel Sí, tienes razón. @kaiser Mis disculpas si te he causado un insulto.
tomcat23 13/03/11

1
@ MikeSchinkel: gracias por devolver la paz. @ Tomcat23: No, no lo hiciste. Puedo lidiar con ese tipo de críticas. Mis disculpas también.
Kaiser

19

Pie de página de administrador personalizado de Wordpress

// personalizar el texto del pie de página del administrador
función custom_admin_footer () {
        echo 'agrega tu texto de pie de página personalizado y html aquí';
} 
add_filter ('admin_footer_text', 'custom_admin_footer');

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


19

Habilitar códigos cortos en widgets

// shortcode in widgets
if ( !is_admin() ){
    add_filter('widget_text', 'do_shortcode', 11);
}

18

Función para deshabilitar canales RSS

Probado en: Wordpress 3.0.1

Puede deshabilitar los canales 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);


Gracias toscho! la fuente también está disponible en inglés wpengineer.com/287/disable-wordpress-feed
bueltge

16

Cambie el mensaje "Hola" a "Bienvenido"

Con esta función, puede personalizar el mensaje "Hola" 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 PHP, usando gettextfiltro:

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;
}

3
¿No se puede editar esto en el lado de PHP para que no obtenga ningún resultado?
Hakre

Está funcionando bien aquí en versiones 3.0+ con seguridad, pero ¿por qué no en versiones anteriores? Compruebe si algún otro complemento que use es responsable de esto. El texto aquí reemplazado con JQuery, ¿tal vez un complemento JQuery?
Philip