Вопрос или проблема
Я новичок в WordPress. Я добавил пользовательское поле в свою таксономию “Категория”. Пользовательское поле называется “custom_order”, и его цель — хранить число, чтобы мои категории можно было сортировать и отображать в порядке, который я выберу.
Моя проблема заключается в том, что я не могу отсортировать их; я могу отображать категории и выводить число “custom_order” для каждой категории, но, похоже, я что-то пропускаю, когда дело касается доступа и сортировки meta_value.
Не уверен, что я иду в правильном направлении.
Вот мой код для добавления поля на страницу ‘Новая категория’:
<?php
function taxonomy_add_new_meta_field()
{ ?>
<div class="form-field">
<label for="term_meta[custom_order]">Порядок</label>
<input type="number" name="term_meta[custom_order]" id="term_meta[custom_order]" value="">
<p class="description">Введите номер для упорядочивания</p>
</div>
<?php
}
add_action( 'category_add_form_fields', 'taxonomy_add_new_meta_field', 10, 2 );
?>
Вот мой код для добавления поля на страницу ‘Редактировать категорию’:
<?php
function taxonomy_edit_meta_field($term) {
$t_id = $term->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>
<tr class="form-field">
<th scope="row" valign="top"><label for="term_meta[custom_order]">Порядок</label></th>
<td>
<input type="number" name="term_meta[custom_order]" id="term_meta[custom_order]" value="<?php echo esc_attr( $term_meta['custom_order'] ) ? esc_attr( $term_meta['custom_order'] ) : ''; ?>">
<p class="description">Введите номер для упорядочивания</p>
</td>
</tr>
<?php
}
add_action( 'category_edit_form_fields', 'taxonomy_edit_meta_field', 10, 2);
?>
Вот мой код для сохранения содержимого поля:
<?php
function save_taxonomy_custom_meta( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
$t_id = $term_id;
$term_meta = get_option( "taxonomy_$t_id" );
$cat_keys = array_keys( $_POST['term_meta'] );
foreach ( $cat_keys as $key) {
if ( isset ( $_POST['term_meta'][$key] ) ) {
$term_meta[$key] = $_POST['term_meta'][$key];
}
}
update_option( "taxonomy_$t_id", $term_meta );
}
}
add_action( 'edited_category', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_category', 'save_taxonomy_custom_meta', 10, 2 );
Вышеуказанные фрагменты кода я нашел на этом сайте:
http://pippinsplugins.com/adding-custom-meta-fields-to-taxonomies/
Наконец, вот моя попытка отсортировать категории на основе этого поля:
$args = array(
'parent' => $category->cat_ID,
'hide_empty'=>0,
'exclude'=>'1',
'meta_key'=>'custom_order',
'orderby'=>'meta_value_num',
'order'=>'ASC'
);
$subcategories = get_categories($args);
Затем я перебираю массив $subcategories с помощью цикла foreach(). Я думал, что у меня все работает, пока не добавил третью подкатегорию; теперь я вижу, что он ставит ‘custom_order’ 1 на первое место, ‘custom_order’ 3 на второе, а ‘custom_order’ 2 на третье.
Может кто-нибудь мне помочь?
Я бы редактировал SQL базу данных напрямую, изменяя идентификаторы категорий в соответствии с моим желаемым порядком. Затем я бы использовал ‘orderby’=>’id’, чтобы сортировать.
Вы также можете добавить целое число в слаг (например, 1-рыба, 2-картошка, 3-соусы и т.д.) и сортировать по слагу, но тогда они будут отображаться на фронтенде.
Некоторые примеры обходных решений (возможно, потребуется немного модификации):
1-й способ:
$arguments= array('parent' => $categoryID);
$categories = get_categories( $arguments );
$subcategories=array();
foreach($categories as $each=>$value){
$subcategories[$value->CUSTOM_FIELD_NAME] = $value;
}
asort($subcategories);
foreach($subcategories as $each=>$value){
//делайте что хотите здесь
}
2-й способ:
$args = array(
'parent' => $category->cat_ID,
'hide_empty'=>0,
'exclude'=>'1',
'meta_key'=>'custom_order',
'orderby'=>'meta_value_num',
'order'=>'ASC'
);
$subcategories = get_categories($args);
Ответ или решение
Чтобы отсортировать и отобразить категории в WordPress, используя собственное поле «order», необходимо правильно настроить ваш код для работы с метаполями в таксономиях. Я вижу, что вы уже проделали большую работу, но давайте проясним некоторые моменты и убедимся, что вы выполняете все шаги корректно.
1. Добавление пользовательского поля для категорий
Ваш код для добавления пользовательских полей на странице создания и редактирования категории является верным. Вы используете функции add_action
для добавления полей в нужные формы. Убедитесь, что вы также правильно сохраняете значения мета-полей. Ваш код для сохранения данных выглядит правильно. Однако, важно удостовериться, что вы правильно получаете данные из поля $_POST
и правильно их обновляете.
2. Сохранение мета-данных
В вашем коде сохранения мета-данных используется update_option
, который может оказаться неподходящим для терминов таксономии. Вместо этого следует использовать update_term_meta
. Вот обновленный код:
function save_taxonomy_custom_meta( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
$term_meta = get_term_meta( $term_id, 'term_meta', true );
$cat_keys = array_keys( $_POST['term_meta']);
foreach ( $cat_keys as $key ) {
if( isset( $_POST['term_meta'][$key] ) ) {
$term_meta[$key] = $_POST['term_meta'][$key];
}
}
update_term_meta( $term_id, 'term_meta', $term_meta );
}
}
add_action( 'edited_category', 'save_taxonomy_custom_meta', 10, 2 );
add_action( 'create_category', 'save_taxonomy_custom_meta', 10, 2 );
3. Сортировка категорий по мета-значению
Ваш код для извлечения категорий уже содержит аргументы для сортировки по мета-значению custom_order
, но убедитесь, что вы используете правильное имя ключа метаданных. Ваш код для получения и сортировки подкатегорий выглядит следующим образом:
$args = array(
'parent' => $category->cat_ID,
'hide_empty' => 0,
'exclude' => '1',
'meta_key' => 'custom_order', // Убедитесь, что это правильный ключ
'orderby' => 'meta_value_num',
'order' => 'ASC'
);
$subcategories = get_categories($args);
Если у вас по-прежнему возникают проблемы с сортировкой, возможно, вам стоит вручную проверить значения метаполей для каждой категории, чтобы убедиться, что они установлены правильно.
4. Альтернативные подходы
Если после проверки вы все еще не видите желаемого результата, вы можете рассмотреть следующие альтернативные подходы для сортировки:
1. Использование массива для ручной сортировки:
Если стандартный метод не работает, вы можете сохранить ваши категории в ассоциативный массив и использовать функцию asort()
для их сортировки:
$subcategories = array();
foreach (get_categories($args) as $category) {
$subcategories[$category->term_id] = $category;
}
// Затем создаем массив для сортировки
$order_array = array();
foreach ($subcategories as $cat) {
$custom_order = get_term_meta($cat->term_id, 'term_meta', true)['custom_order'];
$order_array[$custom_order] = $cat;
}
ksort($order_array); // Сортировка по ключу (значению 'custom_order')
foreach ($order_array as $category) {
// Здесь выполняем отображение категорий
}
Заключение
С этими изменениями и подходами ваш код должен корректно сортировать категории по значению пользовательского поля custom_order
. Не забудьте проверить наличие ошибок в базе данных и убедиться, что значения мета-данных правильно установлены. Если у вас продолжат возникать проблемы, рассмотрите возможность использовать плагины для управления пользовательскими полями, которые могут упростить этот процесс.