Melhor coleção de código para o seu arquivo functions.php [closed]

321

Por favor, vote na pergunta e nas respostas que achar úteis clicando na seta para CIMA no lado esquerdo da pergunta ou resposta.

Tal como acontece com muitos outros que estão agora a ver esta publicação, tenho lido vários blogues, fóruns e grupos de discussão para aprender e melhorar as minhas competências em wordpress. Nos últimos 12 meses, tenho a missão de substituir o uso de plug-ins adicionando código ao meu arquivo functions.php . Embora eu concorde completamente que os plugins são muito úteis em muitas situações, minha experiência provou que em 90% dos casos de uso, embora um plug-in possa existir, a sua utilização poderia criar complicações desnecessárias e problemas de compatibilidade. Além disso, em muitos casos, esses plug-ins adicionaram menus e outros elementos de administração que eu não quero ou preciso.

Frequentemente, descobri que, analisando o código dos plug-ins, consegui retirar o código que queria e codificá-lo no meu functions.php . Isso me proporcionou a funcionalidade exata de que precisava sem precisar incluir elementos desnecessários.

Assim, o objetivo deste post é a minha tentativa de envolver você, o leitor / administrador / desenvolvedor, para compartilhar comigo e outros aqui quaisquer bits de código que você achar útil e adicionados ao arquivo function.php do seu tema para estender ou melhorar o WordPress sem utilizar um plugin.

Quando você envia uma resposta aqui, por favor dê a cada título um título, informe-nos se com qual versão do wordpress você é compatível, inclua qualquer descrição que achar melhor para descrever sua função e (se aplicável) inclua um link para o plug-in ou fonte original onde você encontrou as informações.

Aguardo ansiosamente todas as suas respostas e, é claro, adicionarei continuamente minhas novas descobertas sempre que encontrá-las.

    
por NetConstructor.com 14.08.2012 / 12:15
fonte

108 respostas

102

Ativar recurso de administração oculta exibindo TODAS as configurações do site

Testado em: Wordpress 3.1 RC3

Esse pequeno código faz algo bem legal. Ele irá adicionar uma opção adicional ao seu menu de configurações com um link para "todas as configurações", que irá mostrar-lhe uma lista completa de todas as configurações que você tem dentro do seu banco de dados relacionadas ao seu site wordpress. O código abaixo apenas tornará esse link visível para um usuário administrador e o ocultará para todos os outros usuários.

// 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');
    
por NetConstructor.com 26.01.2011 / 16:06
fonte
85

Modifique o logotipo de login & Link do URL da imagem

Testado em: WordPress 3.0.1

Este código permitirá que você modifique facilmente o logotipo da página de login do WordPress, bem como o link href e o texto do título deste 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: Se você quiser usar o logotipo do site para substituir o logotipo de login, poderá usar o seguinte para extrair dinamicamente essa informação (testada em 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;
}
    
por NetConstructor.com 23.01.2013 / 21:02
fonte
75

Inclua tipos de postagem personalizados nos resultados da pesquisa.

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

Adicione seus tipos de postagem personalizados ao seu feed RSS principal de sites por padrão.

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

Inclua tipos de postagem personalizados no widget do painel de administração "Right Now"

Isso incluirá seus tipos de postagens personalizadas e as contagens de postagens de cada tipo no widget do painel "Right Now".

// 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' );
    
por jaredwilli 09.12.2012 / 18:45
fonte
74

Remover notificação de atualização para todos os usuários, exceto ADMIN User

Testado em: Wordpress 3.0.1

Esse código garante que nenhum usuário que não seja o "admin" seja notificado pelo wordpress quando houver atualizações disponíveis.

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

Versão alterada para mostrar apenas a notificação de atualização para usuários administradores (em oposição a apenas o usuário '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;" ) );
       }
    
por NetConstructor.com 26.01.2011 / 15:33
fonte
69

Carregando jQuery da CDN do Google

Testado em: 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' );
}
}

Remova as informações da versão do WordPress para segurança

