คอลเลกชันที่ดีที่สุดของรหัสสำหรับไฟล์ functions.php ของคุณ [ปิด]


332

โปรดให้คะแนนคำถามและคำตอบใด ๆ ที่คุณคิดว่ามีประโยชน์โดยคลิกที่ลูกศรขึ้นทางด้านซ้ายมือของคำถามหรือคำตอบ

เช่นเดียวกับคนอื่น ๆ ที่กำลังดูโพสต์นี้ฉันได้อ่านบล็อกฟอรัมและกลุ่มการสนทนาต่างๆเพื่อเรียนรู้และพัฒนาทักษะการใช้งาน WordPress ของฉัน ตลอด 12 เดือนที่ผ่านมาฉันมีภารกิจที่จะแทนที่การใช้งานปลั๊กอินโดยเพิ่มรหัสลงในfunctions.phpไฟล์ของฉันแทน ในขณะที่ฉันตกลงอย่างสมบูรณ์ว่าปลั๊กอินมีประโยชน์อย่างมากในหลาย ๆ สถานการณ์ประสบการณ์ของฉันพิสูจน์แล้วว่าใน 90% ของกรณีการใช้งานแม้ว่าอาจมีปลั๊กอินอยู่ แต่การใช้งานจริงอาจทำให้เกิดปัญหาแทรกซ้อนที่ไม่จำเป็นและปัญหาความเข้ากันได้ นอกจากนี้ในบางกรณีปลั๊กอินดังกล่าวได้เพิ่มเมนูและองค์ประกอบการดูแลระบบอื่น ๆ ที่ฉันไม่ต้องการหรือต้องการ

functions.phpบ่อยกว่าไม่ฉันได้พบว่าโดยการวิเคราะห์รหัสของปลั๊กอินผมสามารถที่จะดึงออกจากชิ้นส่วนของรหัสฉันต้องการและรหัสมันยากที่จะเข้าไปในของฉัน สิ่งนี้ทำให้ฉันมีฟังก์ชั่นที่แน่นอนที่ฉันต้องการโดยไม่ต้องรวมองค์ประกอบที่ไม่จำเป็น

ดังนั้นจุดประสงค์ของโพสต์นี้คือความพยายามของฉันที่จะดึงดูดให้คุณผู้อ่าน / ผู้ดูแลระบบ / นักพัฒนาแบ่งปันกับฉันและที่นี่บิตรหัสใด ๆ ที่คุณพบว่ามีประโยชน์และเพิ่มลงในfunction.phpไฟล์ธีมของคุณเพื่อขยายหรือปรับปรุง WordPress โดยไม่ต้องใช้ เสียบเข้าไป.

เมื่อคุณส่งการตอบกลับที่นี่โปรดระบุชื่อรหัสแต่ละบิตให้เราทราบว่า Wordpress รุ่นใดที่คุณรู้จักใช้งานได้รวมถึงคำอธิบายใด ๆ ที่คุณรู้สึกว่าอธิบายการทำงานได้ดีที่สุดและ (ถ้ามี) รวมถึงลิงก์ไปยังต้นฉบับ ปลั๊กอินหรือแหล่งที่คุณพบข้อมูล

ฉันรอคอยที่จะตอบสนองทั้งหมดของคุณและแน่นอนจะเพิ่มการค้นพบใหม่ของฉันเองอย่างต่อเนื่องทุกครั้งที่ฉันพบพวกเขา


13
เมื่อพิจารณาจาก 5 คำตอบแรกโดย OP และคำถามดูเหมือนจะมุ่งเน้นไปที่การรวบรวมคำตอบมากมายแทนที่จะเป็นคำตอบเดียวที่ชัดเจนนี่ควรเป็นวิกิชุมชน
EAMann

17
คำตอบทั้งหมดที่ไม่เกี่ยวข้องกับชุดรูปแบบควรลบออก เธรดนี้เป็นตัวอย่างที่ดีสำหรับการเขียนโค้ดที่ไม่ดี
fuxia

17
ฉันคิดว่ามันจะดีกว่าที่จะส่งเสริมให้คนที่สร้างปลั๊กอินฟังก์ชันการทำงานที่กำหนดเองแทนการใช้รูปแบบของพวกเขา functions.php
เอียนดันน์

3
@ NetConstructor.com จำนวนการดูหน้าเว็บล้วนไม่ใช่ตัวบ่งชี้คุณภาพ เราควรกระตุ้นคำถามเฉพาะด้วยคำตอบเฉพาะและการเขียนโค้ดที่ดี เธรดนี้ตรงกันข้าม
fuxia

6
@ NetConstructor.com พูดคุยเกี่ยวกับMetaซึ่งผู้คนสามารถเห็นข้อโต้แย้งของคุณได้ดี :)
fuxia

คำตอบ:


107

เปิดใช้งานคุณลักษณะการดูแลระบบที่ซ่อนอยู่ซึ่งแสดงการตั้งค่าไซต์ทั้งหมด

ทดสอบกับ: Wordpress 3.1 RC3

โค้ดชิ้นเล็ก ๆ ชิ้นนี้ทำอะไรที่เจ๋งมาก มันจะเพิ่มตัวเลือกเพิ่มเติมให้กับเมนูการตั้งค่าของคุณพร้อมลิงก์ไปยัง "การตั้งค่าทั้งหมด" ซึ่งจะแสดงรายการการตั้งค่าทั้งหมดที่คุณมีในฐานข้อมูลที่เกี่ยวข้องกับเว็บไซต์เวิร์ดเพรสของคุณ รหัสด้านล่างจะทำให้ลิงค์นี้ปรากฏแก่ผู้ใช้ที่เป็นผู้ดูแลระบบและซ่อนไว้สำหรับผู้ใช้รายอื่นทั้งหมด

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

