我在类别编辑页面添加了一个带有单选选项的自定义字段。通过选择这些带有 2 个选项的单选按钮,我想确定相关类别是否会出现在前端的类别列表中。
我无法动态添加“选中”代码来将单选按钮保存为选定状态。我想干预我之前在前端列出的类别列表。根据这个选项,我想在前端的类别列表中指定一个条件,并相应地列出类别名称。我是 PHP 和 JavaScript 新手。与 PHP 相比,我是 Javascript 的新手。你能帮忙吗?
详细信息:我认为选择的单选按钮是用javascript或PHP记录的,前端应该调用查询中选择的单选按钮。保存类别时无法保留无线电标记。
add_action ( 'subjects_edit_form_fields', 'subjects_edit_tab_fields_callback', 10, 2 );
function subjects_edit_tab_fields_callback($tag, $taxonomy) {
$tab_id = $tag->term_id;
$cat_meta = get_option( "subjects_$tab_id");
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="tab_menu_select"><?php _e('option to show in category list'); ?></label></th>
<span class="description"><?php _e('Appear in the category list?'); ?></span>
<td>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="flexRadioDefault1" checked>
<label class="form-check-label" for="flexRadioDefault1">Show in Tab Menu</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="flexRadioDefault2">
<label class="form-check-label" for="flexRadioDefault2">Doesn't Show in Tab Menu</label>
</div>
</td>
</tr>
<?php
}
让我把问题说得更清楚:
我的小说:
将带有单选按钮的自定义字段添加到编辑类别页面。
使用单选按钮进行选择(显示/不显示)并将其保存为所选内容。 - 这才是真正的问题。
类别标记为“不显示”;在前端列出类别时不要显示它。 - 类别已列出,没问题。然后我想我可以指定一个条件并有条件地再次列出它。如果我解决单选按钮问题,这部分会更容易。
事实上,它甚至可能是一个按钮。也就是说,如果勾选了,就应该显示,如果没有勾选,就不应该显示。在前端列出类别名称时,不应出现选中的类别,否则可能会出现相反的情况。结果是一样的。
作为单个单选按钮:
add_action ( 'subjects_edit_form_fields', function( $tag ){
$radio_select = get_term_meta( $tag->term_id, 'tab_menu_select', true );
?>
<tr class='form-field'>
<th scope='row'><label for='tab_menu_select_list'><?php _e('Showing in tab menu'); ?></label></th>
<td>
<input type='checkbox' name='radio_select' id='radio_select' value='<?php echo $radio_select; ?>' <?php if ($_POST['radio_select'] == 'radio_select') echo 'checked'; ?>>
</td>
</tr> <?php
});
add_action ( 'edited_subjects', function( $term_id ) {
if ( isset( $_POST['radio_select'] ) )
update_term_meta( $term_id , 'tab_menu_select', $_POST['radio_select'] );
});
我的选项卡菜单代码块,我在其中列出前端中的类别:
<div class="container-fluid text-center my-5 px-md-5">
<div class="nav nav-tabs d-flex flex-column flex-md-row justify-content-center" id="nav-tab" role="tablist">
<?php $i = 0; ?>
<?php
$cats = get_terms([
'taxonomy' =>'subjects',
'hide_empty' =>false,
'orderby' =>'name',
'posts_per_page' => -1,
'order' =>'DESC']);
?>
<?php foreach($cats as $cat) { ?>
<?php $i++; ?>
<style>a.nav-link.active{background-color: #26ae61ba!important;color: #fff!important;border: none;}</style>
<a class="nav-link <?php echo ($i == 1) ? 'active': ''; ?>" id="nav-startup-tab" data-bs-toggle="tab" href="#<?php echo $cat->slug ?>" role="tab" aria-controls="nav-startup" aria-selected="true"> <?php echo esc_html( $cat->name ); ?></a>
<?php } ?>
</div>
<div class="tab-content" id="nav-tabContent">
<?php $i = 0; ?>
<?php foreach($cats as $cat){ ?>
<?php $i++; ?>
<?php
$args = array(
'post_type' => 'custompost',
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' =>array(
array('taxonomy' => 'subjects',
'field' =>'term_id',
'terms' =>$cat->term_id,
'operator' => 'IN'
),
),
); ?>
<div class="tab-pane <?php echo ($i == 1) ? 'active show': 'fade'; ?>" id="<?php echo $cat->slug ?>" role="tabpanel" aria-labelledby="nav-startup-tab">
<div class="row">
<?php
$the_query = new WP_Query($args);
if( $the_query->have_posts()){
while( $the_query->have_posts()): $the_query->the_post();
$imagepath = wp_get_attachment_image_src(get_post_thumbnail_id(),'large');
?>
<div class="col-md-3">
<img class="mt-4 mb-2" src="<?php echo $imagepath[0];?>" alt="Tab Menu Category Post Image">
<a href="<?php the_permalink(); ?>"><h6><?php the_title();?></h6></a>
</div>
<?php endwhile; } ?>
<?php wp_reset_postdata();?>
</div>
</div>
<?php } ?>
</div>
</div>
下面的代码片段已经过测试,应该适合您的需求。
flexRadioDefault
flexRadioDefault
是 subjects
自定义分类术语的属性。当管理员编辑 subjects
分类术语时,会为该特定分类术语的 wp_termmeta数据库表中的
flexRadioDefault
分配一个值(0 或 1)(flexRadioDefault
并且该术语在 wp_termmeta
中链接)表由term_id
)。 flexRadioDefault
就是meta_key
。 0
或 1
是 meta_value
。
subjects
尚未具有 flexRadioDefault
术语元键的分类术语将默认显示(即,就好像它们具有值为 1
的键一样)。
add_action( 'subjects_edit_form_fields', 'subjects_edit_tab_fields_callback', 10, 2 );
function subjects_edit_tab_fields_callback( $tag, $taxonomy ) {
$term_id = $tag->term_id;
// Check if the taxonomy term already has the term meta key 'flexRadioDefault'.
// If it doesn't, use '1' (show) as the default value.
$metadata_exists = metadata_exists( 'term', $term_id, 'flexRadioDefault' );
if ( $metadata_exists ) {
// @see {@link https://developer.wordpress.org/reference/functions/get_term_meta/}
// The third argument (a boolean) determines if the meta_value should be read as
// a single value (compared to being read as an array of values).
$flexRadioDefault = get_term_meta( $term_id, 'flexRadioDefault', true );
} else {
$flexRadioDefault = 1;
}
?>
<tr class="form-field">
<th scope="row" valign="top"><label for="tab_menu_select"><?php _e('option to show in category list'); ?></label></th>
<span class="description"><?php _e('Appear in the category list?'); ?></span>
<td>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="flexRadioDefault1" value="1" <?php checked( $flexRadioDefault, 1 ); ?>>
<label class="form-check-label" for="flexRadioDefault1">Show in Tab Menu</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name="flexRadioDefault" id="flexRadioDefault2" value="0" <?php checked( $flexRadioDefault, 0 ); ?>>
<label class="form-check-label" for="flexRadioDefault2">Doesn't Show in Tab Menu</label>
</div>
</td>
</tr>
<?php
}
add_action( 'edit_subjects', 'update_subject_status', 10, 3 );
function update_subject_status( $term_id, $tt_id, $args ) {
if ( ! isset( $args )
|| 'subjects' != $args['taxonomy']
|| ! isset( $args['term_id'] )
) {
return;
}
update_term_meta( $term_id, 'flexRadioDefault', $args['flexRadioDefault'] );
}
WP_Term_Query
,用于获取选项卡菜单代码块中的自定义分类术语列表查询搜索以下分类术语:
flexRadioDefault
术语元键,其值为 1
(显示)flexRadioDefault
术语元键(因为它们默认显示)。唯一要排除的分类术语是那些具有
flexRadioDefault
术语元键且值为 0
(隐藏)的分类术语。
$meta_args = array(
'relation' => 'OR',
array(
'key' => 'flexRadioDefault',
'value' => 1,
'type' => 'UNSIGNED',
'compare' => '='
),
array(
'key' => 'flexRadioDefault',
'compare' => 'NOT EXISTS'
)
);
$cats = get_terms(
array(
'taxonomy' => 'subjects',
'hide_empty' => false,
'number' => '',
'orderby' => 'name',
'order' => 'DESC',
'fields' => 'all',
'meta_query' => $meta_args
)
);
WP_Query
'operator' => 'IN'
tax_query
属性分配给数组时,应使用
terms
。您的 terms
属性被分配给一个整数。因此,应该删除 'operator' => 'IN'
。