我第一次尝试创建自定义帖子类型 (tlc_duck),但无法弄清楚为什么 WP_Query 无法找到我的自定义类型的任何帖子。
我在下面包含了我的整个测试插件,因为它已经被精简到尝试学习如何使用自定义帖子类型的基本要素。我很清楚这不是安全的代码,因为它没有对输入进行清理,并且不使用随机数。请不要对代码的这些方面发表评论。
当我单击渲染的短代码中的“添加鸭子”按钮时,我可以在 PHP 错误日志中看到创建新鸭子帖子的代码正在运行。如果我查看 MySQL 数据库中的 wp_posts 表,我可以看到新的 tlc_duck 条目。如果我查看管理页面中的“鸭子帖子”列表,我可以看到新的鸭子条目。所以这部分工作正常。
但是,当我尝试查询以查看所有创建的鸭子的列表(参见第 77-90 行)时,have->posts() 返回 false(我在 PHP 错误日志中看到“没有鸭子”) .
我的猜测是我在注册自定义类型时做错了什么(参见第31-40行),但我发现关于每个功能的含义的文档有点迟钝......因为它可能很漂亮如果您已经知道这意味着什么,将会很有帮助。
我错过了什么(或搞砸了)?
<?php
/**
* Plugin Name: TLC Survey Posts
* Plugin URI: https://github.com/mikemayer67/tlc-survey-posts
* Description: Plugin to understand how custom post types work
* Version: 0.0.1
* Author: Michael A. Mayer
* Requires PHP: 5.3.0
* License: GPLv3
* License URL: https://www.gnu.org/licenses/gpl-3.0.html
*/
if( ! defined('WPINC') ) { die; }
function tlc_register_post_type()
{
$labels = array(
'name' => 'Duck Posts',
'singular_name' => 'Duck',
'add_new' => 'New Duck',
'add_new_item' => 'Add New Duck',
'edit_item' => 'Edit Duck',
'new_item' => 'New Ducky',
'view_item' => 'View Duckies',
'search_items' => 'Search Ducks',
'not_found' => 'No Ducks Found',
'not_found_in_trash' => 'No Ducks found in Trash',
);
$args = array(
'labels' => $labels,
'has_archive' => false,
'public' => false,
'show_ui' => true,
'show_in_rest' => false,
);
register_post_type('tlc_duck',$args);
}
function tlc_handle_shortcode()
{
ob_start();
$form_uri = $_SERVER['REQUEST_URI'];
?>
<form method=post action='<?=$form_uri?>'>
<input type=hidden name=action value=add_duck>
<input type=submit value="Add a duck">
</form>
<?php
$html = ob_get_contents();
ob_end_clean();
return $html;
}
function tlc_add_duck()
{
error_log("Add a duck");
$duck_args = array(
'post_content' => 'test duck',
'post_title' => 'ducky duck',
'post_type' => 'tlc_duck',
);
error_log(print_r($duck_args,true));
$post_id = wp_insert_post($duck_args,true);
error_log("added duck: $post_id");
$qargs = array(
'post_type' => 'tlc_duck',
);
$duck_posts = new WP_Query($qargs);
if($duck_posts->have_posts())
{
while($duck_posts->have_posts())
{
$duck = $duck_posts->the_post();
error_log(print_r($duck,true));
}
}
else
{
error_log("No ducks");
}
}
add_action('init','tlc_register_post_type');
add_shortcode('duck-posts','tlc_handle_shortcode');
$action = $_POST['action'] ?? "";
if( $action == 'add_duck')
{
error_log("Need to add a duck");
add_action('init','tlc_add_duck');
}
post_status
中的
publish
设置为
wp_insert_post()
,如下所示:
function tlc_add_duck()
{
error_log("Add a duck");
$duck_args = array(
'post_status' => 'publish',
'post_content' => 'test duck',
'post_title' => 'ducky duck',
'post_type' => 'tlc_duck',
);
$post_id = wp_insert_post($duck_args, true);
if ( is_wp_error( $post_id ) ) {
error_log($post_id);
}
$qargs = array(
'post_type' => 'tlc_duck',
);
$duck_posts = new WP_Query($qargs);
if($duck_posts->have_posts())
{
while($duck_posts->have_posts())
{
$duck = $duck_posts->the_post();
error_log(print_r($duck,true));
}
}
else
{
error_log("No ducks");
}
}