ยอดเยี่ยมสำหรับการพัฒนา! ฉันใช้ตารางตัวเลือกบ่อยครั้งเพื่อจัดเก็บเวอร์ชัน DB สำหรับปลั๊กอินของฉัน ... โดยใช้ phpMyAdmin เพื่อรีเซ็ตเป็นเวอร์ชัน DB เก่าเพื่อทดสอบสคริปต์อัปเกรดเป็นความเจ็บปวด ... สิ่งนี้จะทำให้ง่ายขึ้นมาก !!!
EAMann

3
คุณยังสามารถไปที่หน้าตัวเลือกเดียวกัน (เมื่อเข้าสู่ระบบ) โดยไปที่ yoursite / wp-admin / options.php
j08691

89

ปรับเปลี่ยนลิงค์โลโก้และลิงค์ URL ภาพ

ทดสอบกับ: WordPress 3.0.1

รหัสนี้จะช่วยให้คุณปรับเปลี่ยนโลโก้หน้าเข้าสู่ระบบ WordPress ได้อย่างง่ายดายรวมถึงลิงก์ href และข้อความชื่อของโลโก้นี้

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

แก้ไข:หากคุณต้องการใช้โลโก้ของไซต์เพื่อแทนที่โลโก้ล็อกอินคุณสามารถใช้สิ่งต่อไปนี้เพื่อดึงข้อมูลนั้น (ทดสอบบน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

รวมประเภทโพสต์ที่กำหนดเองในผลการค้นหา

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

เพิ่มประเภทโพสต์ที่กำหนดเองของคุณไปยังฟีด RSS หลักของเว็บไซต์โดยค่าเริ่มต้น

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

รวมประเภทโพสต์ที่กำหนดเองในวิดเจ็ตแดชบอร์ดผู้ดูแลระบบ "ทันที"

ซึ่งจะรวมถึงประเภทโพสต์ที่คุณกำหนดเองและจำนวนโพสต์สำหรับแต่ละประเภทในวิดเจ็ตแดชบอร์ด "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' );

เกี่ยวกับตัวอย่างสุดท้ายของคำตอบนี้ นี่เป็นการเพิ่มที่ยอดเยี่ยมเนื่องจากฉันเพิ่มสิ่งเหล่านี้ด้วยตนเองสำหรับโพสต์แต่ละประเภท ปัญหาเดียวที่ฉันมีคือมันเพิ่มข้อมูลหลังจากรายการ "หมวดหมู่" และ "แท็ก" เริ่มต้น คุณสามารถอัปเดตคำตอบเพื่อย้าย "หมวดหมู่" หรือ "แท็ก" เริ่มต้นลงหรือลบออกเพื่อให้สามารถเพิ่มได้ด้วยตนเอง
NetConstructor.com

@ NetConstructor.com ฉันไม่คิดว่าฉันเข้าใจคำขอของคุณ ถ้าฉันทำเช่นนั้นฉันคิดว่ามันคงเป็นเรื่องยากที่จะทำอีกสักหน่อยและตอนนี้ไม่มีเวลาจริง ๆ ที่จะหาวิธีทำ
jaredwilli

รวมประเภทโพสต์ที่กำหนดเองในผลการค้นหา - ฉันเดาแล้วตอนนี้คุณสามารถทำได้ด้วยexclude_from_searchparam of register_post_type...
Krzysiek Dróżdż

78

ลบการแจ้งเตือนการอัปเดตสำหรับผู้ใช้ทั้งหมดยกเว้นผู้ใช้ ADMIN

ทดสอบกับ: Wordpress 3.0.1

รหัสนี้จะช่วยให้มั่นใจได้ว่าจะไม่มีผู้ใช้ใดนอกจาก "admin" ได้รับแจ้งจาก wordpress เมื่อมีการอัพเดท

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

เปลี่ยนรุ่นแล้วเพื่อแสดงการแจ้งเตือนการอัปเดตสำหรับผู้ใช้ที่เป็นผู้ดูแลระบบเท่านั้น (ตรงกันข้ามกับผู้ใช้ที่เป็น 'ผู้ดูแลระบบ' เท่านั้น):

// 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
นี่คือน้อยกว่าอุดมคติ มันจะใช้งานได้ก็ต่อเมื่อการเข้าสู่ระบบของผู้ดูแลระบบยังคงเป็น 'ผู้ดูแลระบบ' เริ่มต้นซึ่งมันไม่ได้เป็นเพราะเหตุผลด้านความปลอดภัย แต่คุณควรตรวจสอบความสามารถเฉพาะที่คุณต้องการให้คนเห็นข้อความ
jerclarke

1
Ie if (! current_user_can ('Manage_options')) {... add_filter ... } - ขออภัยเกี่ยวกับความคิดเห็นสองครั้งฉันลืมไปแล้วว่ากดปุ่ม Enter ใส่
คอมเม้นท์

นั่นเป็นเหตุผลที่ฉันเพิ่มความคิดเห็นในรหัสที่คุณสามารถเปลี่ยนชื่อผู้ใช้ของผู้ดูแลระบบ คุณจะปรับปรุง / เขียนใหม่อย่างไร?
NetConstructor.com

วิธีที่ดีที่สุดคือการลบ $ user_login ทั่วโลกและ get_currentuserinfo () และใช้ current_user_can ในประโยค if แทน มันเป็นเพียง 1 บรรทัดแทนที่จะเป็น 3 และเป็นวิธีมาตรฐาน คุณสามารถตรวจสอบความสามารถเฉพาะที่จำเป็นสำหรับ ACT ในข้อความในกรณีนี้จะมี 'update_core' และ 'update_plugins'
jerclarke

2
ดังนั้น: if (! current_user_can ('update_plugins')) {/ * ลบ MESSAGES * /}
jerclarke

72

กำลังโหลด jQuery จาก Google CDN

ทดสอบกับ: 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' );
}
}

