wordpress开发:自定义发布类型post_type与栏目添加

本文以浅显易懂的方式,以添加一个产品类型为例,介绍wordpress中自定义发布类型post_type的添加方法。本文主要关注后台部分的添加,前台请参考官方模板的代码,本文尚在不断更新完善中。

国内文章一大抄,百度一下千篇一律,完全都是翻译的官方手册。官方手册我不会自己看啊?

基础知识普及

若对wordpress架构比较了解请略过此段。

Wordpress所有文章都是存储在`wp_posts`表中,这个表里的东西很杂,除了有普通博客的文章,还有附件,通过`post_type`字段来区分。wordpress里面还有一个叫wp_postmeta的表,大白话讲这个表就是存储关联信息的表。每一篇文章,可能都会有几个关联的信息,比如访问量点击数这种,通过post_meta这种方式来存储和获取。

流程

post_type就是自定义发布类型了,这也是对wordpress进行二次开发的第一步。我们知道wp本身是个博客程序,他所有文章甚至附件都存储在一个表中(wp_posts),通过post_type来区分。wp提供了一整套流程,通过这套流程可以方便的创建自己的伪模型、自定义各种字段、方便的在后台添加创建栏目。这里要特别说明一件事,我们创建了新的post_type,实际数据也是在wp_posts表中的,也就是说,我们并没有真正改变表结构,只是通过post_meta这种方式关联了一些信息,就像是新建了字段一样。流程大致为:

  1. 注册新类型:就是告诉wp,我们要搞一个新的发布类型,叫什么名字等等。
  2. 添加MetaBox:后台里面,字段数据添加、修改的展示表格。
  3. MetaBoxpost_meta关联:上一步只是添加表格,数据提交后,把相应的数据写入post_meta
  4. 指定这个新类型的分类
  5. 设置前台列表页和内容页展示的页面

以下以产品product为例,分五部分介绍核心代码,达到快速入门的目的。拓展时可以直接参考官方手册,常规使用下面70%够用。

新建post_type

//添加product类型
function create_product_type() {
    register_post_type( 'product',
        array(
            'labels' => array(
                'name' => '产品',
                'singular_name' => '单条产品',
                'add_new' => '添加产品',
                'add_new_item' => '添加产品',
                'edit' => '编辑',
                'edit_item' => '编辑产品',
                'new_item' => '新产品',
                'view' => '查看',
                'view_item' => '查看产品',
                'search_items' => '查找产品',
                'not_found' => '没有找到产品信息',
                'not_found_in_trash' => '回收站没有产品',
                'all_items' =>  '产品列表',
            ),

            'public' => true,
            'menu_position' => 15,
            'supports' => array( 'title', 'editor', 'thumbnail' ),
            'taxonomies' => array( '' ),
            'has_archive' => true
        )
    );
}
add_action( 'init', 'create_product_type' );

register_post_type官方手册:https://codex.wordpress.org/Function_Reference/register_post_type

添加Meta Box和字段的展示

// 添加Meta Box
function add_product_box() {
    add_meta_box( 'product_meta_box',    //唯一标记
        '产品信息',               //Meta Box标题
        'display_product_meta_box_callback',      //回调函数
        'product',                       //关联的自定义文章类型
        'normal',                       //页面显示位置
        'high'                          //显示位置优先级
    );
}
add_action( 'add_meta_boxes', 'add_product_box' );
// 添加展示
function display_product_meta_box_callback( $result ) {
    // 产品简称
    $product_code = esc_html( get_post_meta( $result->ID, 'product_code', true ) );
    ?>
    <table>
        <tr>
            <td style="width:120px;">产品代码</td>
            <td style="width:85%;"><input type="text" style="width:500px;" name="product_code" value="<?php echo $product_code; ?>" /></td>
            <?php wp_nonce_field( 'product_save_nonce', 'product_save_nonce' );  //安全提交函数 ?>
        </tr>
    </table>
    <?php
}

示例中只添加一个字段,就是产品简称。

add_meta_box官方手册:https://developer.wordpress.org/reference/functions/add_meta_box/

MetaBox和post_meta关联

function save_product_fields( $post_id, $post ) {
    // 判断类型
    if ( $post->post_type == 'product' && wp_verify_nonce( $_POST['product_save_nonce'], 'product_save_nonce' ) ) {
        // 写入数据
        if ( isset( $_POST['product_code'] ) {
            update_post_meta( $post_id, 'product_code', $_POST['product_code'] );
        }
    }
}
add_action( 'save_post', 'save_product_fields', 10, 2 );

添加分类

// 产品自定义分类
function product_taxonomies() {
    register_taxonomy(
        'product_category',    //自定义分类名
        'product',                //自定义类型
        array(
            'labels' => array(
                'name' => '产品分类',
                'add_new_item' => '添加产品分类',
                'new_item_name' => '新产品分类',
            ),
            'show_ui' => true,          //后台显示
            'show_tagcloud' => false,   //是否显示标签
            'hierarchical' => true,     //控制分类法格式
        )
    );
}
add_action( 'init', 'product_taxonomies', 0 );

register_taxonomy官方手册:https://developer.wordpress.org/reference/functions/register_taxonomy/

指定前台展示页面

// 指定页面模板
function product_template( $template_path ) {
    if ( get_post_type() == 'product' ) {
        if ( is_single() ) {
            $theme_file = locate_template( array ( 'single-product.php' ) );
            $template_path = $theme_file;
        } elseif ( is_archive() ) {
            $theme_file = locate_template( array ( 'archive-product.php' ) );
            $template_path = $theme_file;
        }
    }
    return $template_path;
}
add_filter( 'template_include', 'product_template', 1 );

locate_template官方手册:https://developer.wordpress.org/reference/functions/locate_template/

本文更新完善中,如有错误请批评指正。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有M币奖励和额外收入!

模板下载吧 快速入门 wordpress开发:自定义发布类型post_type与栏目添加 https://www.mbxzb.com/blog/file/rumen/24235.html

从明天起,做一个幸福的人,喂马、劈柴、周游世界…

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用
查看详情

相关文章

评论
暂无评论
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 威武 友军 顶贴
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

wordpress开发:自定义发布类型post_type与栏目添加-海报