Testado em: Wordpress 3.0.1

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

Adicionar Spam & Excluir links para comentários no front end

Testado em: Wordpress 3.0.1

Isso facilita o gerenciamento de comentários do front-end ao adicionar spam e excluir links. **

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

Atrasar a postagem pública no RSS Feed

Testado em: Wordpress 3.0.1

Por fim, gosto de atrasar a postagem nos meus feeds RSS por 10 a 15 minutos, pois sempre encontro pelo menos alguns erros no meu texto. Outros usos são caso você queira que o conteúdo seja exclusivo do seu site por um dia ou uma semana antes de enviá-lo para seus leitores de 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');
    
por Derek Perkins 31.01.2012 / 11:48
fonte
54

Ferramentas de criação de perfil do Wordpress

Eu gosto de adicionar ferramentas de criação de perfil em um arquivo separado, que eu incluo a partir de functions.php quando necessário:

<?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);
?>
    
por Denis 26.01.2011 / 15:14
fonte
53

Defina um número máximo de revisões posteriores para evitar o inchaço do banco de dados.

Testado em: Wordpress 3.0.1

O padrão é infinito, isso irá defini-lo para lembrar apenas as últimas 5 edições:

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

FWIW há uma tonelada de grandes idéias para CONSTANTES que podem ser definidas na página do Codex Editando wp-config.php .

    
por Jeremy Clarke 26.01.2011 / 15:33
fonte
48

Afiar imagens redimensionadas (apenas jpg)

Esta função aguça imagens jpg redimensionadas. Um exemplo de diferença:

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);
    
por Ünsal Korkmaz 04.12.2011 / 22:33
fonte
47

Remover Meta-Boxes padrão do Wordpress

Testado em: Wordpress 3.0.1

Este código permitirá que você remova as Meta Boxes específicas que, por padrão, adicionam o WordPress às telas padrão Adicionar / Editar Postagem e Adicionar / 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');
    
por NetConstructor.com 19.02.2012 / 14:27
fonte
44

Remova o "Wordpress" para o filtro "WordPress"

Testado em: Wordpress 3.0.1

Houve um filtro adicionado ao WordPress versão 3.0 que converte automaticamente todas as instâncias de "Wordpress" (sem capital P) para "WordPress" (com um capital P) no conteúdo da postagem, postar títulos e comentar o texto. Algumas pessoas vêem isso como intrusivo, eu só tenho uma necessidade de mis-case do WordPress de vez em quando e achei o filtro um pouco chato.

// 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 );
}
    
por EAMann 26.02.2011 / 00:15
fonte
42

Personalizar o painel

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

Remova esses widgets do painel ...

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

Adicione um widget personalizado chamado "Ajuda e suporte"

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

Este é o conteúdo do seu widget personalizado

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

Adicionar campos de perfil de usuário personalizados

Coloque o código abaixo em seu arquivo functions.php para adicionar campos de perfil de usuário personalizados. Edite ou adicione linhas como achar melhor.

Lembre-se de não remover a linha: return $ contactmethods; caso contrário, isso não 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 exibir campos personalizados, você pode usar um dos dois métodos listados abaixo.

Opção 1:

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

Opção 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>
    
por NetConstructor.com 26.01.2011 / 15:15
fonte
38

Personalize a ordem do menu do administrador

testado em: Wordpress 3.0.1

Este código permitirá que você reorganize a ordem dos elementos no menu admin. Tudo o que você precisa fazer é clicar em um link existente no menu admin e copiar tudo antes do / wp-admin / URL. A ordem abaixo representa a ordem que o novo menu do administrador terá.

// 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');
    
por NetConstructor.com 10.10.2010 / 12:29
fonte
37

Adicionar miniaturas na lista Gerenciar postagens / páginas

Você pode adicionar isso às suas funções para exibir na lista Gerenciar / Editar postagem e páginas uma nova coluna com a visualização em 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 );
}
    
por Philip 26.01.2011 / 15:03
fonte
37

Função para alterar o tamanho do Exerpt

