WordPress自定义文章类型

WordPress, 转自点点 7 年前 回复

,

WordPress早已经可以完美的作为CMS了,真正的突破是自定义文章类型(custom post type)功能,你可以通过自定义文章类型来创建各种各样的内容。本文将介绍下Wordpress的自定义文章类型。

零、软件准备

先搭建Wordpress本地环境:

1.到s135.com下载由张宴开发的APMServ软件,这是一个Windows平台下的Apache+Mysql+PHP集成软件,只需要解压在路径中不含中文的文件夹中即可,比如:H://apmserv是可用的,H://测试软件/apmserv这个路径是不行的。

2.到cn.wordpress.org下载最新版的Wordpress简体中文版,将压缩包解压后得到的文件夹中的内容复制到APMserv的htdocs下,可点击APMserv的菜单直接到相应目录(启用APMSevr的时候,请关闭360相关的所有垃圾软件,浏览器除外),如下图所示:

然后,点击APMserv软件右侧的“管理Mysql数据库”,以账户root,空密码进入,然后创建一个数据库,例如:demo;

3.在你的浏览器的地址栏输入127.0.0.1,即进入Wordpress安装界面,填写相应信息即可安装。

一.自定义文章类型的由来

在2005年2月17日发布的WordPress 1.5中,已经支持静态网页、创建post_type数据库字段了。实际上,wp_insert_post()函数在Wordpress1.0中已经存在了,所以在Wordpress1.5添加了post_type,更加灵活了,代码量也更少了,实际上,并非仅仅是如此简单的。

register_post_type()和其它一些对自定义文章类型有用的函数是从Wordpress2.8开始有的,到了Wordpress2.9,这些函数或者功能才成熟。

二.Wordpress可以做什么

自定义文章类型与普通文章除了在数据库中的post_type不同外,其它没什么不同的。普通文章的post_type在数据库中的值是post,普通页面的post_type在数据库中的值是page,附件的post_type在I数据库中的值是attachment ,自定义文章类型的post_type在数据库中的值是你自己设置的。

正确的创建Wordpress自定义文章类型,你需要先考虑以下几个步骤:

1.后台:自定义的文章类型在Wordpress后台左侧仪表盘(将Wordpress翻译为简体中文的人很奇怪的将pannel翻译为仪表盘了,我觉得翻译为控制面板比较合适)有一个独立的菜单项(甚至可以考虑下有个自己的icon),这个菜单项下面至少应该有以下几个二级菜单:自定义文章类型文章的列表菜单项、添加新的自定义文章类型文章的菜单项,进一步可以考虑下为自定义文章类型来个分类和标签什么的,以方便管理;

2.前台:应该通过类似于http://coolwp.net/my-post-type-archive/之类的链接在前台访问到自定义文章类型的归档页面(也就是文章列表页面)。

当然,还有一些与普通的文章类型post类似的属性这里就不详细描述了。

三、Wordpress自定义文章类型的规划

为有效地创建和使用Wordpress自定义文章类型,你需要熟悉以下内容:

1.创建自定义文章类型;

2.创建自定义分类;

3.创建自定义meta box或者输入栏/选择栏。

四、创建Wordpress自定义文章类型

在你所用的Wordpress主题(例如使用Wordpress自带的默认主题)文件夹下的文件functions.php的最后一个?>(如果有的话)之前,如果没有的话,直接添加如下代码:

function sl_custom_post_product() {   
        $labels = array(   
            'name'               => _x( '产品', 'post type general name' ),   
            'singular_name'      => _x( '产品', 'post type singular name' ),   
            'add_new'            => _x( '添加', 'book' ),   
            'add_new_item'       => __( '添加新产品' ),   
            'edit_item'          => __( '编辑产品' ),   
            'new_item'           => __( '新产品' ),   
            'all_items'          => __( '全部产品' ),   
            'view_item'          => __( '查看产品' ),   
            'search_items'       => __( '搜索产品' ),   
            'not_found'          => __( '未找到产品' ),   
            'not_found_in_trash' => __( '回收站中暂无产品' ),    
            'parent_item_colon'  => '',   
            'menu_name'          => '产品'  
        );   
        $args = array(   
            'labels'        => $labels,   
            'description'   => '索凌网络的产品',   
            'public'        => true,   
            'menu_position' => 5,   
            'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),   
            'has_archive'   => true,   
        );   
        register_post_type( 'product', $args );    
    }   
    add_action( 'init', 'sl_custom_post_product' );