ลบข้อมูลรุ่น WordPress เพื่อความปลอดภัย

ทดสอบกับ: Wordpress 3.0.1

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

เพิ่มสแปม & ลบลิงค์ไปยังความคิดเห็นที่ส่วนหน้า

ทดสอบกับ: Wordpress 3.0.1

สิ่งนี้ทำให้การจัดการความคิดเห็นจากส่วนหน้าทำได้ง่ายขึ้นโดยการเพิ่มสแปมและลบลิงก์ **

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

ชะลอการโพสต์สาธารณะสู่ฟีด RSS

ทดสอบกับ: Wordpress 3.0.1

ในที่สุดฉันชอบที่จะล่าช้าในการโพสต์ไปยัง RSS ฟีดของฉันเป็นเวลา 10-15 นาทีเพราะฉันมักจะพบข้อผิดพลาดอย่างน้อยสองครั้งในข้อความของฉัน การใช้งานอื่น ๆ ในกรณีที่คุณต้องการให้เนื้อหาเป็นเอกสิทธิ์สำหรับไซต์ของคุณเป็นเวลาหนึ่งวันหรือหนึ่งสัปดาห์ก่อนที่จะส่งไปยังผู้อ่าน 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');

แหล่งที่มาในโพสต์ของฉัน: wpengineer.com/320/publish-the-feed-laterพร้อมรายละเอียดเพิ่มเติม
bueltge

1
นอกจากนี้คุณยังสามารถลบตัวกรองตัวสร้างออกได้:remove_action('wp_head', 'wp_generator');
Gipetto

25
ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.jsจะหมดอายุหลังจากนั้นเพียงหนึ่งชั่วโมง ใช้ข้อมูลเวอร์ชันเต็มเสมอเช่นajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js - ซึ่งจะหมดอายุหลังจากหนึ่งปี
fuxia

5
รหัส "ลบข้อมูลรุ่น WordPress เพื่อความปลอดภัย" ไม่ได้ทำอะไรเพื่อเพิ่มความปลอดภัยให้กับเว็บไซต์ของคุณ ไม่แม้แต่หยุดการเปิดเผยรุ่น WP ที่ใช้บนไซต์ของคุณ
โจเซฟสกอตต์

1
โจเซฟไม่ใช่คนจริงถ้ารุ่น WordPress ของคุณถูกเปิดเผยผู้คนสามารถดูได้ว่าคุณกำลังใช้เวอร์ชั่นเก่ากว่าอยู่หรือไม่ มันเป็นการตัดสินใจที่ดีที่จะลบมันออกจากการติดตั้ง WordPress ทั้งหมด โดยส่วนตัวฉันไม่รู้ด้วยซ้ำว่าทำไมพวกเขาถึงติดตั้งที่นั่นตั้งแต่แรกเพราะมันเป็นปัญหาด้านความปลอดภัย
Jeremy

58

ตั้งค่าจำนวนการแก้ไขโพสต์สูงสุดเพื่อหลีกเลี่ยงการขยายฐานข้อมูล

ทดสอบกับ: Wordpress 3.0.1

ค่าเริ่มต้นคืออนันต์การตั้งค่านี้จะจดจำเฉพาะการแก้ไข 5 ครั้งล่าสุด:

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

FWIW มีตันของความคิดที่ดีสำหรับค่าคงที่สามารถตั้งค่าในหน้า Codex แก้ไข WP-config.php


สามารถตั้งเป็นแบบโพสต์ได้หรือไม่?
NetConstructor.com

ดูที่การใช้งานใน wp_save_post_revision () ดูเหมือนจะไม่มีทางแยกแยะตามประเภทของโพสต์ ไม่มีตัวกรองหรือสิ่งใด ๆ ที่มีมูลค่าแม้ว่าอาจจะมี
jerclarke

ขอบคุณ Jeremy - สำหรับคนอื่น ๆ ถ้าคุณรู้วิธีการทำสิ่งนี้กรุณาโพสต์ไว้ที่นี่
NetConstructor.com

1
โดยส่วนตัวแล้วฉันชอบ 10. ฉันรู้ว่ามันเป็นสองเท่า แต่เมื่อฉันต้องการการแก้ไขมันจะเก่ากว่าเสมอแล้ว 5
janw

56

เครื่องมือสร้างโปรไฟล์ Wordpress

ฉันชอบที่จะเพิ่มเครื่องมือทำโปรไฟล์ในไฟล์แยกต่างหากซึ่งฉันจะรวมจาก functions.php เมื่อต้องการ:

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

มีวิธีที่รวดเร็วในการแก้ไขเพื่อให้สคริปต์ถูกเรียกเมื่อผู้ดูแลระบบของคุณและต่อท้ายสิ่งที่ URL เพื่อแสดงข้อมูลการแก้ปัญหาหรือไม่
NetConstructor.com

