想知道你是否对这个问题有一些想法。我在谷歌上搜索了好几天,但都没找到答案。
我现在的处境是:
我有一个用于Woocommerce帖子类型“products”的元框。在元盒子里有一个\'type\' = > \'select\'
我想用所有可用\'taxonomy\' = > \'product_cat\'
.
我可以使用选择框来填充和使用标准的帖子类别,\'taxonomy\' = > \'category\'
使用以下代码:
function product_cats() {
$options = array();
$categories = get_terms( array( \'taxonomy\' => \'category\' ) );
foreach( $categories as $category ) {
$options[$category->term_id] = array(
\'label\' => $category->name,
\'value\' => $category->slug
);
}
// return array(\'options\'=>$options);
return $options;
}
当我尝试使用
‘taxonomy\' = > ‘product_cat’
或任何其他自定义分类法。
我认为问题是我试图在注册自定义分类法之前访问它,所以我在函数中交换了一些声明/调用。php文件(调用CPT、元框和woocommece的文件)可能会改变事物运行的顺序,但运气不佳。
但是,根据下面的问答,我现在可以确认该函数可以跨分类“查看”并显示所有术语。如果我排除\'taxonomy =>
它从参数中跨自定义帖子类型和分类返回术语。
理想情况下,基本功能应为:
function product_cats() {
$options = array();
$categories = get_terms( array( \'taxonomy\' => \'product_cat\' ) );
foreach( $categories as $category ) {
$options[$category->term_id] = array(
\'label\' => $category->name,
\'value\' => $category->slug
);
}
// return array(\'options\'=>$options);
return $options;
}
只是想知道你有什么大致的想法?我知道没有看到整个代码库是很困难的,但我认为这值得一问。
Wordpress版本4.7.2
Woocommerce版本2.6.14
UPDATE:
慢慢地,我试图找出我的问题。
看来\'product_cat\'
毕竟可以访问(很好),但它吐出的数组显示不正确。
这让我很困惑,好像我只是使用get_terms()
无任何参数,或指定\'taxonomy\' => \'category\'
上面的代码可以完美地工作
我需要处理的其他代码包括:
要将选项列表转储到的数组
array(
\'label\'=> \'Collections\',
\'desc\' => \'Select the collection you would like to display\',
\'id\' => $prefix.\'collection\',
\'type\' => \'select\',
\'options\' => product_cats()
),
生成选择列表的代码(用于其他元字段)
// select
case \'select\':
echo \'<select name="\'.$field[\'id\'].\'" id="\'.$field[\'id\'].\'">\';
foreach ($field[\'options\'] as $option) {
echo \'<option\', $meta == $option[\'value\'] ? \' selected="selected"\' : \'\', \' value="\'.$option[\'value\'].\'">\'.$option[\'label\'].\'</option>\';
}
echo \'</select><br /><span class="description">\'.$field[\'desc\'].\'</span>\';
break;
我没有任何其他元字段的工作或显示问题,包括选择列表。
我不想重写整个元框及其所有字段,所以我正在尝试使用我目前拥有的内容。
SO网友:Dave Romsey
下面是一个显示产品类别选择框的元框的完整工作示例。meta框将显示在product post类型上。
add_action( \'add_meta_boxes\', \'wpse256897_add_meta_box\' );
add_action( \'save_post\', \'wpse256897_save\' );
/**
* Adds the meta box container.
*/
function wpse256897_add_meta_box( $post_type ) {
// Limit meta box to certain post types.
$post_types = array( \'product\' );
if ( in_array( $post_type, $post_types ) ) {
add_meta_box(
\'product_cat_selection\',
__( \'Product Category Selection\', \'textdomain\' ),
\'wpse256897_render_meta_box_content\',
$post_type,
\'advanced\',
\'high\'
);
}
}
/**
* Save the meta when the post is saved.
*
* @param int $post_id The ID of the post being saved.
*/
function wpse256897_save( $post_id ) {
/*
* We need to verify this came from the our screen and with proper authorization,
* because save_post can be triggered at other times.
*/
// Check if our nonce is set.
if ( ! isset( $_POST[\'myplugin_inner_custom_box_nonce\'] ) ) {
return $post_id;
}
$nonce = $_POST[\'myplugin_inner_custom_box_nonce\'];
// Verify that the nonce is valid.
if ( ! wp_verify_nonce( $nonce, \'myplugin_inner_custom_box\' ) ) {
return $post_id;
}
/*
* If this is an autosave, our form has not been submitted,
* so we don\'t want to do anything.
*/
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
return $post_id;
}
// Check the user\'s permissions.
if ( \'page\' == $_POST[\'post_type\'] ) {
if ( ! current_user_can( \'edit_page\', $post_id ) ) {
return $post_id;
}
} else {
if ( ! current_user_can( \'edit_post\', $post_id ) ) {
return $post_id;
}
}
/* OK, it\'s safe for us to save the data now. */
// Sanitize the user input.
$mydata = sanitize_text_field( $_POST[\'product_cat_selection\'] );
// Update the meta field.
update_post_meta( $post_id, \'_product_cat_selection\', $mydata );
}
/**
* Render Meta Box content.
*
* @param WP_Post $post The post object.
*/
function wpse256897_render_meta_box_content( $post ) {
// Add an nonce field so we can check for it later.
wp_nonce_field( \'myplugin_inner_custom_box\', \'myplugin_inner_custom_box_nonce\' );
// Use get_post_meta to retrieve an existing value from the database.
$current_product_cat = get_post_meta( $post->ID, \'_product_cat_selection\', true );
// Display the form, using the current value.
$product_cats = wpse256897_product_cats();
if ( !empty ( $product_cats ) ) {
echo \'<select name="product_cat_selection" id="product_cat_selection">\';
foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>
<option value="<?php echo esc_attr( $product_cat[\'value\'] ); ?>" <?php if ( isset ( $current_product_cat ) ) selected( $current_product_cat, $product_cat[\'value\'] ); ?>><?php echo esc_html( $product_cat[\'label\'] ); ?></option><?php
}
echo \'</select>\';
}
}
function wpse256897_product_cats() {
$options = array();
$categories = get_terms( array( \'taxonomy\' => \'product_cat\' ) );
foreach( $categories as $category ) {
$options[$category->term_id] = array(
\'label\' => $category->name,
\'value\' => $category->slug
);
}
return $options;
}
这不是最优雅的例子(命名约定可能更好)。它很快根据
Add Meta Box reference page, 但它确实证明了这一点
wpse256897_product_cats()
获取产品类别,并且可以将其保存并显示在元框中产品页面的选择框中。
我还想补充一点,也许值得看看wp_dropdown_categories()
作用尽管名称不同,它也适用于自定义分类法。这将避免您创建自己的类别下拉标记。
Update:听起来像是product_cats()
函数未与元盒实现同步。请注意,在上面的示例中,我在为select元素生成选项时使用了这一行来循环类别:
foreach ( $product_cats as $product_cat_id => $product_cat ) { ?>
这是因为
$product_cats
是类别ID的关联数组,每个类别ID包含另一个包含
label
和
slug
对于每个类别id。
看起来您可能会使用product_cats()
它以与metabox代码兼容的方式格式化返回值$选项:
function product_cats_alternate() {
$options = array();
$categories = get_terms( array( \'taxonomy\' => \'product_cat\' ) );
foreach( $categories as $category ) {
$options[] = array(
\'label\' => $category->name,
\'value\' => $category->slug
);
}
return $options;
}