_setTbl('posts_create');
}
public function isDeleteByCancel() {
return true;
}
public function canUnpublish() {
return true;
}
public function setOpenAI( $aiProvider ) {
$this->aiProvider = $aiProvider;
}
public function setAiProvider( $aiProvider ) {
$this->aiProvider = $aiProvider;
}
public function getPromptVarOptions() {
if (is_null($this->_varOptions)) {
// 0 - from params, 1 - from results, 2 - custom from results, 3 - custom from params
$this->_varOptions = array(
'topic' => 0,
'title' => 1,
'number_of_sections' => 0,
'sections' => 1,
'section#' => 2,
'body' => 1,
'keywords' => 0,
'language' => 0,
'tone_of_voice' => 0,
'additional_prompt' => 0,
'additional_prompt_for_body' => 0,
'additional_prompt_for_@' => 0,
'number_of_@' => 0,
'length_for_@' => 0,
'field_type_for_@' => 0,
'image_preset' => 0,
'image_preset_description' => 0,
'image_orientation' => 0,
'use_common_language' => 0,
'use_human_like_style' => 0,
'original_article_title' => 0,
'original_article_body' => 0,
'keyword#' => 0,
);
$this->_varOptions = WaicDispatcher::applyFilters('getPromptVarOptions', $this->_varOptions);
}
return $this->_varOptions;
}
public function getStatuses( $st = null ) {
$statuses = array(
0 => __('New', 'ai-copilot-content-generator'),
1 => __('Waiting', 'ai-copilot-content-generator'),
2 => __('Processing', 'ai-copilot-content-generator'),
3 => __('Generated', 'ai-copilot-content-generator'),
4 => __('Published', 'ai-copilot-content-generator'),
7 => __('Error', 'ai-copilot-content-generator'),
8 => __('Pause', 'ai-copilot-content-generator'),
9 => __('Canceled', 'ai-copilot-content-generator'),
);
return is_null($st) ? $statuses : ( isset($statuses[$st]) ? $statuses[$st] : '' );
}
public function getPublishMode( $mode ) {
$modes = array(
0 => __('No publish', 'ai-copilot-content-generator'),
1 => __('Instantly', 'ai-copilot-content-generator'),
2 => __('Datetime', 'ai-copilot-content-generator'),
);
return is_null($mode) ? $modes : ( isset($modes[$mode]) ? $modes[$mode] : '' );
}
public function canPostUpdate( $st ) {
return in_array($st, array(1, 2, 3, 7, 8));
}
public function canPostStop( $st ) {
return 2 == $st;
}
public function canPostStart( $st ) {
return in_array($st, array(1, 3, 7, 8));
}
public function canPostPublish( $st ) {
return 3 == $st;
}
public function canPostCancel( $st ) {
return 2 != $st;
}
public function canPostSave( $st ) {
return !in_array($st, array(2, 4, 9));
}
public function isPostRunning( $st ) {
return 2 == $st;
}
public function getFields( $feature = 'postscreate' ) {
if (isset($this->_fieldsMode[$feature])) {
return $this->_fieldsMode[$feature];
}
if (is_null($this->_fields)) {
$this->_fields = array(
'title' => array(
'label' => __('Title', 'ai-copilot-content-generator'),
'required' => true,
'multi' => false,
'modes' => array(
'gen_by_topic' => __('Generate based on Topic', 'ai-copilot-content-generator'),
'gen_by_sections' => __('Generate based on section headers', 'ai-copilot-content-generator'),
'use_topic' => __('Use topic as title', 'ai-copilot-content-generator'),
),
),
'body' => array(
'label' => __('Body', 'ai-copilot-content-generator'),
'required' => true,
'multi' => false,
'modes' => array(
'single' => __('Single-prompt article', 'ai-copilot-content-generator'),
'sections' => __('Sectioned article generation', 'ai-copilot-content-generator'),
'custom' => __('Custom sectioned article generation', 'ai-copilot-content-generator'),
),
'custom_sections' => array(
__('Introduction', 'ai-copilot-content-generator'),
__('What is', 'ai-copilot-content-generator') . ' {topic}',
__('Conclusion', 'ai-copilot-content-generator'),
),
),
'excerpt' => array(
'label' => __('Excerpt', 'ai-copilot-content-generator'),
'required' => false,
'multi' => false,
),
'categories' => array(
'label' => __('Categories', 'ai-copilot-content-generator'),
'required' => false,
'multi' => false,
'taxonomy' => 'category',
'modes' => array(
'fixed' => __('Fixed value', 'ai-copilot-content-generator'),
'generate' => __('Generate based on article', 'ai-copilot-content-generator'),
),
),
'tags' => array(
'label' => __('Tags', 'ai-copilot-content-generator'),
'required' => false,
'multi' => false,
'taxonomy' => 'post_tag',
'modes' => array(
'fixed' => __('Fixed value', 'ai-copilot-content-generator'),
'generate' => __('Generate based on article', 'ai-copilot-content-generator'),
),
),
/*'meta' => array(
'label' => __('Meta-description', 'ai-copilot-content-generator'),
'required' => false,
'multi' => false,
),*/
'author' => array(
'label' => __('Author', 'ai-copilot-content-generator'),
'required' => false,
'multi' => false,
),
'image' => array(
'label' => __('Image', 'ai-copilot-content-generator'),
'required' => false,
'multi' => false,
'modes' => array(
'generate' => __('Generate based on title', 'ai-copilot-content-generator'),
//'fixed' => __('Search in stock', 'ai-copilot-content-generator'),
),
'presetes' => array(
'Realistic' => __('Realistic', 'ai-copilot-content-generator'),
'4k' => __('4k', 'ai-copilot-content-generator'),
'High resolution' => __('High resolution', 'ai-copilot-content-generator'),
'Trending in artstation' => __('Trending in artstation', 'ai-copilot-content-generator'),
'Artstation three' => __('Artstation three', 'ai-copilot-content-generator'),
'3D Render' => __('3D Render', 'ai-copilot-content-generator'),
'Digital painting' => __('Digital painting', 'ai-copilot-content-generator'),
'Amazing art' => __('Amazing art', 'ai-copilot-content-generator'),
'Expert' => __('Expert', 'ai-copilot-content-generator'),
'Stunning' => __('Stunning', 'ai-copilot-content-generator'),
'Creative' => __('Creative', 'ai-copilot-content-generator'),
'Popular' => __('Popular', 'ai-copilot-content-generator'),
'Inspired' => __('Inspired', 'ai-copilot-content-generator'),
'Surreal' => __('Surreal', 'ai-copilot-content-generator'),
'Abstract' => __('Abstract', 'ai-copilot-content-generator'),
'Fantasy' => __('Fantasy', 'ai-copilot-content-generator'),
'Pop art' => __('Pop art', 'ai-copilot-content-generator'),
'Vector' => __('Vector', 'ai-copilot-content-generator'),
'Landscape' => __('Landscape', 'ai-copilot-content-generator'),
'Portrait' => __('Portrait', 'ai-copilot-content-generator'),
'Iconic' => __('Iconic', 'ai-copilot-content-generator'),
'Neo expressionism' => __('Neo expressionism', 'ai-copilot-content-generator'),
'Landscape painting' => __('Landscape painting', 'ai-copilot-content-generator'),
'Digital Art' => __('Digital Art', 'ai-copilot-content-generator'),
'Abstract Art' => __('Abstract Art', 'ai-copilot-content-generator'),
'Surrealistic Art' => __('Surrealistic Art', 'ai-copilot-content-generator'),
'Portrait Painting' => __('Portrait Painting', 'ai-copilot-content-generator'),
'Neon' => __('Neon', 'ai-copilot-content-generator'),
'Neon light' => __('Neon light', 'ai-copilot-content-generator'),
),
'orientation' => array(
'horizontal' => __('Horizontal', 'ai-copilot-content-generator'),
'vertical' => __('Vertical', 'ai-copilot-content-generator'),
'square' => __('Square', 'ai-copilot-content-generator'),
),
'gemini_orientation' => array(
'1:1' => __('1:1', 'ai-copilot-content-generator'),
'3:4' => __('3:4', 'ai-copilot-content-generator'),
'4:3' => __('4:3', 'ai-copilot-content-generator'),
'9:16' => __('9:16', 'ai-copilot-content-generator'),
'16:9' => __('16:9', 'ai-copilot-content-generator'),
),
),
'sections' => array(
'label' => __('Sections', 'ai-copilot-content-generator'),
'required' => false,
'multi' => true,
'results' => true,
),
'date' => array(
'label' => __('Date of publication', 'ai-copilot-content-generator'),
'required' => true,
'multi' => false,
'modes' => array(
'no' => __('Do not publish', 'ai-copilot-content-generator'),
'now' => __('Publish instantly', 'ai-copilot-content-generator'),
'date' => __('Delayed publication', 'ai-copilot-content-generator'),
'random' => __('Publish randomly', 'ai-copilot-content-generator'),
'period' => __('Publish 1 post every', 'ai-copilot-content-generator'), /* pro */
),
'units' => array(
'h' => __('hours', 'ai-copilot-content-generator'),
'm' => __('minutes', 'ai-copilot-content-generator'),
),
),
);
$custom = WaicFrame::_()->getModule('workspace')->getCustomTaxonomiesList('post');
if (!empty($custom)) {
$this->_fields['custom'] = array(
'label' => __('Custom taxonomies', 'ai-copilot-content-generator'),
'required' => false,
'multi' => true,
'modes' => array(
'fixed' => __('Fixed value', 'ai-copilot-content-generator'),
'generate' => __('Generate based on article', 'ai-copilot-content-generator'),
),
'taxonomies' => $custom,
);
}
$d = $this->_fields['date'];
unset($this->_fields['date']);
$this->_fields['date'] = $d;
}
$this->_fieldsMode[$feature] = WaicDispatcher::applyFilters('addPostFields_' . $feature, $this->_fields);
return $this->_fieldsMode[$feature];
}
public function controlTaskParameters( $params, &$error = '' ) {
$apiParams = WaicUtils::getArrayValue($params, 'api', array(), 2);
if (false === WaicUtils::checkEmptyApiKeys($apiParams, $error)) {
return false;
}
$common = WaicUtils::getArrayValue($params, 'common', array(), 2);
$e = __('Not all required fields are specified', 'ai-copilot-content-generator');
if (empty($common)) {
$error = $e;
return false;
}
$mode = WaicUtils::getArrayValue($common, 'mode', '', 0, array('single', 'bulk'));
if (empty($mode)) {
$error = $e . ': ' . __('Mode', 'ai-copilot-content-generator');
return false;
}
if ('single' == $mode) {
$single = WaicUtils::getArrayValue($params, 'single', array(), 2);
if (empty($single)) {
$error = $e . '.';
return false;
}
$topic = WaicUtils::getArrayValue($single, 'topic');
if (empty($topic)) {
$error = $e . ': ' . __('Topic', '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;
}
}
}
$error = WaicDispatcher::applyFilters('controlTaskParameters', '', $params);
return empty($error);
}
public function convertTaskParameters( $params, $toDB = true ) {
if (isset($params['fields'])) {
$dtFields = array('date' => array('date', 'from', 'to', 'period'));
foreach ($dtFields as $field => $data) {
if (isset($params['fields'][$field])) {
foreach ($data as $d) {
if (!empty($params['fields'][$field][$d])) {
$params['fields'][$field][$d] = $toDB ? WaicUtils::convertDateTimeToDB($params['fields'][$field][$d]) : WaicUtils::convertDateTimeToFront($params['fields'][$field][$d]);
}
}
}
}
}
return WaicDispatcher::applyFilters('convertTaskParameters', $params, $toDB);
}
public function clearEtaps( $taskId, $ids = false, $withContent = true ) {
$taskId = (int) $taskId;
if ($withContent) {
$this->unpublishEtaps($taskId, $ids);
$this->deleteImages($taskId, $ids);
}
if (empty($ids)) {
$this->delete(array('task_id' => $taskId));
} else {
$this->removeGroup($ids);
}
return true;
}
public function unpublishEtaps( $taskId, $ids = false ) {
$taskId = (int) $taskId;
$where = 'task_id=' . $taskId . ' AND post_id>0';
if (!empty($ids)) {
$where .= ' AND id IN (' . implode(',', WaicUtils::controlNumericValues($ids)) . ')';
}
$posts = $this->setSelectFields('id, post_id, params')->setWhere($where)->getFromTbl();
if ($posts && is_array($posts)) {
foreach ($posts as $post) {
//wp_update_post(array('ID' => (int) $post['post_id'], 'post_status' => 'draft'));
if (!empty($post['params']['post_id'])) {
continue;
}
wp_delete_post($post['post_id'], true);
/*$image = WaicUtils::getArrayValue($post['post_id'], 'image', array(), 2);
if (!empty($image)) {
$imgId = WaicUtils::getArrayValue($image, 'r', 0, 1);
if (!empty($imgId)) {
wp_delete_attachment($imgId, true);
}
}*/
$this->updateById(array('post_id' => 0, 'status' => 3, 'pub_mode' => 0), $post['id']);
}
}
return true;
}
public function deleteImages( $taskId, $ids = false ) {
$taskId = (int) $taskId;
$where = 'task_id=' . $taskId;
if (!empty($ids)) {
$where .= ' AND id IN (' . implode(',', WaicUtils::controlNumericValues($ids)) . ')';
}
$posts = $this->setSelectFields('id, status, results')->setWhere($where)->getFromTbl();
if ($posts && is_array($posts)) {
foreach ($posts as $post) {
if (4 == $post['status']) {
continue;
}
$results = $post['results'];
if (isset($results['image']) && !empty($results['image']['r'])) {
$imgId = (int) $results['image']['r'];
if (!empty($imgId)) {
wp_delete_attachment($imgId, true);
}
}
}
}
}
public function prepareGeneration( $task, $clear = true, $params = false ) {
if (false == $params) {
$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);
if (empty($common['mode'])) {
WaicFrame::_()->pushError(esc_html__('Tasks parameters damaged', 'ai-copilot-content-generator'));
return false;
}
if ($clear) {
$this->clearEtaps($taskId);
}
$feature = $task['feature'];
$optsModel = WaicFrame::_()->getModule('options')->getModel();
$api = WaicUtils::getArrayValue($params, 'api');
$language = $optsModel->getVariations('api', 'language', WaicUtils::getArrayValue($api, 'language'));
$tone = WaicUtils::getArrayValue($api, 'tone');
$commonLang = WaicUtils::getArrayValue($api, 'common_language', 0, 1) == 1 ? 'Use Only Common Language' : '';
$humanStyle = WaicUtils::getArrayValue($api, 'human_style', 0, 1) == 1 ? 'Use Only Human-Like Language Style' : '';
$ePrompt = WaicUtils::getArrayValue($common, 'e_prompt', 0, 1);
$addPrompt = WaicUtils::getArrayValue($common, 'prompt');
$fields = WaicUtils::getArrayValue($params, 'fields', array(), 2);
$isSingle = ( 'single' == $common['mode'] );
$steps = 0;
$cnt = 0;
$needTopic = ( WaicUtils::getArrayValue($params, 'without_topic', 0, 1) == 0 );
if ($isSingle) {
$single = WaicUtils::getArrayValue($params, 'single', array(), 2);
$topics = array(array(WaicUtils::getArrayValue($single, 'topic'), WaicUtils::getArrayValue($single, 'keywords')));
} else {
$bulk = WaicUtils::getArrayValue($params, 'bulk', array(), 2);
$topics = WaicUtils::getArrayValue($bulk, 'topics', array(), 2);
}
$postNum = 0;
foreach ($topics as $tk) {
$topic = isset($tk[0]) ? trim($tk[0]) : '';
if (empty($topic) && $needTopic) {
return false;
}
$keywords = isset($tk[1]) ? trim($tk[1]) : '';
$vars = array(
'feature' => $feature,
'topic' => $topic,
'keywords' => $keywords,
'language' => $language,
'tone_of_voice' => $tone,
'use_common_language' => $commonLang,
'use_human_like_style' => $humanStyle,
'steps' => 0,
'pub_mode' => 0,
'publish' => null,
'pause' => '',
'order' => array(),
);
if (!empty($keywords)) {
$keywords = explode(',', $keywords);
foreach ($keywords as $i => $keyword) {
$vars['keyword' . ( $i + 1 )] = trim($keyword);
}
}
if ($ePrompt) {
$vars['additional_prompt'] = $addPrompt;
}
if ($ePrompt) {
$vars['additional_prompt'] = $addPrompt;
}
if (!empty($tk[2]) && is_array($tk[2])) {
$vars = array_merge($vars, $tk[2]);
}
//$fields = WaicUtils::getArrayValue($params, 'fields', array(), 2);
$results = $this->prepareResults( $fields, $vars, $postNum );
$postNum++;
//$results = WaicDispatcher::applyFilters('addPrepareResults_' . $feature, $results, $params);
if (!empty($tk[2]) && is_array($tk[2])) {
$vars = array_merge($vars, $tk[2]);
}
if (!empty($vars['image_preset'])) {
$vars['image_preset_description'] = $optsModel->getImagePresetDescriptions($vars['image_preset']);
}
//$vars = WaicDispatcher::applyFilters('addPrepareVars_' . $feature, $vars, $params);
/*if (!empty($tk[2]) && is_array($tk[2])) {
$vars = array_merge($vars, $tk[2]);
}*/
$uniq = isset($vars['uniq']) ? $vars['uniq'] : false;
unset($vars['uniq']);
$post = array(
'task_id' => $taskId,
'steps' => $vars['steps'],
'pub_mode' => $vars['pub_mode'],
'publish' => $vars['publish'],
'results' => WaicUtils::jsonEncode($results),
'params' => WaicUtils::jsonEncode($vars, true),
);
if ($uniq) {
$post['uniq'] = $uniq;
}
$id = $this->insert($post);
if (!empty($results)) {
$cnt++;
//$params['cnt'] = 1;
//$params['steps'] = $vars['steps'];
$steps += $vars['steps'];
}
}
return array('cnt' => $cnt, 'steps' => $steps);
}
protected function _afterGetFromTbl( $row ) {
if (!empty($row['results'])) {
if ('{' != $row['results'][0]) {
$row['results'] = base64_decode($row['results']);
}
$row['results'] = WaicUtils::jsonDecode($row['results']);
}
if (!empty($row['params'])) {
$row['params'] = WaicUtils::jsonDecode($row['params']);
}
return $row;
}
public function getTaskResults( $taskId, $id = 0, $limit = 0 ) {
$where = array();
if (!empty($id)) {
$where['id'] = (int) $id;
}
if (!empty($taskId)) {
$where['task_id'] = (int) $taskId;
}
if (empty($where)) {
return array();
}
$this->setSelectFields('id, status, post_id, pub_mode, results, params')->setWhere($where);//->getFromTbl();//->setLimit(1)->getFromTbl(array('return' => 'one'));
if (!empty($limit)) {
$this->setLimit($limit);
}
$results = $this->getFromTbl(array('return' => empty($id) ? 'all' : 'row'));
return $results ? $results : array();
}
public function getPostParams( $id, $taskId = 0 ) {
$id = (int) $id;
$where = array('id' => $id);
if (!empty($taskId)) {
$where['task_id'] = (int) $taskId;
}
$params = $this->setSelectFields('params')->setWhere($where)->setLimit(1)->getFromTbl(array('return' => 'one'));
return $params ? WaicUtils::jsonDecode($params) : array();
}
public function getPostResults( $id, $taskId = 0 ) {
$id = (int) $id;
$where = array('id' => $id);
if (!empty($taskId)) {
$where['task_id'] = (int) $taskId;
}
$results = $this->setSelectFields('results')->setWhere($where)->setLimit(1)->getFromTbl(array('return' => 'one'));
if ($results) {
if ('{' != $results) {
$results = base64_decode($results);
}
}
return $results ? WaicUtils::jsonDecode($results) : array();
}
public function getCustomPhrase( $str, $vars ) {
foreach ($vars as $key => $value) {
if (is_string($value)) {
$str = str_replace('{' . $key . '}', $value, $str);
}
}
return $str;
}
public function prepareResults( $params, &$vars, $postNum = 0 ) {
//g - need generate, s - status (1-ready,2-error), e - cnt steps, r - result
$feature = isset($vars['feature']) ? $vars['feature'] : $this->_feature;
$fields = $this->getFields($feature);
$results = array();
$steps = 0;
$single = WaicUtils::getArrayValue($params, 'single', array(), 2);
$order = array();
$after = array();
foreach ($fields as $key => $data) {
$field = WaicUtils::getArrayValue($params, $key, array(), 2);
if (!empty($field)) {
$prompt = WaicUtils::getArrayValue($field, 'prompt');
if (!empty($prompt) && 'custom' != $key) {
$vars['additional_prompt_for_' . $key] = $prompt;
}
$vars['length_for_' . $key] = WaicUtils::getArrayValue($field, 'length', 0, 1);
/*if ('custom' != $key) {
$order[] = $key;
}*/
switch ($key) {
case 'title':
$m = WaicUtils::getArrayValue($field, 'mode');
$needGen = 'gen_by_topic' == $m || 'gen_by_sections' == $m || 'gen_by_body' == $m ? 1 : 0;
$results['title'] = array(
'g' => $needGen,
's' => $needGen ? 0 : 1,
'e' => $needGen ? 1 : 0,
'r' => $needGen ? '' : $vars['topic'],
);
if ($needGen) {
if ('gen_by_sections' == $m) {
$after['title'] = 'sections';
$vars['prompt_title'] = 'title_sections';
} else {
$vars['prompt_title'] = 'title_topic';
}
$steps++;
}
break;
case 'body':
$mode = WaicUtils::getArrayValue($field, 'mode');
$vars['mode'] = $mode;
$sections = array();
$body = array();
if ('sections' == $mode) {
$cnt = (int) WaicUtils::getArrayValue($field, 'count', 0, 1);
if (!empty($cnt)) {
$sections = array(
'g' => 1,
's' => 0,
'e' => 1,
'r' => array_fill(1, $cnt, array('s' => 0, 'r' => '')),
);
$steps++;
$body = array(
'g' => 1,
's' => 0,
'e' => $cnt,
'r' => array_fill(1, $cnt, array('s' => 0, 'r' => '')),
);
$steps += $cnt;
if (WaicUtils::getArrayValue($field, 'pause', 0, 1)) {
$vars['pause'] = 'sections';
}
}
} else if ('custom' == $mode) {
$custom = WaicUtils::getArrayValue($field, 'sections', array(), 2);
if (!empty($custom)) {
$r = array();
$i = 1;
foreach ($custom as $name) {
$r[$i] = array('s' => 1, 'r' => $this->getCustomPhrase($name, $vars));
$i++;
}
$sections = array(
'g' => 0,
's' => 1,
'r' => $r,
);
$cnt = count($custom);
$body = array(
'g' => 1,
's' => 0,
'e' => $cnt,
'r' => array_fill(1, $cnt, array('s' => 0, 'r' => '')),
);
$steps += $cnt;
}
}
if (!empty($sections)) {
$results['sections'] = $sections;
$order[] = 'sections';
}
if (empty($body)) {
$vars['mode'] = 'single';
$body = array(
'g' => 1,
's' => 0,
'e' => 1,
'r' => array(array('s' => 0, 'r' => '')),
//'r' => '',
);
$vars['prompt_body'] = 'body';
$steps++;
} else {
$vars['prompt_body'] = 'body_section';
}
$vars['number_of_sections'] = $body['e'];
$results['body'] = $body;
break;
case 'custom':
foreach ($field as $slug => $f) {
$keyC = $key . '-' . $slug;
$needGen = WaicUtils::getArrayValue($f, 'mode') == 'generate' ? 1 : 0;
if ($needGen) {
//$vars['number_of_' . $keyC] = WaicUtils::getArrayValue($f, 'count', 1, 1);
$vars['field_type_for_' . $keyC] = WaicUtils::getArrayValue($f, 'type', 'one-line text.');
$vars['length_for_' . $keyC] = WaicUtils::getArrayValue($f, 'length', 1, 1);
$gen = 1;
$steps++;
}
$order[] = $keyC;
$results[$keyC] = array(
'g' => $needGen,
's' => $needGen ? 0 : 1,
'e' => 1,
'r' => $needGen ? '' : WaicUtils::getArrayValue($f, 'list'),
);
$vars['additional_prompt_for_' . $keyC] = WaicUtils::getArrayValue($f, 'prompt');
$vars['prompt_' . $keyC] = 'custom';
}
break;
case 'categories':
case 'tags':
$needGen = WaicUtils::getArrayValue($field, 'mode') == 'generate' ? 1 : 0;
if ($needGen) {
$vars['number_of_' . $key] = WaicUtils::getArrayValue($field, 'count', 1, 1);
$steps++;
}
if (WaicUtils::getArrayValue($field, 'append', 0, 1)) {
$vars[$key . '_append'] = 1;
}
$results[$key] = array(
'g' => $needGen,
's' => $needGen ? 0 : 1,
'e' => $needGen ? 1 : 0,
'r' => $needGen ? '' : WaicUtils::getArrayValue($field, 'list'),
);
break;
case 'author':
$results[$key] = array('g' => 0, 's' => 1, 'r' => WaicUtils::getArrayValue($field, 'id', 0, 1));
break;
case 'date':
$mode = WaicUtils::getArrayValue($field, 'mode');
$dt = '';
switch ($mode) {
case 'no':
$vars['pub_mode'] = 0;
break;
case 'now':
$vars['pub_mode'] = 1;
break;
case 'date':
$dt = WaicUtils::getArrayValue($field, 'date');
break;
case 'random':
$from = WaicUtils::getArrayValue($field, 'from');
$to = WaicUtils::getArrayValue($field, 'to');
if (!empty($from) && !empty($to)) {
$f = WaicUtils::getTimestampFrom($from);
$t = WaicUtils::getTimestampFrom($to);
if (!empty($f) && !empty($t)) {
$dt = WaicUtils::getFormatedDateTimeDB(wp_rand($f, $t));
}
}
break;
case 'period':
$from = WaicUtils::getArrayValue($field, 'period');
if (empty($postNum)) {
$dt = $from;
} else if (!empty($from)) {
$f = WaicUtils::getTimestampFrom($from);
$addDt = WaicUtils::getArrayValue($field, 'cnt', 0, 1) * ( WaicUtils::getArrayValue($field, 'unit', 'h') == 'h' ? 3600 : 60 );
$dt = WaicUtils::getFormatedDateTimeDB($f + $postNum * $addDt);
}
break;
}
if (!empty($dt)) {
$vars['pub_mode'] = 2;
$vars['publish'] = $dt;
}
$results[$key] = array('g' => 0, 's' => 1, 'r' => $dt);
//$vars['publish'] =
break;
case 'image':
$needGen = WaicUtils::getArrayValue($field, 'mode') == 'generate' ? 1 : 0;
if ($needGen) {
$vars['image_preset'] = WaicUtils::getArrayValue($field, 'preset');
//$vars['image_orientation'] = 'Horizontal';
$vars['image_orientation'] = WaicUtils::getArrayValue($field, 'orientation');
$vars['gemini_image_orientation'] = WaicUtils::getArrayValue($field, 'gemini_orientation');
$results[$key] = array(
'g' => 1,
's' => 0,
'e' => 1,
'r' => '',
);
$order[] = 'image';
$steps++;
}
if ( WaicUtils::getArrayValue($field, 'alt') == 1) {
$results['image_alt'] = array(
'g' => 1,
's' => 0,
'e' => 1,
'r' => '',
);
$order[] = 'image_alt';
/*if ($needGen) {
$after['image_alt'] = 'image';
}*/
$steps++;
}
break;
case 'paragraph':
$cnt = (int) WaicUtils::getArrayValue($vars, 'cnt_paragraphs', 0, 1);
if (!empty($cnt)) {
$results['paragraph'] = array(
'g' => 1,
's' => 0,
'e' => $cnt,
'r' => array_fill(1, $cnt, array('s' => 0, 'r' => '')),
);
$steps += $cnt;
}
break;
case 'place':
$places = WaicUtils::getArrayValue($vars, 'places', array(), 2);
$r = array();
$i = 1;
$cnt = 0;
foreach ($places as $place) {
$needGen = ( 'auto' == $place );
$r[$i] = array('s' => ( $needGen ? 0 : 1 ), 'r' => '');
$i++;
if ($needGen) {
$cnt++;
}
}
$steps += $cnt;
$gen = !empty($cnt);
$results['place'] = array(
'g' => ( $gen ? 1 : 0 ),
's' => ( $gen ? 0 : 1 ),
'e' => count($r),
'r' => $r,
);
break;
default:
$cntGen = 'cnt_' . $key;
if (isset($vars[$cntGen])) {
$cnt = (int) WaicUtils::getArrayValue($vars, $cntGen, 0, 1);
if (!empty($cnt)) {
$results[$key] = array(
'g' => 1,
's' => 0,
'e' => $cnt,
'r' => array_fill(1, $cnt, array('s' => 0, 'r' => '')),
);
$steps += $cnt;
}
} else {
$results[$key] = array(
'g' => 1,
's' => 0,
'e' => 1,
'r' => '',
);
$steps++;
}
}
if ('custom' != $key && 'date' != $key && 'image' != $key) {
$order[] = $key;
}
}
}
if (!empty($after)) {
foreach ($after as $a => $b) {
$aKey = array_search($a, $order);
$bKey = array_search($b, $order);
if ($aKey < $bKey) {
for ($i = $aKey; $i < $bKey; $i++) {
$order[$i] = $order[ $i + 1 ];
}
$order[$bKey] = $a;
}
}
}
//set date to end
//$order[] = 'date';
$vars['order'] = $order;
$vars['steps'] = $steps;
return $results;
}
public function updateResults( $id, $params = array() ) {
$id = (int) $id;
$columns = $params;
if (!empty($columns['params'])) {
$columns['params'] = WaicUtils::jsonEncode($columns['params'], true);
}
if (!empty($columns['results'])) {
$columns['results'] = base64_encode(WaicUtils::jsonEncode($columns['results']));
}
$columns['updated'] = WaicUtils::getTimestampDB();
$this->updateById($columns, $id);
return $id;
}
public function startEtap( $id ) {
$id = (int) $id;
$t = WaicUtils::getTimestampDB();
$params = array(
'updated' => $t,
'start' => $t,
'end' => null,
'status' => 2,
'flag' => 1,
);
$this->updateById($params, $id);
return $id;
}
public function stopEtap( $id ) {
$id = (int) $id;
$t = WaicUtils::getTimestampDB();
$params = array(
'updated' => $t,
'start' => $t,
'status' => 3,
);
return $id;
}
public function resetEtaps( $taskId ) {
$this->update(array('flag' => 0), array('task_id' => $taskId));
return true;
}
public function getWaitingPublish() {
$taskId = WaicDb::get('SELECT min(task_id) FROM `@__posts_create` WHERE pub_mode=0 AND status=3', 'one');
return $taskId ? (int) $taskId : 0;
}
public function getGeneratedSteps( $taskId ) {
$steps = WaicDb::get('SELECT sum(step) FROM `@__posts_create` WHERE task_id=' . $taskId, 'one');
return $steps ? (int) $steps : 0;
}
public function getCountSteps( $taskId ) {
$taskId = (int) $taskId;
$steps = WaicDb::get('SELECT sum(steps) FROM `@__posts_create` WHERE task_id=' . $taskId, 'one');
return $steps ? (int) $steps : 0;
}
public function 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 doGeneration( $task, $aiProvider ) {
$taskId = $task['id'];
WaicFrame::_()->saveDebugLogging('Start generation for PostCreate task ID=' . $taskId);
$result = false;
$this->aiProvider = $aiProvider;
$this->resetEtaps($taskId);
do {
$etap = $this->getEtapForGeneration($taskId);
if ($etap) {
$taskSteps = $this->getGeneratedSteps($taskId);
$result = $this->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 PostCreate task ID=' . $taskId . '. Set status=' . $result);
//$task['step'] =
//$this->updateResults($taskId, $params);
return $params;
}
public function getEtapForGeneration( $taskId ) {
$etap = $this->setWhere(array('task_id' => $taskId, 'flag' => 0))->addWhere('status IN (0,1,2,7,8)')
->setSortOrder('id')->setLimit(1)->getFromTbl(array('return' => 'row'));
return $etap ? $etap : false;
}
public function doGenerationEtap( $etap, $taskStep ) {
$id = $etap['id'];
WaicFrame::_()->saveDebugLogging('Start generation for post ID=' . $id);
$this->startEtap($id);
$taskId = $etap['task_id'];
$taskModel = WaicFrame::_()->getModule('workspace')->getModel('tasks');
$workspace = WaicFrame::_()->getModule('workspace')->getModel('workspace');
$readySteps = 0;
$params = $etap['params'];
$results = $etap['results'];
$order = WaicUtils::getArrayValue($params, 'order', array(), 2);
foreach ($order as $field) {
$data = WaicUtils::getArrayValue($results, $field, array(), 2);
// need generation
if (WaicUtils::getArrayValue($data, 'g', 0, 1)) {
// is ready
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1) {
$cnt = WaicUtils::getArrayValue($data, 'e', 1, 1);
$readySteps += $cnt;
//$taskStep += $cnt;
} else {
$opts = array();
$promptField = WaicUtils::getArrayValue($params, 'prompt_' . $field, $field);
$r = WaicUtils::getArrayValue($data, 'r');
$error = false;
//if (is_array($r) && WaicUtils::getArrayValue($data, 'e', 1, 1) > 1) {
//if (is_array($r) && 'body' == $field) {
if (is_array($r) && 'sections' != $field) {
foreach ($r as $i => $d) {
if (!WaicUtils::getArrayValue($d, 's', 0, 1)) {
$opts['prompt'] = $this->getFieldPrompt($promptField, $field, $params, $results, $i);
$this->aiProvider->setSessionId('post-' . (int) $taskId . '-' . (int) $id . '-' . sanitize_key($field) . '-' . (int) $i);
$d = $this->generateResults( $d, $opts, $field);
if (2 == $d['s']) {
$error = true;
} else {
$readySteps++;
$taskStep++;
$taskModel->updateTask($taskId, array('step' => $taskStep));
}
$results[$field]['r'][$i] = $d;
$forUpdate = array('results' => $results, 'step' => $readySteps);
$this->updateResults($id, array('results' => $results, 'step' => $readySteps));
if ($workspace->controlStop($taskId)) {
return 8;
}
}
}
$results[$field]['s'] = $error ? 2 : 1;
$this->updateResults($id, array('results' => $results));
} else {
$opts['prompt'] = $this->getFieldPrompt($promptField, $field, $params, $results);
if ('image' == $field) {
$opts['size'] = WaicUtils::getArrayValue($params, 'image_orientation');
$opts['gemini_size'] = WaicUtils::getArrayValue($params, 'gemini_image_orientation');
}
$this->aiProvider->setSessionId('post-' . (int) $taskId . '-' . (int) $id . '-' . sanitize_key($field));
$data = $this->generateResults($data, $opts, $field);
$results[$field] = $data;
if (2 == $data['s']) {
$error = true;
} else {
$readySteps++;
$taskStep++;
$this->updateResults($id, array('results' => $results, 'step' => $readySteps));
$taskModel->updateTask($taskId, array('step' => $taskStep));
}
}
if ($error) {
$this->updateResults($id, array('results' => $results, 'step' => $readySteps, 'status' => 7));
return 7;
}
if (WaicUtils::getArrayValue($params, 'pause') == $field) {
$this->updateResults($id, array('results' => $results, 'step' => $readySteps, 'status' => 8));
// need a fictitious status so that bulk generation does not stop after each post - later we change it to standard status 8
return 18;
}
if ($workspace->controlStop($taskId)) {
return 8;
}
}
}
}
WaicFrame::_()->saveDebugLogging('Stop generation for post ID=' . $id);
$this->stopEtap($id);
$this->updateResults($id, array('results' => $results, 'step' => $readySteps, 'steps' => $readySteps, 'status' => 3, 'end' => WaicUtils::getTimestampDB()));
if ( 1 == $etap['pub_mode'] || ( 2 == $etap['pub_mode'] && $etap['publish'] <= WaicUtils::getTimestampDB() ) ) {
$feature = WaicUtils::getArrayValue($params, 'feature', 'postscreate');
if ('productsfields' == $feature) {
$featureModule = WaicFrame::_()->getModule($feature);
if ($featureModule) {
$featureModule->getModel()->publishResults($taskId, array($id));
}
} else {
$this->publishResults($taskId, array($id));
}
WaicFrame::_()->saveDebugLogging('Published post ID=' . $id);
}
return 3;
}
public function generateResults( $data, $opts, $field ) {
WaicFrame::_()->saveDebugLogging('Field: ' . $field);
$result = 'image' == $field ? $this->aiProvider->getImage($opts) : $this->aiProvider->getText($opts);
if ($result['error']) {
$data['s'] = 2;
$data['m'] = $result['msg'];
} else {
unset($data['m']);
$data['s'] = 1;
switch ($field) {
case 'sections':
$list = preg_split('/\r\n|\r|\n/', $result['data']);
$i = 1;
foreach ($list as $r) {
if (WaicUtils::mbstrpos($r, $i . '.') === 0) {
$res = trim(WaicUtils::mbsubstr($r, WaicUtils::mbstrlen($i . '.')));
if (!empty($res) && isset($data['r'][$i])) {
$data['r'][$i]['r'] = $this->controlResultText($res, $field);
$data['r'][$i]['s'] = 1;
}
}
$i++;
}
break;
case 'image':
$path = $this->controlResultText($result['data'], $field);
if ($path) {
$attrId = $this->saveImage(htmlspecialchars_decode($path, ENT_QUOTES), 'WAIC AI generated Image');
$data['r'] = $attrId ? $attrId : 0;
}
break;
default:
$data['r'] = $this->controlResultText($result['data'], $field);
break;
}
}
return $data;
}
public function controlResultText( $str, $field, $punkt = true ) {
switch ($field) {
case 'title':
$str = str_replace(array('"', "'"), array('', '''), $str);
break;
case 'body':
if ($punkt) {
$lastPunkt = WaicUtils::mbstrrpos($str, '.');
if ($lastPunkt) {
$str = WaicUtils::mbsubstr($str, 0, $lastPunkt) . '.';
}
}
break;
default:
if (strpos($field, 'custom-') === 0) {
$str = str_replace(array('"', "'"), array('', ''), $str);
}
break;
}
$str = str_replace(array('```html', '```'), array('', ''), $str);
/*$str = str_replace(array('\\', '/', '"', "\r", "\n", "\b", "\f", "\t"),
array('\\\\', '\/', '\"', '\r', '
', '\b', '\f', '\t'), $str);*/
//$str = str_replace(array("\r", "\n", "\b", "\f", "\t"), array('', '
', '', '', ''), $str);
//$str = str_replace(array("\r", "\n", "\b", "\f", "\t"), array('', '', '', '', ''), $str);
//$str = str_replace(array('
', '
'), array('
', ''), $str);
//$str = str_replace('
', '', $str);
return htmlspecialchars($str, ENT_QUOTES);
//return base64_encode($str);
//return $str;
}
public function editResults( $taskId, $edited, $refresh ) {
//$steps = 0; // only for refresh
if (!is_array($edited)) {
$edited = array();
}
$resArray = array();
foreach ($edited as $id => $blocks) {
$results = $this->getPostResults($id, $taskId);
if (empty($results)) {
continue;
}
$blocks = json_decode(stripslashes($blocks), true);
$update = array();
$editParams = false;
foreach ($blocks as $block => $data) {
switch ($block) {
case 'sections':
$r = array();
foreach ($data as $i => $value) {
$r[$i + 1] = array('s' => 1, 'r' => $this->controlResultText($value, $block));
}
$cnt = $i + 1;
if ($results['body']['e'] > $cnt) {
for ($n = $cnt + 1; $n <= $results['body']['e']; $n++) {
unset($results['body']['r'][$n]);
}
$results['body']['e'] = $cnt;
}
$results[$block]['r'] = $r;
break;
case 'body':
case 'descriptionvars':
foreach ($data as $n => $value) {
if (isset($results[$block]['r'][$n])) {
$results[$block]['r'][$n]['s'] = 1;
$results[$block]['r'][$n]['r'] = $this->controlResultText($value, $block, false);
}
}
break;
case 'reviews':
$params = $this->getPostParams($id, $taskId);
$reviews = WaicUtils::getArrayValue($params, 'reviews', array(), 2);
foreach ($data as $n => $values) {
if (isset($values['r']) && isset($results[$block]['r'][$n])) {
$results[$block]['r'][$n]['s'] = 1;
$results[$block]['r'][$n]['r'] = $this->controlResultText($values['r'], $block, false);
}
if (isset($values['user']) && isset($reviews[$n]['user'])) {
$reviews[$n]['user'] = (int) $values['user'];
$editParams = true;
}
if (isset($values['rate']) && isset($reviews[$n]['rate'])) {
$rate = (int) $values['rate'];
if ($rate > 5) {
$rate = 5;
} else if ($rate < 1) {
$rate = 1;
}
$reviews[$n]['rate'] = $rate;
$editParams = true;
}
if (isset($values['date']) && isset($reviews[$n]['date'])) {
$reviews[$n]['date'] = WaicUtils::convertDateTimeToDB($values['date']);
$editParams = true;
}
}
if ($editParams) {
$params['reviews'] = $reviews;
$update['params'] = $params;
}
break;
case 'date':
$dt = empty($data) ? '' : WaicUtils::convertDateTimeToDB($data);
if (empty($dt) || is_null($dt)) {
$dt = '';
$update['pub_mode'] = 1;
$update['publish'] = null;
} else {
$update['pub_mode'] = 2;
$update['publish'] = $dt;
}
$results[$block]['r'] = $dt;
break;
default:
$results[$block]['r'] = is_array($data) ? $data : $this->controlResultText($data, $block);
break;
}
}
$resArray[$id] = $results;
if (!$this->updateResults($id, array_merge($update, array('results' => $results)))) {
return false;
}
}
if (!is_array($refresh)) {
$refresh = array();
}
$refreshed = false;
foreach ($refresh as $id => $blocks) {
$results = isset($resArray[$id]) ? $resArray[$id] : $this->getPostResults($id, $taskId);
if (empty($results)) {
continue;
}
$cnt = 0;
foreach ($blocks as $block => $data) {
if (isset($results[$block]) && !empty($results[$block]['g'])) {
$s = empty($results[$block]['s']) ? 0 : $results[$block]['s'];
$results[$block]['s'] = 0;
if (is_array($data)) {
foreach ($data as $b) {
if (isset($results[$block]['r'][$b])) {
$results[$block]['r'][$b] = array('s' => 0, 'r' => '');
$cnt++;
}
}
continue;
}
if (( 'body' == $block || 'paragraph' == $block ) && 'all' != $data) {
$b = (int) $data;
if (isset($results[$block]['r'][$b])) {
/*if (!empty($results[$block]['r'][$b]['s']) && $results[$block]['r'][$b]['s'] == 1) {
$steps++;
}*/
$results[$block]['r'][$b] = array('s' => 0, 'r' => '');
$cnt++;
}
continue;
}
if ('image' == $block) {
$imgId = (int) $results[$block]['r'];
if (!empty($imgId)) {
wp_delete_attachment($imgId, true);
}
}
if (is_array($results[$block]['r'])) {
foreach ($results[$block]['r'] as $b => $d) {
/*if (!empty($results[$block]['r'][$b]['s']) && $results[$block]['r'][$b]['s'] == 1) {
$steps++;
}*/
$results[$block]['r'][$b] = array('s' => 0, 'r' => '');
}
$cnt += $results[$block]['e'];
} else {
/*if ($s == 1) {
$steps++;
}*/
$results[$block]['r'] = '';
$cnt++;
}
}
}
$refreshed = true;
if ($cnt > 0) {
$etap = $this->getById($id);
if ($etap) {
$step = $etap['step'] - $cnt;
if (0 > $step) {
$step = 0;
}
if (!$this->updateResults($id, array('results' => $results, 'status' => 1, 'step' => $step))) {
return false;
}
}
}
}
return $refreshed ? 1 : true;
}
public function publishResults( $taskId, $publish ) {
if (!is_array($publish)) {
if ('all' == $publish) {
$publish = array();
$posts = $this->setSelectFields('id')->setWhere(array('task_id' => $taskId, 'status' => 3, 'post_id' => 0))->getFromTbl();
if ($posts && is_array($posts)) {
foreach ($posts as $post) {
$publish[] = $post['id'];
}
}
} else {
$publish = array();
}
}
foreach ($publish as $id) {
//$results = $this->getPostResults($id, $taskId);
$postData = $this->getTaskResults($taskId, $id);
if (empty($postData) || !empty($postData['post_id'])) {
continue;
}
if (!$this->canPostPublish($postData['status'])) {
continue;
}
$results = $postData['results'];
$params = $postData['params'];
$feature = WaicUtils::getArrayValue($params, 'feature', 'postscreate');
/*$post = array(
'post_title' => 'New post',
'post_status' => 'publish',
'post_type' => 'post',
'post_author' => 1,
);*/
//$post = array('post_type' => 'post');
$post = array();
$attId = 0;
$imgAlt = '';
$needUpdate = false;
foreach ($results as $field => $data) {
if (empty($data)) {
continue;
}
switch ($field) {
case 'title':
$post['post_title'] = htmlspecialchars_decode(WaicUtils::getArrayValue($data, 'r', 'New post'), ENT_QUOTES);
break;
case 'author':
$post['post_author'] = WaicUtils::getArrayValue($data, 'r', 1, 1);
break;
case 'body':
$content = '';
if (is_array($data['r'])) {
foreach ($data['r'] as $r) {
if (isset($r['s']) && 1 == $r['s'] && !empty($r['r'])) {
$content .= $r['r'];
}
}
}
if (!empty($params['addtext_body'])) {
$content .= $params['addtext_body'];
}
$post['post_content'] = htmlspecialchars_decode($content, ENT_QUOTES);
break;
case 'excerpt':
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1) {
$post['post_excerpt'] = htmlspecialchars_decode(WaicUtils::getArrayValue($data, 'r'), ENT_QUOTES);
}
break;
case 'categories':
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1) {
$termsIds = $this->createTaxonomies(WaicUtils::getArrayValue($data, 'r'), 'category');
if (!empty($termsIds)) {
$post['post_category'] = $termsIds;
}
}
break;
case 'tags':
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1) {
$termsIds = $this->createTaxonomies(WaicUtils::getArrayValue($data, 'r'), 'post_tag');
if (!empty($termsIds)) {
$post['tags_input'] = $termsIds;
}
}
break;
case 'image':
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1 && !empty($data['r'])) {
//$attId = $this->saveImage(htmlspecialchars_decode($data['r'], ENT_QUOTES), $post['post_title']);
$attId = WaicUtils::getArrayValue($data, 'r', 0, 1);
$needUpdate = true;
}
break;
case 'image_alt':
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1 && !empty($data['r'])) {
$imgAlt = WaicUtils::getArrayValue($data, 'r', '');
$needUpdate = true;
}
break;
default:
if (WaicUtils::getArrayValue($data, 's', 0, 1) == 1 && strpos($field, 'custom-') === 0) {
$slug = str_replace('custom-', '', $field);
$termsIds = $this->createTaxonomies(WaicUtils::getArrayValue($data, 'r'), $slug, '');
if (!empty($termsIds)) {
if (empty($post['tax_input'])) {
$post['tax_input'] = array();
}
$post['tax_input'][$slug] = $termsIds;
}
}
break;
}
}
$postId = WaicUtils::getArrayValue($params, 'post_id', 0, 1);
if (!empty($post) || $needUpdate) {
$post['post_type'] = 'post';
if (empty($postId)) {
$post['post_status'] = 'publish';
if (empty($post['post_title'])) {
$post['post_title'] = 'New post';
}
if (empty($post['post_author'])) {
$post['post_author'] = 1;
}
$postId = wp_insert_post($post, true);
} else {
$post['ID'] = $postId;
$categories = empty($post['post_category']) ? false : $post['post_category'];
$tags = empty($post['tags_input']) ? false : $post['tags_input'];
$custom = empty($post['tax_input']) ? false : $post['tax_input'];
unset($post['post_category'], $post['tags_input'], $post['tax_input']);
$postId = wp_update_post($post);
if ($postId) {
if (!empty($categories)) {
wp_set_post_terms($postId, $categories, 'category', WaicUtils::getArrayValue($params, 'categories_append', 0, 1) == 1);
}
if (!empty($tags)) {
wp_set_post_terms($postId, $tags, 'post_tag', WaicUtils::getArrayValue($params, 'tags_append', 0, 1) == 1);
}
if (!empty($custom)) {
foreach ($custom as $taxonomy => $tags) {
wp_set_post_terms($postId, $tags, $taxonomy, true);
}
}
if (empty($attId) && !empty($imgAlt)) {
$attId = (int) get_post_meta($postId, '_thumbnail_id', true);
}
if (empty($post['post_title'])) {
$p = get_post( $postId );
$post['post_title'] = $p ? $p->post_title : '';
}
}
}
if ( is_wp_error($postId) ) {
WaicFrame::_()->pushError($postId->get_error_message());
return false;
}
if (!empty($attId)) {
$title = $post['post_title'];
$attUpd = wp_update_post(
array(
'ID' => $attId,
'post_title' => $title,
'post_content' => $title,
'post_excerpt' => $title,
)
);
if (!is_wp_error($attUpd)) {
update_post_meta($attId, '_wp_attachment_image_alt', empty($imgAlt) ? $title : $imgAlt);
update_post_meta($postId, '_thumbnail_id', $attId);
}
}
}
$found = WaicDispatcher::applyFilters('publishResults_' . $feature, 0, array('task_id' => $taskId, 'id' => $id, 'post_id' => $postId, 'post_data' => $postData));
if (0 === $found) {
if (!$this->updateResults($id, array('status' => 4, 'post_id' => $postId))) {
return false;
}
} else if (false === $found) {
return false;
}
}
return true;
}
public function saveImage( $imageUrl, $title = '' ) {
global $wpdb;
$result = array('status' => 'error', 'msg' => esc_html__('Can not save image to media', 'ai-copilot-content-generator'));
if (!function_exists('wp_generate_attachment_metadata')) {
include_once ABSPATH . 'wp-admin/includes/image.php';
}
if (!function_exists('download_url')) {
include_once ABSPATH . 'wp-admin/includes/file.php';
}
if (!function_exists('media_handle_sideload')) {
include_once ABSPATH . 'wp-admin/includes/media.php';
}
$attId = 0;
$array = explode('/', getimagesize($imageUrl)['mime']);
$imageType = end($array);
$uniqName = md5($imageUrl);
$fileName = $uniqName . '.' . $imageType;
// phpcs:ignore WordPress.DB.DirectDatabaseQuery
$checkExist = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->postmeta} WHERE meta_value LIKE %s", '%/' . $wpdb->esc_like($fileName)));
if ($checkExist) {
$attId = $checkExist->post_id;
} else {
if (file_exists($imageUrl)) {
$tmp = $imageUrl;
} else {
$tmp = download_url($imageUrl);
}
if (is_wp_error($tmp)) {
WaicFrame::_()->pushError($tmp->get_error_message());
return false;
}
$args = array(
'name' => $fileName,
'tmp_name' => $tmp,
);
$attId = media_handle_sideload($args, 0, '', array(
'post_title' => $title,
'post_content' => $title,
'post_excerpt' => $title,
));
if (!is_wp_error($attId)) {
update_post_meta($attId, '_wp_attachment_image_alt', $title);
$imageNew = get_post( $attId );
$fullSizePath = get_attached_file($imageNew->ID);
$attData = wp_generate_attachment_metadata($attId, $fullSizePath);
wp_update_attachment_metadata($attId, $attData);
} else {
WaicFrame::_()->pushError($attId->get_error_message());
return false;
}
}
return $attId;
}
public function createTaxonomies( $list, $taxonomy, $sep = ',' ) {
if (is_array($list)) {
return WaicUtils::controlNumericValues($list);
}
$ids = array();
$terms = empty($sep) ? array($list) : explode($sep, $list);
if (empty($terms) || !taxonomy_exists($taxonomy)) {
return $ids;
}
foreach ($terms as $name) {
$name = trim($name);
$term = get_term_by('name', $name, $taxonomy);
if ($term) {
$ids[] = $term->term_id;
} else {
$term = wp_insert_term( $name, $taxonomy );
if (!is_wp_error($term)) {
$ids[] = $term['term_id'];
}
}
}
return $ids;
}
public function isAllPublished( $taskId ) {
$result = $this->setSelectFields('id')->setWhere(array('task_id' => $taskId))->addWhere('status not in (4,9)')->setLimit(1)->getFromTbl(array('return' => 'one'));
return empty($result) || is_null($result);
}
public function publishDelayedPosts( $workspace ) {
if ($workspace->isRunningFlag($this->publishFlagId, $this->publishFlagTimeout)) {
return true;
}
$workspace->setRunningFlag($this->publishFlagId);
$result = true;
$posts = $this->setSelectFields('task_id, id')->setWhere('status=3 AND post_id=0 AND pub_mode>=1 AND (pub_mode=1 OR (pub_mode=2 AND publish<=' . "'" . WaicUtils::getTimestampDB() . "'))")->getFromTbl();
if ($posts && is_array($posts)) {
$tasksModel = $workspace->getModule()->getModel('tasks');
$publish = array();
foreach ($posts as $post) {
$taskId = $post['task_id'];
if (!isset($publish[$taskId])) {
$publish[$taskId] = array();
}
$publish[$taskId][] = $post['id'];
}
foreach ($publish as $taskId => $ids) {
if (!$this->publishResults($taskId, $ids)) {
$result = false;
break;
}
if ($this->isAllPublished($taskId)) {
if (!$tasksModel->updateTask($taskId, array('status' => 4))) {
return false;
}
}
}
}
$workspace->resetRunningFlag($this->publishFlagId);
return $result;
}
public function getFieldPrompt( $name, $field, $params, $results, $nRes = 0 ) {
$prompt = WaicFrame::_()->getModule('options')->getWithDefaults('prompts', $name);
$maxSteps = 9;
$varOptions = $this->getPromptVarOptions();
foreach ($varOptions as $var => $typ) {
$rep = '';
switch ($typ) {
case 0:
if (strpos($var, '@')) {
$var = str_replace('@', $field, $var);
}
if (strpos($var, '#')) {
for ($i = 1; $i <= $maxSteps; $i++) {
$varN = str_replace('#', '', $var) . $i;
$rep = WaicUtils::getArrayValue($params, $varN);
if (!empty($rep)) {
$prompt = str_replace('{' . $varN . '}', $rep, $prompt);
} else {
break;
}
}
} else {
$rep = WaicUtils::getArrayValue($params, $var);
if (strpos($field, 'custom-') === 0) {
$var = str_replace($field, 'custom', $var);
}
}
break;
case 1:
$nums = ( 'sections' == $var );
$data = WaicUtils::getArrayValue(WaicUtils::getArrayValue($results, $var, array(), 2), 'r');
if (is_array($data)) {
foreach ($data as $i => $d) {
if (isset($d['r'])) {
$rep .= ( $nums ? $i . '. ' : '' ) . htmlspecialchars_decode($d['r'], ENT_QUOTES) . PHP_EOL;
}
}
} else {
$rep = $data;
}
if ('image' == $field) {
$step = 0;
if (WaicUtils::mbstrlen($rep) > 300) {
$rep = WaicUtils::mbsubstr($rep, 0, 300);
}
/*while (WaicUtils::mbstrlen($rep) > 300) {
$lastPunkt = WaicUtils::mbstrrpos($rep, '.', -1);
if ($lastPunkt) {
$rep = WaicUtils::mbsubstr($rep, 0, $lastPunkt);
} else {
break;
}
$step++;
if ($step > 20) {
break;
}
}*/
}
if (empty($rep)) {
if ('title' == $var) {
$rep = WaicUtils::getArrayValue($params, 'original_article_title');
} else if ('body' == $var) {
$rep = WaicUtils::getArrayValue($params, 'original_article_body');
}
}
break;
case 2:
if ('section#' == $var && !empty($nRes)) {
$data = WaicUtils::getArrayValue(WaicUtils::getArrayValue($results, 'sections', array(), 2), 'r');
if (!empty($data[$nRes]['r'])) {
$rep = htmlspecialchars_decode($data[$nRes]['r'], ENT_QUOTES);
}
} else if (strpos($var, '#') && !empty($nRes)) {
$data = WaicUtils::getArrayValue(WaicUtils::getArrayValue($results, str_replace('#', '', $var), array(), 2), 'r');
if (!empty($data[$nRes]['r'])) {
$rep = htmlspecialchars_decode($data[$nRes]['r'], ENT_QUOTES);
}
}
break;
case 3:
if (strpos($var, '#') && !empty($nRes)) {
$rep = WaicUtils::getArrayValue($params, str_replace('#', $nRes, $var));
}
break;
default:
break;
}
$prompt = str_replace('{' . $var . '}', $rep, $prompt);
}
return $prompt;
}
}