1
นั่นเป็นวิธีที่ทำในธีมของฉัน: semiologic.com/software/sem-reloaded - /inc/debug.php รวมอยู่ใน /functions.php หรือ /inc/init.php (ไม่สามารถเรียกคืนส่วนบนของฉันได้ หัว).
เดนิสเดอเบอร์นาดี

52

ทำให้รูปภาพคมชัด (jpg เท่านั้น)

ฟังก์ชั่นนี้ทำให้ภาพ jpg ที่ถูกปรับขนาดคมขึ้น ตัวอย่างของความแตกต่าง: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 ที่ดีขึ้นมากขอบคุณมาก! ทดสอบใน 3.4-alpha
brasofilo

2
ถ้าคุณต้องการสิ่งนี้เป็นปลั๊กอิน: wordpress.org/extend/plugins/sharpen-resized-images
Ünsal Korkmaz

ฟังก์ชั่นนี้ไปไหน
StevieD

@StevieD - ตามชื่อเรื่องมันจะเข้าไปข้างใน functions.php ในเทมเพลตของคุณ ฉันจะระวังตัวด้วยฟังก์ชั่นนี้มีอายุเกือบ 8 ปี
timofey.com

51

ลบ Wordpress Meta Boxes ที่เป็นค่าเริ่มต้น

ทดสอบกับ: Wordpress 3.0.1

รหัสนี้จะช่วยให้คุณสามารถลบกล่อง Meta เฉพาะที่ wordpress เพิ่มโดยค่าเริ่มต้นเป็นหน้าจอเพิ่ม / แก้ไขโพสต์และเพิ่ม / แก้ไขหน้า

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

4
ตามwordpress.stackexchange.com/questions/34030/นี้ฉันจะไม่ซ่อน slugdiv ด้วยวิธีนี้ แต่ใช้gist.github.com/1863830นี้แทน

@CorvanNoorloos ลิงก์ github ของคุณเสีย
user7003859

48

ลบตัวกรอง "Wordpress" เป็น "WordPress"

ทดสอบกับ: Wordpress 3.0.1

มีการเพิ่มตัวกรองด้วย WordPress เวอร์ชัน 3.0 ที่แปลงทุกอินสแตนซ์ของ "Wordpress" (ไม่มีตัวอักษร P) เป็น "WordPress" (ด้วยตัวพิมพ์ใหญ่ P) ในเนื้อหาโพสต์ชื่อเรื่องและข้อความแสดงความคิดเห็น บางคนเห็นว่านี่เป็นการล่วงล้ำฉันแค่ต้อง WordPress เป็นครั้งคราวและพบว่าตัวกรองค่อนข้างน่ารำคาญ

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

หาน้อยมาก หนึ่งในสิ่งเหล่านั้นที่เพิ่งลบรหัสอื่นที่ไม่จำเป็นออกไป
NetConstructor.com

5
ใน WordPress 3.0.1 ตัวกรองนี้จะถูกเพิ่มด้วยลำดับความสำคัญ 11ดังนั้นคุณต้องเพิ่ม11เป็นพารามิเตอร์ตัวที่สามเพื่อลบออก
Jan Fabry

46

ปรับแต่งแดชบอร์ด

add_action('wp_dashboard_setup', 'my_custom_dashboard_widgets');

function my_custom_dashboard_widgets() {
   global $wp_meta_boxes;

ลบเครื่องมือแดชบอร์ดเหล่านี้ ...

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

เพิ่มวิดเจ็ตที่กำหนดเองที่เรียกว่า 'บริการช่วยเหลือและสนับสนุน'

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

นี่คือเนื้อหาสำหรับวิดเจ็ตที่กำหนดเองของคุณ

 function custom_dashboard_help() {
    echo '<p>Lorum ipsum delor sit amet et nunc</p>';
}

44

เพิ่มฟิลด์โปรไฟล์ผู้ใช้กำหนดเอง

วางโค้ดด้านล่างลงในไฟล์ functions.php ของคุณเพื่อเพิ่มฟิลด์โปรไฟล์ผู้ใช้ที่กำหนดเอง แก้ไขหรือเพิ่มบรรทัดตามที่เห็นสมควร

จำไว้ว่าอย่าลบบรรทัด: return $ contactmethods; มิฉะนั้นสิ่งนี้จะไม่ทำงาน

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

ในการแสดงฟิลด์ที่กำหนดเองคุณสามารถใช้หนึ่งในสองวิธีที่แสดงด้านล่าง

ตัวเลือกที่ 1:

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

ตัวเลือก 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

ปรับแต่งลำดับของเมนูผู้ดูแลระบบ

ทดสอบเมื่อ: Wordpress 3.0.1

รหัสนี้จะช่วยให้คุณสามารถจัดระเบียบองค์ประกอบในเมนูผู้ดูแลระบบ สิ่งที่คุณต้องทำคือคลิกที่ลิงค์ที่มีอยู่ในเมนูผู้ดูแลระบบและคัดลอกทุกอย่างก่อน / wp-admin / URL คำสั่งซื้อด้านล่างแสดงให้เห็นถึงลำดับที่เมนูผู้ดูแลระบบใหม่จะมี

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

มีตัวกรองหลักชื่อจริง ๆcustom_menu_orderหรือไม่ ฉันหาไม่เจอ ...
kaiser

4
@kaiser ทำเอกสารที่นี่codex.wordpress.org/Plugin_API/Filter_Reference/ …
Manny Fleurmond

40

ฟังก์ชั่นเปลี่ยนความยาวของ Exerpt

ทดสอบกับ: Wordpress 3.0.1

ข้อความที่ตัดตอนมาทั้งหมดจะถูก จำกัด ที่ 55 คำ ใช้รหัสด้านล่างคุณสามารถแทนที่การตั้งค่าเริ่มต้นนี้:

function new_excerpt_length($length) { 
    return 100;
}

add_filter('excerpt_length', 'new_excerpt_length');

ตัวอย่างนี้เปลี่ยนความยาวของข้อความที่ตัดตอนมาเป็น 100 คำ แต่คุณสามารถใช้วิธีเดียวกันเพื่อเปลี่ยนเป็นค่าใดก็ได้


@ user402 ... กำหนดให้เป็นคำหรือตัวอักษรหรือไม่ คุณช่วยโพสต์วิธีการทำทั้งสองอย่างได้ไหม
NetConstructor.com

3
@ NetConstructor.comฟังก์ชันนี้ (และexcerpt_lengthเบ็ด) หมวกด้วยคำพูด
EAMann

หึ ฉันได้เพิ่มตัวกรองนั้นลงในแกนแล้ว :)
Dougal Campbell

