使用 WordPress 自定义字段中的单选按钮有条件地在前端显示类别

问题描述 投票:0回答:1

我在类别编辑页面添加了一个带有单选选项的自定义字段。通过选择这些带有 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
}

让我把问题说得更清楚:

  1. 作为管理员,我想在类别编辑页面上选择“显示类别”单选按钮并更新类别。
  2. 我不想看到我用 我在我专门创建的选项卡菜单选项卡中的单选按钮 我的网站主页。
  3. 因为如果我列出选项卡菜单中列出的所有类别,我 在主页上创建时,菜单列表会很长。还有,我 不想在同一区域显示每个类别名称。

我的小说:

  1. 将带有单选按钮的自定义字段添加到编辑类别页面。

    • 我添加了自定义字段。
  2. 使用单选按钮进行选择(显示/不显示)并将其保存为所选内容。 - 这才是真正的问题。

  3. 类别标记为“不显示”;在前端列出类别时不要显示它。 - 类别已列出,没问题。然后我想我可以指定一个条件并有条件地再次列出它。如果我解决单选按钮问题,这部分会更容易。

事实上,它甚至可能是一个按钮。也就是说,如果勾选了,就应该显示,如果没有勾选,就不应该显示。在前端列出类别名称时,不应出现选中的类别,否则可能会出现相反的情况。结果是一样的。

作为单个单选按钮:

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>
wordpress radio-button categories
1个回答
0
投票

下面的代码片段已经过测试,应该适合您的需求。

flexRadioDefault

flexRadioDefault
subjects
自定义分类术语的属性。当管理员编辑
subjects
分类术语时,会为该特定分类术语的
wp_termmeta
数据库表中的 flexRadioDefault 分配一个值(0 或 1)(
flexRadioDefault
并且该术语在
wp_termmeta
中链接)表由
term_id
)。
flexRadioDefault
就是
meta_key
0
1
meta_value

subjects
尚未具有
flexRadioDefault
术语元键的分类术语将默认显示(即,就好像它们具有值为
1
的键一样)。

管理 term.php 编辑分类页面的更新

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
,用于获取选项卡菜单代码块中的自定义分类术语列表

查询搜索以下分类术语:

  1. 具有
    flexRadioDefault
    术语元键,其值为
    1
    (显示)
  2. 根本没有
    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'

© www.soinside.com 2019 - 2024. All rights reserved.