カスタム投稿とは何ですか?
ここでの投稿がブログ内の記事を参照していると考えないでください。これは単なる記事の代用であると考えることもできます。
カスタム モデルには非常に標準的なルールはありません。たとえば、WordPress 自体には次のような組み込みのコンテンツ モデルを使用できます。
ただし、ブログに組み込まれた投稿は少し異なることに注意してください。カテゴリやタグなどでコンテンツを識別するために使用できます。
記事モデルをカスタマイズする理由
WordPress は、ほとんどのサイトに適した確立されたデフォルトの投稿モデルをすでに提供していますが、さらに多くのオプションが必要です。役立つと思われるいくつかのコンテンツ モデルをリスト化し、対応する例にリンクしました。
投稿タイプを作成する
新しい投稿タイプを作成するには、 register_post_type 関数を使用して登録する必要があります。この関数はテーマのfunctions.phpファイルで呼び出す必要があります:
リーリー
リーリー
チュートリアルを作成する際の便宜上、多くのパラメーターがありますが、一般的な構造は次のとおりです。
リーリー
直感と利便性のために、中国語を直接使用しました。英語を使用してから、ローカライズ機能を介して中国語に翻訳する方がよいでしょう。
上記のコードから、$args 配列にラベル設定項目があることがわかります。これは、表示コピーライティングに関連するコンテンツを設定するために使用されます。わかりやすくするために、配列を個別に作成しました。他の設定項目の一般的な意味は、英語で読むことで推測できます。詳しく知りたい場合は、公式ドキュメント register_post_type を参照してください。
上記のコードをテーマの function.php の最後に追加します。背景に入ると、追加の映画オプションが表示されます。これは、登録が成功したことを意味します。
現時点では、新しいムービーを作成して、ムービータイプの記事を公開できます。ただし、これは基本的に Article タイプと同じです。Movie タイプを完成させるにはさらにカスタマイズする必要があります。
投稿タイプに分類機能を追加
映画に関しては、SF、アクション、戦争などのカテゴリに分類できます。次に、カスタマイズした映画に分類機能を追加して、新しいカテゴリを編集して映画を分類できるようにします。この分類は記事内の分類と同じです。
分類関数を追加するには、関数 register_taxonomy を使用する必要があります。使用方法も非常に簡単ですが、対応する投稿タイプを指定するパラメーターが 1 つある点が異なります。
リーリー
この例では、次の共通パラメータを設定できます:
リーリー
这里我们添加两个分类作为演示。
为 Post Type 添加自定义 Meta Box
我们想要添加的电影类型不能仅仅只有正文内容,我们还需要额外添加一些 导演 之类的有关内容。那么就需要添加自定义 Meta Box,Meta Box 可以在文章发表页面中添加自定义的表单,编写文章的时候可以填写额外的信息然后在前端调用出来。
自定义 Meta Box 需要用到 add_meta_box 函数:
add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args );
老规矩,具体参数内容查看官方文档,这里只介绍常用用法。我们注册一个 Meta Box :
add_action( 'add_meta_boxes', 'movie_director' ); function movie_director() { add_meta_box( 'movie_director', '电影导演', 'movie_director_meta_box', 'movie', 'side', 'low' ); }
然后在配置参数里面指定了回调函数 movie_director_meta_box,我们需要在这个函数里面创建表单:
function movie_director_meta_box($post) { // 创建临时隐藏表单,为了安全 wp_nonce_field( 'movie_director_meta_box', 'movie_director_meta_box_nonce' ); // 获取之前存储的值 $value = get_post_meta( $post->ID, '_movie_director', true ); ?> <label for="movie_director"></label> <input type="text" id="movie_director" name="movie_director" value="<?php echo esc_attr( $value ); ?>" placeholder="输入导演名称" > <?php }
这样就可以在文章界面边栏显示出来刚刚创建的表单了:
但是这时候,你的表单是没法用的,因为你提交文章之后并没有保存这个 Meta Box 的内容,下面是验证保存内容的代码:
add_action( 'save_post', 'movie_director_save_meta_box' ); function movie_director_save_meta_box($post_id){ // 安全检查 // 检查是否发送了一次性隐藏表单内容(判断是否为第三者模拟提交) if ( ! isset( $_POST['movie_director_meta_box_nonce'] ) ) { return; } // 判断隐藏表单的值与之前是否相同 if ( ! wp_verify_nonce( $_POST['movie_director_meta_box_nonce'], 'movie_director_meta_box' ) ) { return; } // 判断该用户是否有权限 if ( ! current_user_can( 'edit_post', $post_id ) ) { return; } // 判断 Meta Box 是否为空 if ( ! isset( $_POST['movie_director'] ) ) { return; } $movie_director = sanitize_text_field( $_POST['movie_director'] ); update_post_meta( $post_id, '_movie_director', $movie_director ); }
虽然最关键的函数就在最后一句,但是一定要注意安全的校验。把这些代码添加进 functions.php 文件之后,你的 Meta Box 就可以正常工作了。如果你需要更多表单,按照这个模式自定义表单结构,然后添加保存函数即可。
下面,我们迫不及待的添加两部电影《鱼与锅之战:宿命对决》 和 《鱼与锅之战:我爱水煮鱼》 内容如下:
添加完之后,我们可以看下所有电影:
列表空荡荡的,好难看,我可不可以加上导演字段?当然可以,使用 [manage $post type posts custom column](http://codex.wordpress.org/Plugin_API/Action_Reference/manage_$post_type_posts_custom_column) 即可实现,我们添加:
add_action("manage_posts_custom_column", "movie_custom_columns"); add_filter("manage_edit-movie_columns", "movie_edit_columns"); function movie_custom_columns($column){ global $post; switch ($column) { case "movie_director": echo get_post_meta( $post->ID, '_movie_director', true ); break; } } function movie_edit_columns($columns){ $columns['movie_director'] = '导演'; return $columns; }
即添加了列导演字段,并从每篇文章中读取出来。这样我们的列表就变成了:
OK,我们的后端部分就这样愉快的完成了。打开生成好的链接看下,咦,Not Found?是这样的,如果你的网站设置了固定连接,当你新建了 Post Type 之后,你必须要在后台更新一下固定连接设置才行。找到后台固定连接,再点击一下下面的“保存设置”,之后就可以正常访问了。
展示 Post Type 的内容
单纯创建 Post Type 只是可以让你输入内容,没有什么意义,我们还需要在前台输出自定义 Post Type 的内容。
自定义 Post Type 的模板和样式
根据 WordPress 的模板调用规则 我们可以得知,我们只需要创建 archive-[post_type].php 和 single-[post_type].php 就可以实现该 Post Type 的列表自定义和文章自定义。当访问 Post Type,WordPress 会优先调用这些模板来渲染。
需要注意的是,你需要在注册 Post Type 的时候设置 'has_archive' => true 才会有列表。
现在我们就把主题里自带的 archive.php 和 single.php 文件复制一份命名为 archive-movie.php 和 single-movie.php,为了演示,这里我不做很多自定义,只是输出导演信息表示一下。
我们分别在 L.56 和 L.23 附近的合适位置输出 Meta Box 信息:
echo '导演:'.get_post_meta( get_the_ID(), '_movie_director', true );
然后刷新访问电影列表和具体的电影就可以看到输出的导演信息了。
这里只是举个例子,实际中往往会自定义结构和输出的信息格式等,这里不再进一步修改。这里不再麻烦演示了。
调用 WP_Query 高度自定义调用 Post Type 的内容
上面操作依赖模板,如果需要高度自定义或者在页面的某个模块中调用列表,就需要用到 WP_Query 类来调用:
$args = array( 'post_type' => 'product', 'posts_per_page' => 10 ); $loop = new WP_Query( $args ); while ( $loop->have_posts() ) : $loop->the_post(); the_title(); echo '<div class="entry-content">'; the_content(); echo '</div>'; endwhile;
查询出来之后就跟常规的主循环一样了,自定输出结构即可。
在首页列表中显示自定义 Post Type 的内容
虽然我们自定义好了 Post Type 同时也编写了一些内容,但是在首页的列表里面并没有显示出来。自定义的 Post Type 的内容不会自动混入主循环里面。那如何让自定义 Post Type 的内容显示出来?
你需要使用 pre_get_posts 这个 action 来做一些处理:
add_action( 'pre_get_posts', 'add_my_post_types_to_query' ); function add_my_post_types_to_query( $query ) { if ( is_home() && $query->is_main_query() ) $query->set( 'post_type', array( 'post', 'page', 'movie' ) ); return $query; }
在上面的 $query 变量里面设置的 post_type 数组就是要在主循环里面展示的内容,将你的自定义 Post Type 填写进去就可以在首页中显示出来了。
设置自定义 Post Type 的固定连接
创建一个新的 Post Type 有时候也是为了更方便做 SEO,所以设置它的固定连接也非常重要。这里主要用到注册 Post Type 的参数数组里面的 rewrite 参数,常用以下几两项:
slug =》自定义固定连接结构别名,默认是使用 Post Type 名(例如本例的 movie),可以被翻译。一般来说 Post Type 名可能与实际需要的 URL 不一样( Post Type 为 movie,但 URL 可能需要 movies),就可使用该项自定义。
with_front =》 固定连接是否以根目录为基础路径。如果你在固定连接设置页面设置你的结构为 /archives/,那么你的 Post Type 生成的连接默认为 /archives/movie 如果设置该项为 false 即可去掉前面的 /archives/ 直接基于根路径生成固定连接。
大功告成,但这只是 Post Type 最基础的用法,Post Type 还有其他更高级的用法,更详细的参数配置还需要你去进一步挖掘来适应你网站的功能需求。