我的目标是在插件中提取项目中的所有post/pages/custom post类型,如果不存在,则创建一个自定义分类法。每当插件进入if语句时,php就会停止在页面上运行。正如您在foreach语句中看到的,我回显post类型名和与之相关的分类法。
如果分类法不存在,我只想在公共可用的post类型上创建自定义分类法。
只要用正确的post类型替换变量,我就可以运行functions.php文件中if语句中的分类代码。
我还尝试不使用add_action('init','custom_taxo_cpt_taxonomy',1);只需直接通过与add_action('init','custom_taxo_cpt_taxonomy',1'相同的行上的custom_taxo_cpt_taxonomy()调用函数;
Echos/Var_转储可以在页面上无问题地为我提供相关的post类型和分类,所以我知道在页面上这是很好的。
<?php
$args = array(
'public' => true,
);
$output = 'names';
$operator = 'and';
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
$cpt_taxo_ar = get_object_taxonomies($post_type);
$cpt_taxo_ar = array_shift($cpt_taxo_ar);
echo '<p>' . $post_type . ' category: ' . $cpt_taxo_ar . '</p>';
if($cpt_taxo_ar != $post_type . '_custom_taxo'){
echo $post_type . '_custom_taxo';
// Register CustomTaxo Tags Taxonomy
function custom_taxo_cpt_taxonomy() {
$labels = array(
'name' => _x( 'CustomTaxo Tags', 'CustomTaxo Tags', 'custom_taxo_domain' ),
'singular_name' => _x( 'CustomTaxo Tag', 'CustomTaxo Tag', 'custom_taxo_domain' ),
'menu_name' => __( 'CustomTaxo Tags', 'custom_taxo_domain' ),
'all_items' => __( 'All Tags', 'custom_taxo_domain' ),
'parent_item' => __( 'Parent Tag', 'custom_taxo_domain' ),
'parent_item_colon' => __( 'Parent Tag:', 'custom_taxo_domain' ),
'new_item_name' => __( 'New Tag Name', 'custom_taxo_domain' ),
'add_new_item' => __( 'Add New Tag', 'custom_taxo_domain' ),
'edit_item' => __( 'Edit Tag', 'custom_taxo_domain' ),
'update_item' => __( 'Update Tag', 'custom_taxo_domain' ),
'view_item' => __( 'View Tag', 'custom_taxo_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'custom_taxo_domain' ),
'add_or_remove_items' => __( 'Add or remove tags', 'custom_taxo_domain' ),
'choose_from_most_used' => __( 'Choose from the most used', 'custom_taxo_domain' ),
'popular_items' => __( 'Popular tags', 'custom_taxo_domain' ),
'search_items' => __( 'Search tags', 'custom_taxo_domain' ),
'not_found' => __( 'Not Found', 'custom_taxo_domain' ),
'no_terms' => __( 'No items', 'custom_taxo_domain' ),
'items_list' => __( 'Tags list', 'custom_taxo_domain' ),
'items_list_navigation' => __( 'Tags list navigation', 'custom_taxo_domain' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
);
register_taxonomy( $post_type . '_custom_taxo', 'page', $args );
} // end taxo function
add_action( 'init', 'custom_taxo_cpt_taxonomy', 1 );
} //end for loop
}
?>
最佳答案
根据文件:
add_action( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 )`
要解决此问题:
"Cannot redeclare custom_taxo_cpt_taxonomy()"
custom_taxo_cpt_taxonomy
必须callable
所以在循环中,为了避免名称声明问题,可以使用匿名函数,如下所示:$custom_taxo_cpt_taxonomy = function() { ... }
最后,anonymous不起作用,因为wordpress在class-wp-hook中使用
call_user_func_array
而不是像apply_filters
这样的东西。编辑:函数在循环外不是匿名的
<?php
function custom_taxo_cpt_taxonomy($params) {
register_taxonomy( $params['post_type'] . '_custom_taxo', 'page', $params['args'] );
} // end taxo function
foreach ( $post_types as $post_type ) {
$cpt_taxo_ar = get_object_taxonomies($post_type);
$cpt_taxo_ar = array_shift($cpt_taxo_ar);
echo '<p>' . $post_type . ' category: ' . $cpt_taxo_ar . '</p>';
if($cpt_taxo_ar != $post_type . '_custom_taxo'){
echo $post_type . '_custom_taxo';
// Register CustomTaxo Tags Taxonomy
// function custom_taxo_cpt_taxonomy() { <= issue here
// $custom_taxo_cpt_taxonomy = function() { <= other issue
$labels = array(
'name' => _x( 'CustomTaxo Tags', 'CustomTaxo Tags', 'custom_taxo_domain' ),
'singular_name' => _x( 'CustomTaxo Tag', 'CustomTaxo Tag', 'custom_taxo_domain' ),
'menu_name' => __( 'CustomTaxo Tags', 'custom_taxo_domain' ),
'all_items' => __( 'All Tags', 'custom_taxo_domain' ),
'parent_item' => __( 'Parent Tag', 'custom_taxo_domain' ),
'parent_item_colon' => __( 'Parent Tag:', 'custom_taxo_domain' ),
'new_item_name' => __( 'New Tag Name', 'custom_taxo_domain' ),
'add_new_item' => __( 'Add New Tag', 'custom_taxo_domain' ),
'edit_item' => __( 'Edit Tag', 'custom_taxo_domain' ),
'update_item' => __( 'Update Tag', 'custom_taxo_domain' ),
'view_item' => __( 'View Tag', 'custom_taxo_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'custom_taxo_domain' ),
'add_or_remove_items' => __( 'Add or remove tags', 'custom_taxo_domain' ),
'choose_from_most_used' => __( 'Choose from the most used', 'custom_taxo_domain' ),
'popular_items' => __( 'Popular tags', 'custom_taxo_domain' ),
'search_items' => __( 'Search tags', 'custom_taxo_domain' ),
'not_found' => __( 'Not Found', 'custom_taxo_domain' ),
'no_terms' => __( 'No items', 'custom_taxo_domain' ),
'items_list' => __( 'Tags list', 'custom_taxo_domain' ),
'items_list_navigation' => __( 'Tags list navigation', 'custom_taxo_domain' )
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_admin_column' => true
);
$params = array(
'post_type' => $post_type,
'args' => $args
);
// Pass callable not anonymous function
add_action( 'init', array('custom_taxo_cpt_taxonomy', $params), 1);
} //end for loop
}
?>
编辑:重要
所以下面的代码不起作用:
$myCallback();
<?php
$args = array(
'public' => true
);
$output = 'names';
$operator = 'and';
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
$cpt_taxo_ar = get_object_taxonomies($post_type);
$cpt_taxo_ar = array_shift($cpt_taxo_ar);
echo '<p>' . $post_type . ' category: ' . $cpt_taxo_ar . '</p>';
if($cpt_taxo_ar != $post_type . '_custom_taxo'){
echo $post_type . '_custom_taxo';
// Register CustomTaxo Tags Taxonomy
// function custom_taxo_cpt_taxonomy() { <= issue here
// Create anonymous function
$custom_taxo_cpt_taxonomy = function() {
$labels = array(
'name' => _x( 'CustomTaxo Tags', 'CustomTaxo Tags', 'custom_taxo_domain' ),
'singular_name' => _x( 'CustomTaxo Tag', 'CustomTaxo Tag', 'custom_taxo_domain' ),
'menu_name' => __( 'CustomTaxo Tags', 'custom_taxo_domain' ),
'all_items' => __( 'All Tags', 'custom_taxo_domain' ),
'parent_item' => __( 'Parent Tag', 'custom_taxo_domain' ),
'parent_item_colon' => __( 'Parent Tag:', 'custom_taxo_domain' ),
'new_item_name' => __( 'New Tag Name', 'custom_taxo_domain' ),
'add_new_item' => __( 'Add New Tag', 'custom_taxo_domain' ),
'edit_item' => __( 'Edit Tag', 'custom_taxo_domain' ),
'update_item' => __( 'Update Tag', 'custom_taxo_domain' ),
'view_item' => __( 'View Tag', 'custom_taxo_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'custom_taxo_domain' ),
'add_or_remove_items' => __( 'Add or remove tags', 'custom_taxo_domain' ),
'choose_from_most_used' => __( 'Choose from the most used', 'custom_taxo_domain' ),
'popular_items' => __( 'Popular tags', 'custom_taxo_domain' ),
'search_items' => __( 'Search tags', 'custom_taxo_domain' ),
'not_found' => __( 'Not Found', 'custom_taxo_domain' ),
'no_terms' => __( 'No items', 'custom_taxo_domain' ),
'items_list' => __( 'Tags list', 'custom_taxo_domain' ),
'items_list_navigation' => __( 'Tags list navigation', 'custom_taxo_domain' )
);
$args = array(
'labels' => $labels,
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_admin_column' => true
);
register_taxonomy( $post_type . '_custom_taxo', 'page', $args );
} // end taxo function
// Pass callable anonymous function
add_action( 'init', $custom_taxo_cpt_taxonomy, 1 );
} //end for loop
}
?>
syntax error, unexpected 'add_action' (T_STRING).
在数组末尾创建一个额外的空字段。关于php - WordPress-无法在条件语句中创建分类法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56486160/