强大WordPress自定义域功能(非插件)

  • A+
所属分类:Wordpress

如何使用自定义域

1.使用插件:Custom Field Template,它可以实现自定义域的界面化,挺方便,下载地址:
https://wordpress.org/extend/plugins/custom-field-template/
2.不使用插件,而是使用本文介绍的办法,具体效果如下图:

强大WordPress自定义域功能(非插件)

一、定义 myCustomFields 类

  1. if ( !class_exists('myCustomFields') ) {   
  2. class myCustomFields {   
  3. /**
  4. * @var  string  $prefix  自定义栏目名的前缀  
  5. */  
  6. var $prefix = '_mcf_';   
  7. /**
  8. * @var  array  $postTypes  包含了标准的“文章”、“页面”和自定义文章类型的数组,自定义栏目面板将出现在这些文章类型中  
  9. */  
  10. var $postTypes = array"page""post" );  

如果自定义栏目名是以下划线(_)开头的,它将在 WordPress 自带的“自定义栏目”面板中隐藏。如果想保留 WordPress 自带“自定义栏目”面板,建议使用这个方法。

二、定义所有的自定义栏目

  1. /**  
  2. * @var  array  $customFields  定义了所有的自定义栏目  
  3. */  
  4. var $customFields = array(   
  5. array(   
  6. "name" => "block-of-text",   
  7. "title" => "多行文本",   
  8. "description" => "",   
  9. "type" => "textarea",   
  10. "scope" => array"page" ),   
  11. "capability" => "edit_pages"  
  12. ),   
  13. array(   
  14. "name" => "short-text",   
  15. "title" => "单行文本",   
  16. "description" => "",   
  17. "type" => "text",   
  18. "scope" => array"post" ),   
  19. "capability" => "edit_posts"  
  20. ),   
  21. array(   
  22. "name" => "checkbox",   
  23. "title" => "复选框",   
  24. "description" => "",   
  25. "type" => "checkbox",   
  26. "scope" => array"post""page" ),   
  27. "capability" => "manage_options"  
  28. )   
  29. );  

所有的自定义栏目都应该写在这里,当然要遵循这样的格式,不过这里只给出了单行文本框、多行文本框、富文本框、复选框四种类型,您可以在稍后自由添加。每一个字段包含的值为:

01: name: 自定义栏目的名称。这个名称将加上前缀存储在数据库中;
02: title : 用于显示在自定义栏目面板的标题;
03: description : 显示在每个自定义栏目的下方,给出提示;
04: type : 定义了显示的类型,默认为单行文本(text);
05: scope : 定义了每个自定义栏目的作用范围,例如 post 文章、page 页面;
06: capability : 定义了编辑每个自定义栏目需要的权限,如果对此不太了解,参见这篇文章:《Users, roles, and capabilities in WordPress》。

三、用于初始化的相关函数

  1. /**  
  2. * 用于兼容 PHP 4 的构造函数  
  3. */  
  4. function myCustomFields() { $this->__construct(); }   
  5. /**
  6. * 用于 PHP 5 的构造函数  
  7. */  
  8. function __construct() {   
  9. add_action( 'admin_menu', array( &$this, 'createCustomFields' ) );   
  10. add_action( 'save_post', array( &$this, 'saveCustomFields' ), 1, 2 );   
  11. // 如果想要保留 WordPress 自带“自定义栏目”面板,请注释下一行   
  12. add_action( 'do_meta_boxes', array( &$this, 'removeDefaultCustomFields' ), 10, 3 );   
  13. }   
  14. /**
  15. * 移除 WordPress 自带“自定义栏目”面板  
  16. */  
  17. function removeDefaultCustomFields( $type$context$post ) {   
  18. foreach ( array( 'normal', 'advanced', 'side' ) as $context ) {   
  19. foreach ( $this->postTypes as $postType ) {   
  20. remove_meta_box( 'postcustom', $postType$context );   
  21. }   
  22. }   
  23. }   
  24. /**
  25. * 创建新的“自定义栏目”面板  
  26. */  
  27. function createCustomFields() {   
  28. if ( function_exists( 'add_meta_box' ) ) {   
  29. foreach ( $this->postTypes as $postType ) {   
  30. add_meta_box( 'my-custom-fields', 'Custom Fields', array( &$this, 'displayCustomFields' ), $postType, 'normal', 'high' );   
  31. }   
  32. }   
  33. }  

