你的逻辑有点缺陷-你跑isset
检查字段,如title
和description
, 但如果未设置,则不要停止后期插入。
您还可以不检查post_tags
索引将永远不存在,因为wp_dropdown_categories
将使用字段名cat
除非你把它设成别的。
更不用说了tags_input
专门用于分类post_tag
, 因此,即使其他一切都在发挥作用,这些条款也永远不会得到适当的分配。
让我们重构并使用PHP filter AP当我们这样做的时候:
<?php
if ( \'POST\' === $_SERVER[\'REQUEST_METHOD\'] && filter_input( INPUT_POST, \'action\' ) === \'new_post\' ) {
$errors = [];
$title = filter_input( INPUT_POST, \'title\', FILTER_SANITIZE_STRING );
$description = filter_input( INPUT_POST, \'description\', FILTER_SANITIZE_STRING );
if ( ! $title ) {
$errors[] = \'Please enter a title\';
}
if ( ! $description ) {
$errors[] = \'Please enter a description\';
}
if ( ! $errors ) {
$new_post_id = wp_insert_post([
\'post_title\' => $title,
\'post_content\' => $description,
\'post_status\' => \'draft\',
\'post_type\' => \'books\',
]);
if ( ! $new_post_id ) {
$errors[] = \'Oops, something went wrong\';
} else {
/**
* Loop over taxonomies and attempt to set post terms.
*/
foreach ([
\'books-categories\',
\'location\',
\'services_c\',
] as $post_taxonomy ) {
// Field name is the format "{taxonomy}_term_id"
if ( $term_id = ( int ) filter_input( INPUT_POST, "{$post_taxonomy}_term_id" ) ) {
wp_set_object_terms( $new_post_id, $term_id, $post_taxonomy );
}
}
}
}
foreach ( $errors as $error ) {
echo "$error<br />";
}
}
现在我们只需要设置正确的输入
name
对于每个分类法下拉列表,我都使用了
{taxonomy}_term_id
为了避免混淆WordPress(如果您只使用分类名称作为输入,它可能会与
query_var
对于上述分类法)。
wp_dropdown_categories( \'name=books-categories_term_id&show_option_none=Category&tab_index=4&taxonomy=books-categories\' );
对其他人也这样做,你应该很乐意去做。