Files
profile/inc/graphql.php
Profile Profile ed4d79b706 add files inc
2026-03-09 20:51:08 +03:00

363 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// Общая функция для получения соавторов
function get_coauthors_for_graphql($post_id) {
if (!function_exists('get_coauthors')) {
return [];
}
$coauthors = get_coauthors($post_id);
$users = [];
foreach ($coauthors as $coauthor) {
// Пропускаем если это основной автор (он уже в поле author)
// if ($coauthor->ID == $author_id) continue;
if (isset($coauthor->type) && $coauthor->type === 'guest-author') {
// Для гостевых авторов
$users[] = [
'__typename' => 'GuestAuthor',
'id' => $coauthor->user_nicename,
'name' => $coauthor->display_name,
'firstName' => $coauthor->first_name,
'lastName' => $coauthor->last_name,
'description' => $coauthor->description,
'avatar' => get_avatar_url($coauthor->user_email, ['size' => 96]),
'url' => get_author_posts_url($coauthor->ID, $coauthor->user_nicename),
'type' => 'guest-author'
];
} else {
// Для обычных пользователей
$user = get_user_by('id', $coauthor->ID);
if ($user) {
$avatar_url = '';
if (function_exists('get_avatar_url')) {
$avatar_url = get_avatar_url($user->ID, ['size' => 96]);
}
$users[] = [
'__typename' => 'User',
'id' => 'user-' . $user->ID,
'name' => $user->display_name,
'firstName' => $user->first_name,
'lastName' => $user->last_name,
'description' => $user->description,
'avatar' => $avatar_url,
'url' => get_author_posts_url($user->ID),
'databaseId' => $user->ID
];
}
}
}
return $users;
}
add_filter( 'register_post_type_args', function( $args, $post_type ) {
if ( 'profile_article' === $post_type ) {
$args['show_in_graphql'] = true;
$args['graphql_single_name'] = 'ProfileArticle';
$args['graphql_plural_name'] = 'ProfileArticles';
}
if ( 'anew' === $post_type ) {
$args['show_in_graphql'] = true;
$args['graphql_single_name'] = 'ANew'; // или 'Anew' - смотрите комментарий ниже
$args['graphql_plural_name'] = 'ANews'; // или 'Anews' - смотрите комментарий ниже
}
return $args;
}, 10, 2 );
//цвет меню
add_action('graphql_register_types', function() {
// Поле цвета для пунктов меню
register_graphql_field('MenuItem', 'menuItemColor', [
'type' => 'String',
'description' => __('Custom color for menu item', 'your-textdomain'),
'resolve' => function($menu_item) {
$color = get_post_meta($menu_item->databaseId, '_menu_item_color', true);
return !empty($color) ? $color : null;
}
]);
// Поле цвета для категорий
register_graphql_field( 'Category', 'color', [
'type' => 'String',
'description' => __( 'Background color class for category badge', 'your-textdomain' ),
'resolve' => function( $term ) {
$color = get_field( 'color', 'category_' . $term->term_id );
return ! empty( $color ) ? $color : 'bg-blue';
}
] );
// Соавторы
$post_types_with_coauthors = ['ProfileArticle', 'ANew']; // Исправлено: ANew
foreach ($post_types_with_coauthors as $post_type) {
register_graphql_field($post_type, 'coauthors', [
'type' => ['list_of' => 'User'],
'description' => sprintf(__('Co-authors of the %s', 'your-textdomain'), $post_type),
'resolve' => function($post_object) use ($post_type) {
$post_id = $post_object->databaseId;
return get_coauthors_for_graphql($post_id);
}
]);
}
});
//вторчиный заг
add_action('graphql_register_types', function() {
// Для ProfileArticle
register_graphql_field('ProfileArticle', 'secondaryTitle', [
'type' => 'String',
'description' => __('Secondary title from Secondary Title plugin', 'your-textdomain'),
'resolve' => function($post_object) {
$post_id = $post_object->databaseId;
// Прямое получение поля, которое использует плагин
$secondary_title = get_post_meta($post_id, 'secondary_post_title', true);
// Если пусто, проверяем через функцию плагина (если она существует)
if (empty($secondary_title) && function_exists('get_secondary_title')) {
$secondary_title = get_secondary_title($post_id);
}
return !empty($secondary_title) ? $secondary_title : null;
}
]);
// Для Anews
register_graphql_field('Anews', 'secondaryTitle', [
'type' => 'String',
'description' => __('Secondary title from Secondary Title plugin', 'your-textdomain'),
'resolve' => function($post_object) {
$post_id = $post_object->databaseId;
$secondary_title = get_post_meta($post_id, 'secondary_post_title', true);
if (empty($secondary_title) && function_exists('get_secondary_title')) {
$secondary_title = get_secondary_title($post_id);
}
return !empty($secondary_title) ? $secondary_title : null;
}
]);
});
/**
* Регистрация colonItem для ACF Checkbox
*/
add_action('graphql_register_types', function() {
// Регистрируем поле как Boolean
register_graphql_field('ProfileArticle', 'colonItem', [
'type' => 'Boolean',
'description' => 'Флаг поста колонки',
'resolve' => function($post) {
$value = get_field('colon_item', $post->ID);
// ACF Checkbox возвращает массив или false
// Если checkbox отмечен, get_field вернет массив: ['true']
// Если не отмечен - false или пустой массив
if (is_array($value) && in_array('true', $value)) {
return true;
}
return false;
}
]);
// Для типа Anew (если нужно)
register_graphql_field('Anew', 'colonItem', [
'type' => 'Boolean',
'description' => 'Флаг поста колонки',
'resolve' => function($post) {
$value = get_field('colon_item', $post->ID);
if (is_array($value) && in_array('true', $value)) {
return true;
}
return false;
}
]);
// Регистрируем where аргумент
register_graphql_field('RootQueryToProfileArticleConnectionWhereArgs', 'colonItemEquals', [
'type' => 'Boolean',
'description' => 'Фильтровать по полю colonItem',
]);
// Для Anew
register_graphql_field('RootQueryToAnewConnectionWhereArgs', 'colonItemEquals', [
'type' => 'Boolean',
'description' => 'Фильтровать по полю colonItem',
]);
});
/**
* Фильтрация для ACF Checkbox
*/
add_filter('graphql_post_object_connection_query_args', function($query_args, $source, $args, $context, $info) {
if (isset($args['where']['colonItemEquals'])) {
$colon_value = $args['where']['colonItemEquals'];
if (!isset($query_args['meta_query'])) {
$query_args['meta_query'] = [];
}
if ($colon_value === true) {
// Для ACF Checkbox используем LIKE с сериализованным значением
$query_args['meta_query'][] = [
'key' => 'colon_item',
'value' => '"true"', // Ищем "true" внутри сериализованного массива
'compare' => 'LIKE'
];
} else {
// Ищем посты без этого значения
$query_args['meta_query'][] = [
'relation' => 'OR',
[
'key' => 'colon_item',
'value' => '"true"',
'compare' => 'NOT LIKE'
],
[
'key' => 'colon_item',
'compare' => 'NOT EXISTS'
]
];
}
}
return $query_args;
}, 10, 5);
/**
* Добавление поддержки фильтрации по mainItem для ProfileArticle
*/
add_action('graphql_register_types', function() {
// Регистрируем ACF поле mainItem в GraphQL
register_graphql_field('ProfileArticle', 'mainItem', [
'type' => 'Boolean',
'description' => 'Флаг главного поста',
'resolve' => function($post) {
$value = get_field('main_item', $post->ID);
// ACF Checkbox возвращает массив или false
// Если checkbox отмечен, get_field вернет массив: ['true']
// Если не отмечен - false или пустой массив
if (is_array($value) && in_array('true', $value)) {
return true;
}
return false;
}
]);
// Регистрируем кастомный where аргумент для ProfileArticle
register_graphql_field('RootQueryToProfileArticleConnectionWhereArgs', 'mainItemEquals', [
'type' => 'Boolean',
'description' => 'Фильтровать статьи профиля по полю mainItem',
]);
});
/**
* Применяем фильтрацию через meta_query для mainItem
*/
add_filter('graphql_post_object_connection_query_args', function($query_args, $source, $args, $context, $info) {
// Проверяем наличие аргумента mainItemEquals
if (isset($args['where']['mainItemEquals'])) {
$main_value = $args['where']['mainItemEquals'];
if (!isset($query_args['meta_query'])) {
$query_args['meta_query'] = [];
}
if ($main_value === true) {
// Для ACF Checkbox используем LIKE с сериализованным значением
$query_args['meta_query'][] = [
'key' => 'main_item',
'value' => '"true"', // Ищем "true" внутри сериализованного массива
'compare' => 'LIKE'
];
} else {
// Ищем посты без этого значения
$query_args['meta_query'][] = [
'relation' => 'OR',
[
'key' => 'main_item',
'value' => '"true"',
'compare' => 'NOT LIKE'
],
[
'key' => 'main_item',
'compare' => 'NOT EXISTS'
]
];
}
}
return $query_args;
}, 10, 5);
// авторы
add_action('graphql_register_types', function() {
// Добавляем аргумент coauthorLogin
register_graphql_field('RootQueryToContentNodeConnectionWhereArgs', 'coauthorLogin', [
'type' => 'String',
'description' => __('Filter by coauthor login (nicename)', 'textdomain'),
]);
});
add_filter('graphql_post_object_connection_query_args', function($query_args, $source, $args, $context, $info) {
// Фильтр по логину
if (isset($args['where']['coauthorLogin']) && !empty($args['where']['coauthorLogin'])) {
$login = sanitize_user($args['where']['coauthorLogin']);
// Находим пользователя по логину
$user = get_user_by('login', $login);
if ($user) {
$query_args['author'] = $user->ID;
}
}
// Фильтр по имени (если нужен)
if (isset($args['where']['coauthorName']) && !empty($args['where']['coauthorName'])) {
$query_args['author_name'] = sanitize_title($args['where']['coauthorName']);
}
return $query_args;
}, 10, 5);