38

เพิ่มรูปขนาดย่อในจัดการรายการกระทู้ / หน้า

คุณสามารถเพิ่มสิ่งนี้ลงในฟังก์ชั่นของคุณเพื่อแสดงในคอลัมน์จัดการ / แก้ไขโพสต์และหน้ารายการใหม่ด้วยการแสดงตัวอย่างภาพย่อ

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

จะย้ายคอลัมน์ไปทางซ้ายสุดได้อย่างไร
Rich

38

ลบการปิงไปยังบล็อกของคุณเอง

ทดสอบกับ: 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' );

wordpress ping บ่อยแค่ไหนและเมื่อไหร่?
NetConstructor.com

ฉันมีปัญหานี้บ่อยครั้งมาก ถ้าฉันอ้างอิงลิงก์ภายในไปยังโพสต์อื่นในบล็อก WP ของฉันฉันจะได้รับ trackback หรือ pingback (จำไม่ได้ว่าตัวเอง) จากตัวเอง มันน่ารำคาญ.
Sahas Katta

กันที่นี่ ฉันมีบล็อกข่าว / นิตยสารและเชื่อมโยงไปยังบทความอื่น ๆ ค่อนข้างบ่อย
Steven

35

เปิดใช้งานการบีบอัดเอาต์พุต GZIP

โดยปกติเซิร์ฟเวอร์ควรตั้งค่าให้ทำโดยอัตโนมัติ แต่โฮสต์ที่ใช้ร่วมกันจำนวนมากไม่ทำเช่นนี้ (อาจเป็นการเพิ่มการใช้แบนด์วิดท์ของไคลเอ็นต์)

 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

แสดงการสืบค้นฐานข้อมูลเวลาที่ใช้ไปและการใช้หน่วยความจำ

ทดสอบกับ: 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} -->" ;
}

จากนั้นโค้ดด้านล่างโค้ดด้านบนซึ่งจะแทรกโค้ดด้านบนลงในส่วนท้ายของเว็บไซต์สาธารณะของคุณ (ตรวจสอบให้แน่ใจว่าธีมของคุณกำลังเรียก wp_footer):

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

สามารถเรียกได้หลายครั้ง


สำหรับ php <5.2 usememory_get_usage()
onetrickpony

31

ถอนการลงทะเบียนวิดเจ็ตดีฟอลต์ WP

ทดสอบกับ: 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);

ฉันใช้มันในเวอร์ชัน 3.1.4 แต่เครื่องมือยังคงอยู่ที่นั่น มีใครมีความคิดบ้างไหม?
user391

ยังคงใช้งานได้กับ WP 4.5 :)
Tim Malone

30

ดึงภาพแรกออกจากเนื้อหาโพสต์โดยอัตโนมัติ

ทดสอบกับ: Wordpress 3.0.1

รหัสนี้จะดึงภาพแรกที่เชื่อมโยงกับโพสต์โดยอัตโนมัติและอนุญาตให้คุณแสดง / ใช้งานได้โดยการเรียกฟังก์ชั่น 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;
}

6
ดี แต่ get_the_image ทำผลงานได้ดีด้วยเช่นกัน wordpress.org/extend/plugins/get-the-image
artlung

ถูกต้อง แต่อันนี้ใช้งานได้แตกต่างกันและแก้ไขปัญหาต่าง ๆ ที่ get_the_image ไม่ได้คำนึงถึง
NetConstructor.com

3
มันแตกต่างจากสคริปต์ get_the_image อย่างไร
ด้าน

1
@matt - ใน wordpress มีหลายวิธีที่สามารถเพิ่มรูปภาพในโพสต์และฉันคิดว่าสคริปต์ get_the_image ดูที่หนึ่งในนั้น การตรวจสอบนี้จะตรวจสอบว่ามีภาพเด่นและใช้ภาพนั้นก่อนหรือไม่หากมีอยู่ฉันคิดว่ามันจะตรวจสอบภาพแรกที่เพิ่มลงในเนื้อหาโพสต์และหากไม่พบภาพนั้นจะตรวจสอบแกลเลอรีสื่อสำหรับภาพที่มีการเรียงลำดับสูงสุด สั่งซื้อ (อย่างน้อยนั่นเป็นวิธีที่ฉันจำได้ว่าคำสั่งไป)
NetConstructor.com

