Despre Carbon Fields am scris atât pe blogul personal, cât și pe forum și am tot început să-l folosesc la diverse proiecte, având tot felul de provocări, care mai de care mai interesantă. Ultima? Să pot permite selectarea unei singure categorii pentru un anumit post. Soluția e foarte simplă și are câțiva pași simpli. Evident, în loc de category
se poate folosi și o taxonomie proprie.
<?php
use \Carbon_Fields\Container;
use \Carbon_Fields\Field;
add_action('after_setup_theme', function () {
// inițializăm Carbon Fields
\Carbon_Fields\Carbon_Fields::boot();
});
function getCurrentValue()
{
if (!is_admin()) {
// pentru că toate câmpurile sunt parsate și în frontend, nu facem interogările decât în admin
return [];
}
$currentPostID = absint($_GET['post'] ?? 0);
$mediumTerm = wp_list_pluck((array) get_the_terms($currentPostID, 'category'), 'term_id');
// în cazul în care postul are deja mai multe categorii setate, o întoarcem doar pe prima
return array_shift($mediumTerm);
}
function getAvailableOptions()
{
if (!is_admin()) {
return [];
}
$terms = get_terms([
'taxonomy' => 'category',
'hide_empty' => false,
]);
$parsedTerms[-1] = __('Select');
foreach ($terms as $term) {
// generăm un array de forma "id" => "Nume", pentru a-l putea afișa în select
$parsedTerms[$term->term_id] = $term->name;
}
return $parsedTerms;
}
add_action('carbon_fields_register_fields', function () {
Container::make('post_meta', __('My Category'))
->where('post_type', '=', 'post')
->add_fields([
Field::make('select', 'my_category', __('Category'))
->add_options(getAvailableOptions())
->set_required(true),
]);
});
add_action('carbon_fields_post_meta_container_saved', function ($postID) {
$term = absint(carbon_get_the_post_meta('my_category'));
if (!empty($term)) {
wp_set_post_terms($postID, [$term], 'category', false);
// https://developer.wordpress.org/reference/functions/wp_set_post_terms/
// salvăm toată povestea
// al patrulea argument, `false` poate fi setat ca `true` dacă se dorește
// adăugarea mai multor categorii
}
});
add_filter('register_taxonomy_args', function ($args, $taxonomy) {
if ($taxonomy === 'category') {
// ascundem selectorul de categorie
$args['meta_box_cb'] = false;
}
return $args;
}, 10, 3);
Lasă un răspuns