即可在Wordpress后台左侧仪表盘看到:

上面代码中:

labels 是一个参数数组;

description的值是对这个自定义文章类型的描述;

public的值设置为true,后面将会介绍;

menu_position菜单在Wordpress后台左侧仪表盘中的位置:5意味着这个自定义文章类型在菜单中将会在“文章”菜单的下面,如果在functions.php中这段代码前面的代码或者包含文件中没有其它自定义文章类型的话,如果在上面这段代码之前已经有其它自定义文章类型,并且menu_position也是5的话,上面这段代码自定义的文章类型将会出现在那个自定义文章类型之后,例如我再上面这段代码之前,已经定义了一个名字叫幻灯的自定义文章类型,并且menu_position也是5,那么顺序是:

menu_position数值对应的位置:

  • 5 -文章之下

  • 10 - 多媒体之下

  • 15 - 链接之下(链接在Wordpress3.5开始已经隐藏了)

  • 20 - 页面之下

  • 25 - 评论之下

  • 60 - 第一个分隔符之下(一般是在外观的上面)

  • 65 - 插件之下

  • 70 -用户之下

  • 75 - 工具之下

  • 80 -设置之下

  • 100 - 第二个分隔符之下(一般是在设置之下)

supports的值是一个数组,说明这个文章类型支持哪些特性:

  • 'title'

  • 'editor' (内容编辑器)

  • 'author'

  • 'thumbnail' (缩略图)

  • 'excerpt'

  • 'trackbacks'

  • 'custom-fields'

  • 'comments' (是否支持评论)

  • 'revisions' (是否自动备份)

  • 'page-attributes' (menu order, hierarchical must be true to show Parent option)

  • 'post-formats' add post formats

has_archive确定是否归档。

register_post_type()函数的参数说明,请参考:

http://codex.wordpress.org/Function_Reference/register_post_type

五、自定义Wordpress自定义文章类型的交互信息

自定义文章类型的交互信息很少被提及,这里简单介绍下:

