Я работаю над плагином сортировщика для WordPress, на котором установлен Redux Framework для управления параметрами каждого раздела. Плагин использует AJAX для получения идентификаторов всех разделов на главной странице веб-сайта, а затем передает эти значения в основной файл плагина для обработки в функции, которая хранит значения в метаданных текущего пользователя. Это работает хорошо, здесь нет проблем. Функция выглядит так:
add_action( 'wp_ajax_save_sections_ids', 'save_sections_ids_sorting_sections' );
function save_sections_ids_sorting_sections() {
//stuff here...
$user_ide = get_current_user_id(); //it works because it is inside a hook
update_user_meta($user_ide, "set-sections", $sections_ids);
die();
}
Затем я должен получить сохраненные значения в user_meta, чтобы передать их в поле Redux, поэтому я написал другую функцию в главном файле плагина. Функция такова:
function get_the_db_sections_ids() {
$user_ide = 1; //This should be get_current_user_id() or something similar, but nothing works, not even globalizing $current_user and using get_currentuserinfo();
$sections_ids = get_user_meta($user_ide, "set-sections", true);
$sorter_field = array(
"section_id" => "basic",
'id' => 'homepage-sections',
'type' => 'sorter',
'title' => 'Control de secciones',
'desc' => 'Arrastra y suelta los bloques con los nombres de las secciones, tanto para ordenarlas verticalmente como para desactivarlas o activarlas.',
'compiler' => 'true',
'options' => array(
'enabled' => array(
),
'disabled' => $sections_ids
),
);
return $sorter_field;
}
Как вы заметили в комментарии в функции выше, я пробовал несколько способов, а также require_once("/../../../wp-load.php")
, но ничего не происходит. Я старался do_action
а также add_actions
, чтобы создать ловушку, но они также используют глобальные переменные, и, насколько я понимаю, глобальные переменные не работают в функциях без ловушек в плагинах.
Но я еще не закончил. Действительно сложная часть заключается в том, что я вызываю экземпляр класса Redux внутри конфигурационного файла Redux (образец-config.php для демонстрации у меня есть пользовательский файл, но он такой же).
Экземпляр Redux::setField($opt_name, get_the_db_sections_ids());
Проблема в том, что ничего не печатается, если я вызываю это из функции или функции, связанной с вызовом AJAX.
Как видите, вторым параметром экземпляра является функция, которую я написал выше, и она отлично работает, если я установлю $user_ide
в 1
но я хочу хранить данные у всех админов user_meta
в случае, если пользователь 1
стирается, или как там.
Есть ли способ добиться того, чего я хочу, или хранить данные где-то еще и получать их оттуда. Я думал о создании пользовательской таблицы в БД и использовать wpdb
чтобы получить данные, но я думаю, что не могу использовать wpdb
либо потому, что это будет та же проблема.
У меня такое чувство, что мне не хватает чего-то очень простого, но я не могу этого понять. Пожалуйста помоги.
Это должно помочь вам
global $current_user;
get_currentuserinfo();
$user_ide = $current_user->ID;
Вы должны будете объявить глобальную переменную $ current_user, для того, чтобы использовать его.
Наконец я нашел решение своей проблемы. Как я уже сказал, я не смог бы получить текущий идентификатор пользователя из плагина, если попытался выйти за пределы ловушки действий или фильтра, настройки сеансов и глобальные переменные не работали, а функции, подключенные с помощью обычных ловушек WP, не устанавливали бы Редукс поле. Я просмотрел файл sample-config.php внутри ReduxFramework/sample
папку, и я обнаружил некоторые функции и зацепки. Один из них, чтобы установить весь раздел, но внутри этого раздела вы можете установить поле, и оно сработало.
Я поднял Redux::setField
и сделал это в основном файле плагина сортировщика:
add_filter('redux/options/' . $opt_name . '/sections', 'dynamic_section');
if ( ! function_exists( 'dynamic_section' ) ) {
function dynamic_section( $sections ) {
global $current_user;
get_currentuserinfo();
$sections[] = array(
'title' => __( 'Section via hook', 'redux-framework-demo' ),
'desc' => __( '<p class="description">This is a section created by adding a filter to the sections array. Can be used by child themes to add/remove sections from the options.</p>', 'redux-framework-demo' ),
'icon' => 'el el-paper-clip',
'fields' => array(get_the_db_sections_ids($current_user->ID))
);
return $sections;
}
} //I copied it from sample-config.php and added what's inside `"fields" =>` and the global.
Затем я изменил свою функцию массива следующим образом:
function get_the_db_sections_ids($user_ide) { //Added the parameter
//Erase $user_ide = 1;
$sections_ids = get_user_meta($user_ide, "set-sections", true);
$sorter_field = array(
"section_id" => "basic",
'id' => 'homepage-sections',
'type' => 'sorter',
'title' => 'Control de secciones',
'desc' => 'Arrastra y suelta los bloques con los nombres de las secciones, tanto para ordenarlas verticalmente como para desactivarlas o activarlas.',
'compiler' => 'true',
'options' => array(
'enabled' => array(
),
'disabled' => $sections_ids
),
);
return $sorter_field;
}
И все, надеюсь, это кому-нибудь поможет. Redux великолепен, но их документация очень далека от хорошей, так что вот один небольшой вклад для тех, кто использует фреймворк. И спасибо пользователям, которые пытались мне помочь.