Testado em: Wordpress 3.0.1

Por padrão, todos os trechos são limitados a 55 palavras. Utilizando o código abaixo, você pode substituir essas configurações padrão:

function new_excerpt_length($length) { 
    return 100;
}

add_filter('excerpt_length', 'new_excerpt_length');

Este exemplo altera o comprimento do trecho para 100 palavras, mas você pode usar o mesmo método para alterá-lo para qualquer valor.

    
por Name-AK 26.01.2011 / 15:37
fonte
37

Remover pings para o seu próprio blog

Testado em: 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' );
    
por Dan Gayle 26.01.2011 / 15:38
fonte
33

Ativar compactação de saída GZIP

Normalmente, o servidor deve ser configurado para fazer isso automaticamente, mas muitos hosts compartilhados não t fazer isso (provavelmente para aumentar o uso da largura de banda do 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);'));
    
por onetrickpony 23.12.2010 / 13:13
fonte
31

Exibir consultas de banco de dados, tempo gasto e consumo de memória

Testado em: 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} -->" ;
}

Então, este código abaixo do código acima, que irá inserir automaticamente o código acima no rodapé do seu site público (verifique se o seu tema está chamando wp_footer):

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

Pode ser chamado várias vezes.

    
por Rarst 26.01.2011 / 15:38
fonte
31

Cancelar registro de widgets padrão do WP

Testado em: 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);
    
por bueltge 19.04.2016 / 08:41
fonte
30

Extrair automaticamente a primeira imagem do conteúdo da postagem

Testado em: Wordpress 3.0.1

Esse código extrairá automaticamente a primeira imagem associada a uma postagem e permitirá que você a exiba / use chamando a função 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;
}
    
por NetConstructor.com 26.01.2011 / 15:34
fonte
27

Saída que arquivo de modelo de tema um post / página está usando no cabeçalho

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

Encurte a saída DIV padrão se o seu tema estiver usando post_class.

se o seu tema estiver usando algo como

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

Você pode ter divs longos e loucos em sua origem que podem se parecer com isso ou até mais:

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

Isso pode realmente começar a confundir sua fonte e parecer um pouco desnecessário na maioria dos casos, indo 3-4 de profundidade é bom o suficiente.

Para o exemplo acima, podemos dividir a saída da seguinte forma:

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

isso divide a saída para incluir apenas os primeiros 5 valores, então o exemplo acima se torna:

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

Faça com que os arquivos de categoria exibam todas as postagens, independentemente do tipo de postagem: bom para tipos de postagem 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');

Remover itens do painel indesejados

Isso já foi postado, mas não tem a lista completa de itens. Especialmente aqueles irritantes "links de entrada!"

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

Remover página "Ler Mais" pula **

em vez disso, retorne ao topo da página. Você sabe quando você clique em "ler mais", ele vai pular para o ponto na página que pode ser irritante, isso faz com que seja apenas carregar a página normalmente, sem pular!

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

Restringir os itens do menu ADMIN com base no nome de usuário , substituir o nome de usuário pelo nome de um usuário 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 você pode usar if ($ current_user- > user_login! = 'admin') em vez disso, provavelmente mais útil

Estilize a nuvem de tags

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

Referência completa de opções aqui (há muito!) enlace

Alterar o temporizador de atualização do widget RSS padrão

(o padrão é 6 ou 12 horas que eu esqueço (1800 = 30min).

add_filter( 'wp_feed_cache_transient_lifetime', create_function('$fixrss', 'return 1800;') );
    
por Wyck 05.09.2011 / 19:48
fonte
25

Remover o Aviso de Atualização de Plugin APENAS para plug-ins INATIVOS

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
    
por NetConstructor.com 26.01.2011 / 15:08
fonte
25

Remover informações supérfluas e HTML na tag <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'
    ) );
}
    
por 4 revs, 4 users 63%Andrew Ryno 12.02.2015 / 18:54
fonte
22

Habilitar depuração de erros e registro para uso em sites ativos