function sl_updated_messages( $messages ) {   
        global $post, $post_ID;   
        $messages['product'] = array(   
            0 => '',    
            1 => sprintf( __('产品已更新!&nbsp; <a href="%s">查看</a>'), esc_url( get_permalink($post_ID) ) ),   
            2 => __('自定义栏已更新!'),   
            3 => __('自定义栏已删除!'),   
            4 => __('产品信息已更新!'),   
            5 => isset($_GET['revision']) ? sprintf( __('产品将回滚至 %s'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,   
            6 => sprintf( __('产品已发布!&nbsp; <a href="%s">查看</a>'), esc_url( get_permalink($post_ID) ) ),   
            7 => __('产品已保存!'),   
            8 => sprintf( __('产品已提交!&nbsp; <a target="_blank" href="%s" rel="noopener noreferrer">预览</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),   
            9 => sprintf( __('Product scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s" rel="noopener noreferrer">预览产品</a>'), date_i18n( __( 'Y-m-d @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),   
            10 => sprintf( __('产品草稿已更新!&nbsp; <a target="_blank" href="%s" rel="noopener noreferrer">预览</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),   
        );   
        return $messages;   
    }   
    add_filter( 'post_updated_messages', 'sl_updated_messages' );

当你发布一个产品的时候,会看到交互信息.

六、自定义Wordpress自定义文章类型的上下帮助

WordPress的上下文帮助是指会出现在Wordpress后台指定页面右上角的帮助信息,示例代码如下:

function sl_contextual_help( $contextual_help, $screen_id, $screen ) {    
        if ( 'product' == $screen->id ) {   
               
            $contextual_help = '<h2>产品发布/编辑页面帮助信息</h2>   
            <p>索凌网络提示:请在这里输入Wordpress的上下文帮助信息!</p>';   
               
        } elseif ( 'edit-product' == $screen->id ) {   
               
            $contextual_help = '<h2>产品列表页面帮助信息</h2>   
            <p>索凌网络提示:请在这里输入Wordpress的上下文帮助信息!</p>';   
               
        }   
        return $contextual_help;   
    }   
    add_action( 'contextual_help', 'sl_contextual_help', 10, 3 );

上述代码加入functions.php之后,你点击产品列表页面的右上角的帮助,会看到设置的帮助信息.

点击产品发布/编辑页面右上角的帮助,会看到设置的相应的帮助信息.

七、自定义Wordpress自定义文章类型的分类

将下述代码添加到functions.php:

function sl_taxonomies_product() {   
        $labels = array(   
            'name'              => _x( '产品分类', 'taxonomy general name' ),   
            'singular_name'     => _x( '产品分类', 'taxonomy singular name' ),   
            'search_items'      => __( '搜索产品分类' ),   
            'all_items'         => __( '产品的全部分类' ),   
            'parent_item'       => __( '父级分类' ),   
            'parent_item_colon' => __( '父级分类:' ),   
            'edit_item'         => __( '编辑产品分类' ),    
            'update_item'       => __( '更新产品分类' ),   
            'add_new_item'      => __( '添加产品分类' ),   
            'new_item_name'     => __( '新的产品分类' ),   
            'menu_name'         => __( '产品分类' ),   
        );   
        $args = array(   
            'labels' => $labels,   
            'hierarchical' => true,   
        );   
        register_taxonomy( 'product_category', 'product', $args );   
    }   
    add_action( 'init', 'sl_taxonomies_product', 0 );

即可在产品菜单下有个产品分类的二级菜单.

八、自定义Wordpress自定义文章类型的meta box

将下述代码添加到functions.php:

add_action( 'add_meta_boxes', 'product_price_box' );   
    function product_price_box() {   
        add_meta_box(    
            'product_price_box',   
            __( '产品价格', 'coolwp' ),   
            'product_price_box_content',   
            'product',   
            'side',   
            'high'  
        );   
    }   
    function product_price_box_content( $post ) {   
        wp_nonce_field( plugin_basename( __FILE__ ), 'product_price_box_content_nonce' );   
        echo '<label for="product_price"></label>';   
        echo '<input type="text" id="product_price" name="product_price" style="width:100%" placeholder="请输入价格!" />';   
    }

在产品发布/编辑窗口的右上方(发布栏上方)即可出现价格输入栏.

但是,上面的代码是不会保存价格的,还需要验证nonce后保存或更新!

九、自定义Wordpress自定义文章类型的前台显示

示例页面模板代码:

<?php   
    //template name:产品测试   
            $args = array(   
                'post_type' => 'product',   
                'tax_query' => array(   
                    array(   
                        'taxonomy' => 'product_category',   
                        'field' => 'slug',   
                        'terms' => 'coolwp'  
                    )   
                )   
            );   
            $products = new WP_Query( $args );   
            if( $products->have_posts() ) {   
                while( $products->have_posts() ) {   
                    $products->the_post();   
                    ?>   
                        <h1>< ?php the_title() ?></h1>   
                        <div class='content'>   
                            < ?php the_content() ?>   
                        </div>   
                    < ?php   
                }   
            }   
            else {   
                echo '暂无产品!';   
            }   
        ?>

Via:http://suoling.net/wordpress-custom-post-type/

支付宝打赏微信打赏

如果此文对你有帮助,欢迎打赏作者。

发表评论

欢迎回来 (打开)

(必填)

1312