ฉันแนะนำwordpress.org/extend/plugins/auto-post-thumbnailสร้างรูปขนาดย่อของโพสต์ (รูปขนาดย่อที่แนะนำ) โดยอัตโนมัติจากรูปภาพแรกในโพสต์หรือโพสต์แบบกำหนดเองใด ๆ หากโพสต์รูปขนาดย่อของโพสต์ไม่ได้ตั้งไว้
Ünsal Korkmaz

27

เอาต์พุตไฟล์เท็มเพลตธีมที่โพสต์ / เพจใช้ในส่วนหัว

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

ย่อเอาต์พุต DIV เริ่มต้นหากธีมของคุณใช้ post_class

หากธีมของคุณใช้บางสิ่งบางอย่างเช่น

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

คุณสามารถมี divs ที่ยาวเหยียดในแหล่งของคุณที่อาจมีลักษณะเช่นนี้หรือนานกว่านั้น:

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

สิ่งนี้สามารถเริ่มที่จะถ่วงแหล่งของคุณและดูเหมือนไม่จำเป็นในกรณีส่วนใหญ่ไป 3-4 ลึกดีพอ

สำหรับตัวอย่างด้านบนเราสามารถแบ่งเอาท์พุทดังนี้:

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

ส่วนนี้เอาท์พุทที่จะรวมเฉพาะ 5 ค่าแรกดังนั้นตัวอย่างข้างต้นกลายเป็น:

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

ทำให้หมวดหมู่ที่เก็บถาวรแสดงโพสต์ทั้งหมดโดยไม่คำนึงถึงประเภทโพสต์: ดีสำหรับประเภทโพสต์ที่กำหนดเอง

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

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

ลบรายการแดชบอร์ดที่ไม่ต้องการ

โพสต์นี้แล้ว แต่ยังไม่มีรายการทั้งหมด โดยเฉพาะอย่างยิ่ง "ลิงก์เข้ามาที่น่ารำคาญ"

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

ลบหน้า "อ่านเพิ่มเติม" กระโดด **

กลับไปที่ด้านบนของหน้าแทน คุณรู้ว่าเมื่อคุณคลิก "อ่านเพิ่มเติม" มันจะข้ามไปยังจุดที่อยู่ในหน้าซึ่งอาจน่ารำคาญนี่ทำให้มันโหลดได้ตามปกติไม่ต้องกระโดด!

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

จำกัด รายการเมนู ADMIN ตามชื่อผู้ใช้แทนที่ชื่อผู้ใช้ด้วยชื่อผู้ใช้จริง

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

// หรือคุณสามารถใช้ถ้า ($ current_user-> user_login! = 'admin') แทนอาจมีประโยชน์มากกว่า

จัดลักษณะแท็กคลาวด์

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

การอ้างอิงเต็มรูปแบบของตัวเลือกที่นี่ (มีจำนวนมาก!) http://codex.wordpress.org/Function_Reference/wp_tag_cloud

เปลี่ยนตัวจับเวลาการอัพเดตวิดเจ็ต RSS เริ่มต้น

(ค่าเริ่มต้นคือ 6 หรือ 12 ชั่วโมงฉันลืม (1800 = 30 นาที)

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

คุณช่วยแบ่งแต่ละคำถามเหล่านี้ออกเป็นคำตอบแยกได้ภายในไม่กี่สัปดาห์ข้างหน้า ฉันจะทำเพื่อคุณ แต่ไม่ต้องการทำให้ดูเหมือนว่าฉันจะได้รับเครดิตสำหรับคำตอบของคุณ ไม่ว่าในกรณีใด - ฉันพยายามจัดระเบียบนี้เพื่อให้ผู้ใช้สามารถค้นหาข้อมูลที่ต้องการได้อย่างง่ายดาย ขอบคุณล่วงหน้า
NetConstructor.com

ฉันเพิ่งใช้รหัส "จำกัด รายการเมนู ADMIN ตามชื่อผู้ใช้แทนที่ชื่อผู้ใช้ด้วยชื่อผู้ใช้จริง" ซึ่งยอดเยี่ยม แต่คุณสามารถอัปเดตรหัสเพื่อแสดงว่าวิธีนี้สามารถทำได้สำหรับ "บทบาทผู้ใช้" โดยเฉพาะ ฉันคิดว่ามันจะมีประโยชน์มาก!
NetConstructor.com

ขออภัย NetConstructor ฉันเพิ่งเห็นความคิดเห็นของคุณตอนนี้ สำหรับบทบาทผู้ใช้ฉันจะใช้ "current_user_can" ฉันไม่มีเวลาทดสอบ แต่เมื่อฉันทำฉันจะเพิ่ม
Wyck

ค่าเริ่มต้นสำหรับ wp_feed_cache_transient_lifetime คือ 43200 (12 ชั่วโมง)
brasofilo

26

ลบประกาศการอัปเดตปลั๊กอินสำหรับปลั๊กอินที่ไม่ทำงานเท่านั้น

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
นี่ไม่ใช่ความคิดที่ดี - ปลั๊กอินที่ไม่ทำงานยังคงปรากฏอยู่ในระบบไฟล์และปลั๊กอินที่ไม่ปลอดภัยยังสามารถใช้ในการแฮ็คไซต์ได้ ปลั๊กอินควรได้รับการปรับปรุงให้ทันสมัยอยู่เสมอ
ทิมมาโลน

25

ลบข้อมูลที่ไม่จำเป็นและ HTML ภายใน<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'
    ) );
}

23