Este é um trecho de código que eu escrevi para fazer uso das constantes WP_DEBUG que são normalmente desabilitadas por padrão. Bem, eu criei uma maneira de não só ativar o WP_DEBUG para que você possa usá-lo em um site ativo sem efeitos colaterais negativos, mas também usei as outras constantes de depuração para forçar erros a serem exibidos e para criar um arquivo de log de os erros e Avisos no diretório / wp-content.

Elimine este código em seu arquivo wp-config.php (APÓS SALVAR UM BACKUP APENAS NO CASO) e, em seguida, você pode passar os parâmetros? debug = 1, 2 ou 3 ao final de qualquer URL em seu site.

? debug = 1 = mostra todos os erros / avisos ? debug = 2 = força-os a serem exibidos ? debug = 3 = cria um arquivo debug.log de todos os erros no diretório / wp-content.

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

Eu entro em mais detalhes no guest post que escrevi para o Comluv se você estiver interessado, aqui: enlace

Eu ainda estou trabalhando em uma maneira de fazer isso protegido por senha, ou de preferência de alguma forma fazê-lo funcionar em if (current_user_can ('manage_themes') e is_logged_in ().

Mas é aí que fica muito mais complicado.

    
por jaredwilli 13.11.2010 / 11:26
fonte
20

Novos papéis e recursos - execute somente uma vez!

Eu mantenho essas coisas úteis, isso é a maneira correta de fazê-las sem um plugin. Eles definem um único campo (prefix_user_roles) no banco de dados de opções, e você não precisa de um plugin para defini-los. Consulte a página do Codex para ver uma lista de quais recursos estão disponíveis e descrições sobre o que eles fazem. Você só precisa descomentar um desses blocos, carregar qualquer página e comentá-los novamente! Aqui estou criando uma função com os recursos de que preciso:

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

Às vezes é útil adicionar / remover de uma função existente em vez de remover e adicionar novamente uma. Novamente, você só precisa descomente-lo, recarregar uma página e comentá-la novamente. Isso armazenará a função / recurso corretamente na tabela de opções. (Isso permite que você, desenvolvedor, os controle e remova a sobrecarga dos plugins volumosos que fazem a mesma coisa.) Aqui estou alterando a função de autor para excluir as postagens publicadas (o padrão), mas permitindo a capacidade de editar seus posts publicados (o que não é possível para essa função por padrão) - usando * add_cap * ou * remove_cap *.

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

Eu mantenho uma planilha com a grade da página do Codex para sites que modificam esse caminho, para que eu possa lembrar como as coisas estão definidas, embora o código comentado no arquivo functions.php funcione. Não deixe esses exemplos descomentados, ou ele irá gravar no banco de dados com cada carregamento de página!

    
por tomcat23 12.03.2011 / 00:44
fonte
19

Adicionar títulos dinâmicos automaticamente às páginas públicas

Testado em: Wordpress 3.0.1

A utilização do código abaixo criará automaticamente títulos de páginas dinâmicas com base nas páginas / postagens exibidas publicamente.

/* 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);
}
}
    
por Chris_O 01.03.2011 / 17:52
fonte
18

Wordpress Custom Admin Footer

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

Eu uso isso para sites de clientes como um simples ponto de referência para entrar em contato comigo como desenvolvedor.

    
por chuck reynolds 28.12.2010 / 01:45
fonte
18

Ativar códigos de acesso nos widgets

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

Função para desativar feeds RSS

Testado em: Wordpress 3.0.1

Você pode desativar os feeds RSS se quiser manter seu site baseado no Wordpress como estático.

Você pode usar esta função:

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);
    
por Name-AK 26.01.2011 / 15:33
fonte
14

Altere a mensagem "Howdy" para "Bem-vindo"

Com esta função, você pode personalizar a mensagem "Howdy" no canto superior direito da sua área de administração.
Essa função faz uso do JQuery para alterar a mensagem "Howdy" para "Welcome".

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

Versão do 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;
}
    
por Philip 26.02.2011 / 00:47
fonte