其中包括了构造函数(注意 PHP 4 与 PHP 5 承认的构造函数并不相同,而 PHP 4 似乎没有析构函数),向 admin_menu 添加钩子以显示自定义栏目面板,向 save_post 添加钩子以在文章保存时也能保存自定义栏目中的信息,向 do_meta_boxes 添加钩子以移除 WordPress 自带“自定义栏目”面板(如果不需要可以将之注释)。

四、权限检查

  1. /**  
  2. * 显示新的“自定义栏目”面板  
  3. */  
  4. function displayCustomFields() {   
  5. global $post;   
  6. ?>   
  7. <div>   
  8. <?php   
  9. wp_nonce_field( 'my-custom-fields', 'my-custom-fields_wpnonce', false, true );   
  10. foreach ( $this->customFields as $customField ) {   
  11. // 范围检查   
  12. $scope = $customField[ 'scope' ];   
  13. $output = false;   
  14. foreach ( $scope as $scopeItem ) {   
  15. // 原作者在此处使用了 switch,估计是修改时忘记删掉了   
  16. if ( $post->post_type == $scopeItem ) {   
  17. $output = true;   
  18. break;   
  19. }   
  20. }   
  21. // 权限检查   
  22. if ( !current_user_can( $customField['capability'], $post->ID ) )   
  23. $output = false;  

这一段是显示新的“自定义面板”的函数 displayCustomFields(),wp_nonce_field() 函数生成了一个包含随机数的隐藏字段,用于检查提交的内容来自合法的位置。首先检查的是自定义栏目的作用范围,如注释中所述,原作者在此处使用了 switch,估计是修改时忘记删掉了(因为前一个版本检查方式与现在有一些差别)。接着检查的是权限,检查通过后才会显示这个自定义栏目。

五、输出自定义栏目

  1. /**  
  2. * 保存自定义栏目的值  
  3. */  
  4. function saveCustomFields( $post_id$post ) {   
  5. if ( !wp_verify_nonce( $_POST[ 'my-custom-fields_wpnonce' ], 'my-custom-fields' ) )   
  6. return;   
  7. if ( !current_user_can( 'edit_post', $post_id ) )   
  8. return;   
  9. if ( ! in_array( $post->post_type, $this->postTypes ) )   
  10. return;   
  11. foreach ( $this->customFields as $customField ) {   
  12. if ( current_user_can( $customField['capability'], $post_id ) ) {   
  13. if ( isset( $_POST$this->prefix . $customField['name'] ] ) && trim( $_POST$this->prefix . $customField['name'] ] ) ) {   
  14. $value = $_POST$this->prefix . $customField['name'] ];   
  15. // 为富文本框的文本自动分段   
  16. if ( $customField['type'] == "wysiwyg" ) $value = wpautop( $value );   
  17. update_post_meta( $post_id$this->prefix . $customField[ 'name' ], $value );   
  18. else {   
  19. delete_post_meta( $post_id$this->prefix . $customField[ 'name' ] );   
  20. }   
  21. }   
  22. }   
  23. }   
  24. // End Class   
  25. // End if class exists statement   
  26. // 实例化类   
  27. if ( class_exists('myCustomFields') ) {   
  28. $myCustomFields_var = new myCustomFields();   
  29. }  

wp_verify_nonce验证了提交的数据是否可信。