เปิดใช้งานการแก้ไขข้อผิดพลาดและการเข้าสู่ระบบเพื่อใช้งานบนไซต์สด

นี่เป็นส่วนหนึ่งของรหัสที่ฉันเขียนเพื่อใช้ประโยชน์จากค่าคงที่ WP_DEBUG ซึ่งปกติจะปิดใช้งานตามค่าเริ่มต้น ฉันได้สร้างวิธีการที่ไม่เพียง แต่เปิดใช้งาน WP_DEBUG เพื่อให้คุณสามารถใช้งานได้บนไซต์สดที่ไม่มีผลข้างเคียงเชิงลบ แต่ฉันยังใช้ประโยชน์จากค่าคงที่การดีบักอื่น ๆ เพื่อบังคับให้แสดงข้อผิดพลาดและสร้างล็อกไฟล์ ข้อผิดพลาดและประกาศในไดเรกทอรี / wp-content

วางรหัสนี้ในไฟล์ wp-config.php ของคุณ (หลังจากที่คุณบันทึกเพียงแค่สำรองข้อมูลในกรณี) จากนั้นคุณสามารถผ่านพารามิเตอร์? debug = 1, 2 หรือ 3 ที่ส่วนท้ายของ URL ใด ๆ ในเว็บไซต์ของคุณ

? debug = 1 = แสดงข้อผิดพลาด / ประกาศทั้งหมด? debug = 2 = บังคับให้แสดงขึ้น? debug = 3 = สร้างไฟล์ debug.log ของข้อผิดพลาดทั้งหมดใน / 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);
}

ฉันไปลงรายละเอียดเพิ่มเติมเกี่ยวกับโพสต์ของผู้เข้าพักที่ฉันเขียนสำหรับ Comluv หากคุณสนใจที่นี่: http://comluv.com/dev/enable-debugging-and-logging-for-live-site-usage/

ฉันยังคงทำงานเพื่อให้รหัสผ่านนี้ได้รับการปกป้องอย่างใดอย่างหนึ่งหรืออาจทำให้มันทำงานได้หาก (current_user_can ('Manage_themes') และ is_logged_in ()

แต่นั่นคือสิ่งที่มันยุ่งยากมากขึ้น


เราใช้สิ่งที่คล้ายกับการตั้งค่าการแสดงสดและการเชื่อมต่อฐานข้อมูลรายละเอียด dev
Tom

20

เพิ่มหัวเรื่องแบบไดนามิกโดยอัตโนมัติไปยังหน้าสาธารณะ

ทดสอบกับ: Wordpress 3.0.1

การใช้รหัสด้านล่างจะสร้างชื่อหน้าเว็บแบบไดนามิกโดยอัตโนมัติตามหน้า / โพสต์ที่ดูแบบสาธารณะ

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

บทบาทใหม่และความสามารถ - ทำงานเพียงครั้งเดียว!

ฉันเก็บมือเหล่านี้ไว้นี่เป็นวิธีที่ถูกต้องในการทำโดยไม่มีปลั๊กอิน พวกเขาตั้งค่าฟิลด์เดียว (prefix_user_roles) ในฐานข้อมูลตัวเลือกและคุณไม่จำเป็นต้องมีปลั๊กอินในการตั้งค่า อ้างถึงเพจ Codex สำหรับรายการของความสามารถที่มีอยู่และคำอธิบายสำหรับสิ่งที่พวกเขาทำ คุณต้องยกเลิกการคอมเม้นต์หนึ่งในบล็อกเหล่านี้โหลดหน้าใดก็ได้แล้วแสดงความคิดเห็นอีกครั้ง! ที่นี่ฉันสร้างบทบาทที่มีความสามารถที่ฉันต้องการ:

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

บางครั้งการเพิ่ม / ลบออกจากบทบาทที่มีอยู่จะสะดวกกว่าการลบและเพิ่มอีกครั้ง อีกครั้งคุณจะต้องยกเลิกการใส่เครื่องหมายความคิดเห็นโหลดหน้าแล้วแสดงความคิดเห็นอีกครั้ง สิ่งนี้จะเก็บบทบาท / ความสามารถอย่างถูกต้องในตารางตัวเลือก (สิ่งนี้ช่วยให้คุณผู้พัฒนาสามารถควบคุมและลบโอเวอร์เฮดของปลั๊กอินขนาดใหญ่ที่ทำสิ่งเดียวกัน) ที่นี่ฉันกำลังเปลี่ยนบทบาทผู้เขียนเพื่อลบโพสต์ที่เผยแพร่ (ค่าเริ่มต้น) แต่อนุญาตให้พวกเขาแก้ไขได้ โพสต์ที่เผยแพร่ของพวกเขา (ซึ่งเป็นไปไม่ได้สำหรับบทบาทนี้โดยค่าเริ่มต้น) - ใช้ * add_cap * หรือ * remove_cap *

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

ฉันเก็บสเปรดชีทกับตารางจากหน้า Codex สำหรับเว็บไซต์ที่แก้ไขด้วยวิธีนี้ดังนั้นฉันสามารถจำได้ว่าสิ่งต่าง ๆ มีการตั้งค่าไว้อย่างไรแม้ว่าจะทิ้งรหัสความคิดเห็นไว้ในไฟล์ functions.php ของคุณ อย่าปล่อยตัวอย่างเหล่านี้ไว้โดยไม่ใส่เครื่องหมายข้อคิดเห็นมิเช่นนั้นจะเขียนลงในฐานข้อมูลเมื่อโหลดแต่ละหน้า!


ฟังก์ชั่นที่ฉันพูดถึงข้างต้นเขียนไปยังเขตข้อมูลในฐานข้อมูลตัวเลือก การแสดงความคิดเห็นและไม่แสดงความคิดเห็นพวกเขาเป็นวิธีที่จะไป มีปลั๊กอินสำหรับบทบาทของผู้ใช้ แต่ถ้าคุณใช้ฟังก์ชั่นที่กล่าวถึงข้างต้นคุณจะไม่สามารถปล่อยให้ฟังก์ชันเหล่านี้ทำงานได้และคุณไม่จำเป็นต้องตั้งค่ามากกว่าหนึ่งครั้งหรือตั้งค่าโดยยึดตามหากผู้ใช้เฉพาะเข้าถึงบางสิ่ง หากคุณต้องการให้ตั้งค่าผู้ใช้นั้นด้วยบทบาทเฉพาะที่ไม่ซ้ำใคร และอ้างถึง codex ทุกอย่างที่ฉันเขียนข้างต้นนั้นถูกต้อง 100% ถ้าคุณทำโดยไม่มีปลั๊กอิน สำหรับเกือบทุกกรณีคุณจะต้องกำหนดบทบาทผู้ใช้เพียงครั้งเดียว
tomcat23

@ tomcat23: เพื่อแสดงให้เห็นว่าฉันใส่มันไว้ในฟังก์ชั่นเพื่อเพิ่มบทบาทเท่านั้นเมื่อมันไม่ได้มีอยู่แล้ว หมายเหตุอื่น: ฉันคิดว่ามันจะง่ายกว่าที่จะวางบทบาทที่ไหนสักแห่งในลำดับชั้นของบทบาทด้วยการดึงตัวพิมพ์ใหญ่จากบทบาทที่มีอยู่แล้วจากนั้นเพิ่ม / ลบความสามารถออกจากบทบาทในตัว จะทำให้ชัดเจนยิ่งขึ้นและง่ายต่อการจดจำถ้ามีการวางแคปไว้ระหว่างอดีต ผู้ดูแลระบบและบรรณาธิการ - ฉันหวังว่าคุณจะไม่รังเกียจที่ฉันจะแก้ไขคำตอบของคุณ ถ้าคุณทำแล้วกรุณากลับมา :)
ไกเซอร์

1
@ tomcat23 - น้ำใต้สะพาน ณ จุดนี้ ทั้งหมดที่ฉันพูดคือฉันไม่ได้สนใจที่จะโทษเพียงแค่มีความสงบสุขสำหรับทุกคนก้าวไปข้างหน้า :)
MikeSchinkel

2
@MikeSchinkel ใช่คุณพูดถูก @kaiser ขอโทษถ้าฉันทำให้คุณดูถูก
tomcat23

1
@MikeSchinkel: ขอบคุณที่นำสันติสุขกลับมา @ tomcat23: ไม่คุณไม่ได้ทำ ฉันสามารถจัดการกับการวิจารณ์แบบนั้นได้ ขอโทษด้วย
kaiser

19

Wordpress Custom Admin Footer

// กำหนดข้อความท้ายหน้าของผู้ดูแลระบบเอง
ฟังก์ชัน custom_admin_footer () {
        echo 'เพิ่มข้อความท้ายกระดาษที่กำหนดเองและ html ที่นี่';
} 
add_filter ('admin_footer_text', 'custom_admin_footer');

ฉันใช้สิ่งนี้สำหรับเว็บไซต์ลูกค้าเป็นจุดอ้างอิงง่ายๆเพื่อติดต่อฉันเป็นนักพัฒนา


19

เปิดใช้งานรหัสย่อในวิดเจ็ต

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

18

ฟังก์ชั่นเพื่อปิดการใช้งานฟีด RSS

ทดสอบกับ: Wordpress 3.0.1

คุณสามารถปิดการใช้งานฟีด RSS หากคุณต้องการรักษาเว็บไซต์ Wordpress ของคุณเป็นแบบคงที่

คุณสามารถใช้ฟังก์ชั่นนี้:

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

ที่มา: bueltge.de/wordpress-feeds-deaktivieren/794 (Frank Bueltge)
fuxia

ขอบคุณ Toscho! แหล่งที่มายังมีอยู่ในภาษาอังกฤษwpengineer.com/287/disable-wordpress-feed
bueltge

16

เปลี่ยนข้อความ "Howdy" เป็น "Welcome"

ด้วยฟังก์ชั่นนี้คุณสามารถปรับแต่งข้อความ "Howdy" ที่ด้านบนขวาของพื้นที่ผู้ดูแลระบบของคุณ
ฟังก์ชันนี้ใช้ประโยชน์จาก JQuery เพื่อเปลี่ยนข้อความ "Howdy" เป็น "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;
}

รุ่น PHP โดยใช้gettextตัวกรอง:

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
สิ่งนี้ไม่สามารถแก้ไขได้ในด้าน PHP ดังนั้นจึงไม่ได้รับผลลัพธ์เลยใช่ไหม
hakre

ทำงานได้ดีที่นี่ในเวอร์ชัน 3.0 ขึ้นไป แต่ทำไมถึงไม่ใช่รุ่นเก่า ตรวจสอบว่าปลั๊กอินอื่น ๆ ที่คุณใช้เป็นผู้รับผิดชอบหรือไม่ ข้อความที่ถูกแทนที่ด้วย JQuery อาจเป็นปลั๊กอิน JQuery หรือไม่
ฟิลิป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.