__('Generate based on article', 'ai-copilot-content-generator'), ); $fields['title']['modes_tooltip'] = __('This setting determines how the article title will be generated.', 'ai-copilot-content-generator'); $fields['title']['required'] = false; $fields['image']['modes'] =array( 'generate' => __('Generate a new featured image', 'ai-copilot-content-generator'), 'no' => __('Do not generate', 'ai-copilot-content-generator'), ); $fields['categories']['append'] = 1; $fields['tags']['append'] = 1; $fields['image']['modes_tooltip'] = __('Enable to generate a new Featured Image, replacing the existing one.', 'ai-copilot-content-generator'); unset($fields['body'], $fields['date']); return $fields; } public function searchPostsList( $params ) { $length = WaicUtils::getArrayValue($params, 'length', 10, 1); $start = WaicUtils::getArrayValue($params, 'start', 0, 1); //$search = WaicUtils::getArrayValue(WaicUtils::getArrayValue($params, 'search', array(), 2), 'value'); /*if (!empty($search)) { $model->addWhere(array('additionalCondition' => "title like '%" . $search . "%'")); }*/ $order = WaicUtils::getArrayValue($params, 'order', array(), 2); $orderBy = 0; $sortOrder = 'DESC'; $orders = array('id', 'id', 'title', 'feature', 'cnt', 'status', 'created', 'author'); if (isset($order[0])) { $orderBy = WaicUtils::getArrayValue($order[0], 'column', $orderBy, 1); $sortOrder = WaicUtils::getArrayValue($order[0], 'dir', $sortOrder); } // Get total pages count for current request $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'ignore_sticky_posts' => true, 'posts_per_page' => $length, 'offset' => $start, 'tax_query' => array(), ); $title = WaicUtils::getArrayValue($params, 'filter_title'); if (!empty($title)) { $args['waic_post_title'] = $title; add_filter('posts_where', array($this, 'addSearchByTitle'), 10, 2 ); } $categories = WaicUtils::getArrayValue($params, 'filter_categories', array(), 2); if (!empty($categories)) { $args['tax_query'][] = array( 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => $categories, 'operator' => 'IN', 'include_children' => false, ); } $tags = WaicUtils::getArrayValue($params, 'filter_tags', array(), 2); if (!empty($tags)) { $args['tax_query'][] = array( 'taxonomy' => 'post_tag', 'field' => 'term_id', 'terms' => $tags, 'operator' => 'IN', 'include_children' => false, ); } if (!empty($args['tax_query'])) { $args['tax_query']['relation'] = 'AND'; } //category__in $result = new WP_Query($args); //var_dump($result); $totalCount = 0; $rows = array(); if ($result->have_posts() ) { $totalCount = $result->found_posts; foreach ($result->posts as $post) { $id = $post->ID; $authorId = $post->post_author; $rows[] = array( '', '' . esc_html($post->post_title) . '', $this->getTaxonomyTermsList($id, 'category'), $this->getTaxonomyTermsList($id, 'post_tag'), get_the_author_meta( 'display_name' , $authorId ), esc_html($post->post_date), ); } } wp_reset_postdata(); return array( 'data' => $rows, 'total' => $totalCount, ); } public function getTaxonomyTermsList( $postId, $taxonomy ) { $list = ''; $terms = get_the_terms( $postId, $taxonomy ); if ( ! empty( $terms ) ) { foreach ( $terms as $term ) { $list .= $term->name . ', '; } $list = substr($list, 0, -2); } return $list; } public function addSearchByTitle( $where, $wp_query ) { global $wpdb; if (!empty($wp_query->get( 'waic_post_title' ))) { $like = '%' . $wpdb->esc_like($wp_query->get('waic_post_title')) . '%'; $where .= $wpdb->prepare(" AND {$wpdb->posts}.post_title LIKE %s", $like); } return $where; } public function convertTaskParameters( $params, $toDB = true ) { $params['common']['mode'] = 'bulk'; if ($toDB && isset($params['posts'])) { $params['posts'] = json_decode(stripslashes($params['posts'])); } return $params; } public function controlTaskParameters( $params, &$error = '' ) { $e = __('Not all required fields are specified', 'ai-copilot-content-generator'); if (empty($params['posts'])) { $error = $e . ': ' . __('Select posts', 'ai-copilot-content-generator'); return false; } if (empty($params['fields'])) { $error = $e . ': ' . __('Select acticle fields', 'ai-copilot-content-generator'); return false; } if (isset($params['fields']) && isset($params['fields']['custom']) && is_array($params['fields']['custom'])) { foreach ($params['fields']['custom'] as $field => $data) { if (WaicUtils::getArrayValue($data, 'mode') == 'generate' && empty($data['prompt'])) { $error = $e . ': ' . __('Description for custom field', 'ai-copilot-content-generator') . ' ' . $field; return false; } } } return empty($error); } /*public function addTaskColumns( $columns, $params ) { $rss = WaicUtils::getArrayValue($params, 'rss', array(), 2); $cycle = 0; if (!empty($rss)) { if (WaicReq::getVar('typ', 'post') == 'save') { $columns['status'] = 8; } else { $mode = WaicUtils::getArrayValue($rss, 'mode', ''); if ('one' != $mode) { $cycle = WaicUtils::getArrayValue($rss, 'frequency', 0, 1) * 60; } } } $columns['cycle'] = $cycle; return $columns; } public function activedSchedule( $taskId, $isOn) { $taskId = (int) $taskId; if (empty($taskId)) { return true; } $model = WaicFrame::_()->getModule('workspace')->getModel('tasks'); $task = $model->getTask($taskId); if (!empty($task)) { $cycle = 0; if ($isOn) { $params = WaicUtils::getArrayValue($task, 'params', array(), 2); if (empty($params)) { return true; } $rss = WaicUtils::getArrayValue($params, 'rss', array(), 2); $mode = WaicUtils::getArrayValue($rss, 'mode'); if ('one' != $mode) { $cycle = WaicUtils::getArrayValue($rss, 'frequency', 0, 1) * 60; } } $status = $task['status']; if (empty($cycle)) { if (5 == $status) { $status = $this->isAllPublished($taskId) ? 4 : 3; } } else if ( 3 == $status || 4 == $status ) { $status = 5; } $model->updateById(array('cycle' => $cycle, 'status' => $status), $taskId); } }*/ public function getBulkResultsList( $params, $param = false ) { $taskId = WaicUtils::getArrayValue($params, 'task_id', 0, 1); $length = WaicUtils::getArrayValue($params, 'length', 10, 1); $start = WaicUtils::getArrayValue($params, 'start', 0, 1); $orderBy = 'id'; $sortOrder = 'ASC'; $model = WaicFrame::_()->getModule('postscreate')->getModel(); $model->setWhere(array('task_id' => $taskId)); // Get total pages count for current request $totalCount = $model->getCount(array('clear' => array('selectFields'))); if ($length > 0) { if ($start >= $totalCount) { $start = 0; } $this->setLimit($start . ', ' . $length); } $model->setOrderBy($orderBy)->setSortOrder($sortOrder); $data = $model->getFromTbl(); if (empty($data)) { $data = array(); } else { $frame = WaicFrame::_(); $data = $this->prepareBulkResultsForTbl($data); } return array( 'data' => $data, 'total' => $totalCount, ); } public function prepareBulkResultsForTbl( $posts ) { $rows = array(); $loading = esc_html__('Loading...', 'ai-copilot-content-generator'); $error = esc_html__('Error', 'ai-copilot-content-generator'); $preview = esc_html__('preview', 'ai-copilot-content-generator'); $view = esc_html__('view', 'ai-copilot-content-generator'); $model = WaicFrame::_()->getModule('postscreate')->getModel(); $statuses = $model->getStatuses(); foreach ($posts as $post) { $id = $post['id']; $status = $post['status']; $newId = $post['post_id']; $params = WaicUtils::jsonDecode($post['params']); $results = WaicUtils::jsonDecode($post['results']); //$title = WaicUtils::getArrayValue($results, 'title'); $postId = WaicUtils::getArrayValue($params, 'post_id'); $postObj = get_post($postId); if (!$postObj) { continue; } $rows[] = array( '', '' . esc_html($postObj->post_title) . '', '' . $preview . '', empty($statuses[$status]) ? '' : $statuses[$status], empty($newId) ? '' : '' . esc_html($view) . '', ); } return $rows; } /*public function getSocialPost( $taskId, $postId, $social ) { $postData = WaicFrame::_()->getModule('postscreate')->getModel()->getTaskResults($taskId, $postId); if (empty($postData)) { WaicFrame::_()->pushError(esc_html__('Post not found', 'ai-copilot-content-generator')); return false; } if (empty($postData['post_id'])) { WaicFrame::_()->pushError(esc_html__('Article is not published', 'ai-copilot-content-generator')); return false; } $postUrl = get_post_permalink($postData['post_id']); $result = WaicUtils::getArrayValue($postData['results'], $social, array(), 2); if (empty($result) || ( WaicUtils::getArrayValue($result, 's', 0, 1) != 1 ) || empty(WaicUtils::getArrayValue($result, 'r'))) { WaicFrame::_()->pushError(esc_html__('Social post is not renerated', 'ai-copilot-content-generator')); return false; } $text = str_replace("\n", '
', WaicUtils::getArrayValue($result, 'r')); if ($postUrl) { //$text = str_replace('{article_url}', '' . esc_html__('link', 'ai-copilot-content-generator') . '', $text); $text = str_replace('{article_url}', $postUrl, $text); } return $text; }*/ public function clearEtaps( $taskId, $ids = false, $withContent = true ) { $taskId = (int) $taskId; $model = WaicFrame::_()->getModule('postscreate')->getModel(); if ($withContent) { //$model->unpublishEtaps($taskId, $ids); $model->deleteImages($taskId, $ids); } if (empty($ids)) { $model->delete(array('task_id' => $taskId)); } else { $model->removeGroup($ids); } return true; } public function cancelTaskEtaps( $taskId, $ids ) { $taskId = (int) $taskId; if (empty($taskId) || !is_array($ids)) { return true; } $workspace = WaicFrame::_()->getModule('workspace'); $tasksModel = $workspace->getModel('tasks'); $task = $tasksModel->getById($taskId); if (!empty($task)) { $model = WaicFrame::_()->getModule('postscreate')->getModel(); foreach ($ids as $id) { $model->updateById(array('post_id' => 0, 'status' => 9, 'pub_mode' => 0), $id); } $task = $workspace->getModel()->controlSteps($task, $model); } return true; } public function prepareGeneration( $task ) { $params = WaicUtils::getArrayValue($task, 'params', array(), 2); if (empty($params)) { WaicFrame::_()->pushError(esc_html__('Tasks parameters empty', 'ai-copilot-content-generator')); return false; } $taskId = $task['id']; $common = WaicUtils::getArrayValue($params, 'common', array(), 2); $fields = WaicUtils::getArrayValue($params, 'fields', array(), 2); $topics = array(); $vars = array(); if (!empty($fields['title']) && is_array($fields['title'])) { $vars['prompt_title'] = 'title_body'; } $vars['pub_mode'] = ( 'now' == WaicUtils::getArrayValue($common, 'publish') ? 1 : 0 ); $params['without_topic'] = 1; $posts = WaicUtils::getArrayValue($params, 'posts', array(), 2); foreach ($posts as $p) { $postId = isset($p[0]) ? trim($p[0]) : ''; if (empty($postId)) { continue; } $postObj = get_post($postId); if ($postObj) { $body = $postObj->post_content; $title = $postObj->post_title; } else { continue; } $topic = isset($p[1]) ? trim($p[1]) : ''; $keywords = isset($p[2]) ? trim($p[2]) : ''; $postVars = array( 'post_id' => $postId, 'original_article_body' => $body, 'original_article_title' => $title, ); $topics[] = array($topic, $keywords, array_merge($postVars, $vars)); } //$params['common']['mode'] = 'bulk'; $params['bulk'] = array('topics' => $topics); return WaicFrame::_()->getModule('postscreate')->getModel()->prepareGeneration($task, false, $params); } public function doGeneration( $task, $aiProvider ) { $taskId = $task['id']; WaicFrame::_()->saveDebugLogging('Start generation for PostFields task ID=' . $taskId); $model = WaicFrame::_()->getModule('postscreate')->getModel(); $task = WaicFrame::_()->getModule('workspace')->getModel()->controlSteps($task, $model); $result = false; $model->setAiProvider($aiProvider); $model->resetEtaps($taskId); do { $etap = $model->getEtapForGeneration($taskId); if ($etap) { $taskSteps = $model->getGeneratedSteps($taskId); $result = $model->doGenerationEtap($etap, $taskSteps); if (false === $result) { $result = 7; break; } if (8 === $result || 7 === $result) { break; } } else { $result = ( 18 === $result ? 8 : 3 ); break; } } while (true); if ($this->isAllPublished($taskId)) { $result = 4; } $params = array('status' => $result); WaicFrame::_()->saveDebugLogging('Stop generation for PostFields task ID=' . $taskId . '. Set status=' . $result); return $params; } public function getAllCountSteps( $taskId ) { return WaicFrame::_()->getModule('postscreate')->getModel()->getAllCountSteps($taskId); //$all = WaicDb::get('SELECT sum(step) as step, sum(steps) as steps, count(*) as cnt FROM `@__posts_create` WHERE task_id=' . $taskId, 'row'); //return $all ? $all : array('step' => 0, 'steps' => 0, 'cnt' => 0); } public function editResults( $taskId, $edited, $refresh ) { return WaicFrame::_()->getModule('postscreate')->getModel()->editResults($taskId, $edited, $refresh); } public function getGeneratedSteps( $taskId ) { return WaicFrame::_()->getModule('postscreate')->getModel()->getGeneratedSteps($taskId); } public function isAllPublished( $taskId ) { return WaicFrame::_()->getModule('postscreate')->getModel()->isAllPublished($taskId); } public function publishResults( $taskId, $publish ) { return WaicFrame::_()->getModule('postscreate')->getModel()->publishResults($taskId, $publish); } /*public function publishSocials( $taskId, $postId, $social ) { }*/ }