七、完整代码:

  1. <?php if ( !class_exists('myCustomFields') ) {   
  2. class myCustomFields {   
  3. /**
  4. * @var  string  $prefix  自定义栏目名的前缀  
  5. */  
  6. var $prefix = '_mcf_';   
  7. /**
  8. * @var  array  $postTypes  包含了标准的“文章”、“页面”和自定义文章类型的数组,自定义栏目面板将出现在这些文章类型中  
  9. */  
  10. var $postTypes = array"page""post" );   
  11. /**
  12. * @var  array  $customFields  定义了所有的自定义栏目  
  13. */  
  14. var $customFields = array(   
  15. array(   
  16. "name" => "block-of-text",   
  17. "title" => "多行文本",   
  18. "description" => "",   
  19. "type" => "textarea",   
  20. "scope" => array"page" ),   
  21. "capability" => "edit_pages"  
  22. ),   
  23. array(   
  24. "name" => "short-text",   
  25. "title" => "单行文本",   
  26. "description" => "",   
  27. "type" => "text",   
  28. "scope" => array"post" ),   
  29. "capability" => "edit_posts"  
  30. ),   
  31. array(   
  32. "name" => "checkbox",   
  33. "title" => "复选框",   
  34. "description" => "",   
  35. "type" => "checkbox",   
  36. "scope" => array"post""page" ),   
  37. "capability" => "manage_options"  
  38. )   
  39. );   
  40. /**
  41. * 用于兼容 PHP 4 的构造函数  
  42. */  
  43. function myCustomFields() { $this->__construct(); }   
  44. /**
  45. * 用于 PHP 5 的构造函数  
  46. */  
  47. function __construct() {   
  48. add_action( 'admin_menu', array( &$this, 'createCustomFields' ) );   
  49. add_action( 'save_post', array( &$this, 'saveCustomFields' ), 1, 2 );   
  50. // 如果想要保留 WordPress 自带“自定义栏目”面板,请注释下一行   
  51. add_action( 'do_meta_boxes', array( &$this, 'removeDefaultCustomFields' ), 10, 3 );   
  52. }   
  53. /**
  54. * 移除 WordPress 自带“自定义栏目”面板  
  55. */  
  56. function removeDefaultCustomFields( $type$context$post ) {   
  57. foreach ( array( 'normal', 'advanced', 'side' ) as $context ) {   
  58. foreach ( $this->postTypes as $postType ) {   
  59. remove_meta_box( 'postcustom', $postType$context );   
  60. }   
  61. }   
  62. }   
  63. /**
  64. * 创建新的“自定义栏目”面板  
  65. */  
  66. function createCustomFields() {   
  67. if ( function_exists( 'add_meta_box' ) ) {   
  68. foreach ( $this->postTypes as $postType ) {   
  69. add_meta_box( 'my-custom-fields', 'Custom Fields', array( &$this, 'displayCustomFields' ), $postType, 'normal', 'high' );   
  70. }   
  71. }   
  72. }   
  73. /**
  74. * 显示新的“自定义栏目”面板  
  75. */  
  76. function displayCustomFields() {   
  77. global $post;   
  78. ?>   
  79. <div>   
  80. <?php   
  81. wp_nonce_field( 'my-custom-fields', 'my-custom-fields_wpnonce', false, true );   
  82. foreach ( $this->customFields as $customField ) {   
  83. // 范围检查   
  84. $scope = $customField[ 'scope' ];   
  85. $output = false;   
  86. foreach ( $scope as $scopeItem ) {   
  87. // 原作者在此处使用了 switch,估计是修改时忘记删掉了   
  88. if ( $post->post_type == $scopeItem ) {   
  89. $output = true;   
  90. break;   
  91. }   
  92. }   
  93. // 权限检查   
  94. if ( !current_user_can( $customField['capability'], $post->ID ) )   
  95. $output = false;   
  96. // 如果允许,则输出   
  97. if ( $output ) { ?>   
  98. <div>   
  99. <?php   
  100. switch ( $customField[ 'type' ] ) {   
  101. case "checkbox": {   
  102. // 输出复选框   
  103. echo '<label for="' . $this->prefix . $customField[ 'name' ] .'" style="display:inline;"><b>' . $customField[ 'title' ] . '</b></label>&nbsp;&nbsp;';   
  104. echo '<input type="checkbox" name="' . $this->prefix . $customField['name'] . '" id="' . $this->prefix . $customField['name'] . '" value="yes"';   
  105. if ( get_post_meta( $post->ID, $this->prefix . $customField['name'], true ) == "yes" )   
  106. echo ' checked="checked"';   
  107. echo '" style="width: auto;" />';
  108. break;  
  109. }  
  110. case "textarea":  
  111. case "wysiwyg": {  
  112. // 输出多行文本框  
  113. echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><b>' . $customField[ 'title' ] . '</b></label>';  
  114. echo '<textarea name="' . $this->prefix . $customField[ 'name' ] . '" id="' . $this->prefix . $customField[ 'name' ] . '" columns="30" rows="3">' . htmlspecialchars( get_post_meta( $post->ID, $this->prefix . $customField[ 'name' ], true ) ) . '</textarea>';  
  115. // 输出富文本编辑框  
  116. if ( $customField[ 'type' ] == "wysiwyg" ) { ?>  
  117. <script type="text/javascript">  
  118. jQuery( document ).ready( function() {  
  119. jQuery( "<?php echo $this->prefix . $customField[ 'name' ]; ?>" ).addClass( "mceEditor" );  
  120. if ( typeof( tinyMCE ) == "object" && typeof( tinyMCE.execCommand ) == "function" ) {  
  121. tinyMCE.execCommand( "mceAddControl", false, "<?php echo $this->prefix . $customField[ 'name' ]; ?>" );  
  122. }  
  123. });  
  124. </script>  
  125. <?php }  
  126. break;  
  127. }  
  128. default: {  
  129. // 输出单行文本框  
  130. echo '<label for="' . $this->prefix . $customField[ 'name' ] .'"><b>' . $customField[ 'title' ] . '</b></label>';  
  131. echo '<input type="text" name="' . $this->prefix . $customField[ 'name' ] . '" id="' . $this->prefix . $customField[ 'name' ] . '" value="' . htmlspecialchars( get_post_meta( $post->ID, $this->prefix . $customField[ 'name' ], true ) ) . '" />';  
  132. break;  
  133. }  
  134. }  
  135. ?>  
  136. <?php if ( $customField[ 'description' ] ) echo '<p>' . $customField[ 'description' ] . '</p>'; ?>  
  137. </div>  
  138. <?php  
  139. }  
  140. } ?>  
  141. </div>  
  142. <?php  
  143. }  
  144. /**  
  145. * 保存自定义栏目的值  
  146. */  
  147. function saveCustomFields( $post_id, $post ) {  
  148. if ( !wp_verify_nonce( $_POST[ 'my-custom-fields_wpnonce' ], 'my-custom-fields' ) )  
  149. return;  
  150. if ( !current_user_can( 'edit_post', $post_id ) )  
  151. return;  
  152. if ( ! in_array( $post->post_type, $this->postTypes ) )  
  153. return;  
  154. foreach ( $this->customFields as $customField ) {  
  155. if ( current_user_can( $customField['capability'], $post_id ) ) {  
  156. if ( isset( $_POST[ $this->prefix . $customField['name'] ] ) && trim( $_POST[ $this->prefix . $customField['name'] ] ) ) {  
  157. $value = $_POST[ $this->prefix . $customField['name'] ];  
  158. // 为富文本框的文本自动分段  
  159. if ( $customField['type'] == "wysiwyg" ) $value = wpautop( $value );   
  160. update_post_meta( $post_id$this->prefix . $customField[ 'name' ], $value );   
  161. else {   
  162. delete_post_meta( $post_id$this->prefix . $customField[ 'name' ] );   
  163. }   
  164. }   
  165. }   
  166. }   
  167. // End Class   
  168. // End if class exists statement   
  169. // 实例化类   
  170. if ( class_exists('myCustomFields') ) {   
  171. $myCustomFields_var = new myCustomFields();   
  172. }   
  173. ?>  

八、调用自定义域内容

1.直接调用,如自定义域的“name”为 _xszz_img

  1. <?php $key="_xszz_img"echo get_post_meta($post->ID, $key, true); ?>   
  2. 2.如果存在自定义域才调用,否则显示默认或者其他内容   
  3. <?php if ( get_post_meta($post->ID, '_xszz_img', true) ) : ?>   
  4. <?php $key="_xszz_img"echo get_post_meta($post->ID, $key, true); ?>   
  5. <?php else : ?>   
  6. //你自己的其他代码   
  7. <?php endif; ?>  
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: