\n";
}
// Inicializa la configuración del plugin y agrega secciones y campos de configuración.
add_action( 'admin_init', 'aicc_settings_init' );
/** Inicializa la configuración del plugin y agrega secciones y campos de configuración.
*/
function aicc_settings_init() {
register_setting(
'aicc_settings', // Option group.
'aicc_settings', // Option name.
'aicc_settings_validate' // Function to validate input.
);
add_settings_section(
'aicc_settings_section_openai', // ID of the section.
__( 'OpenAI account', 'ai-content-creator' ), // Title of the section.
'aicc_settings_section_openai_callback', // Function to be called to display the section.
'aicc_settings' // Slug of the page.
);
add_settings_field(
'aicc_apikoai', // ID of the field.
__( 'OpenAI API key', 'ai-content-creator' ), // Title of the field.
'aicc_settings_apikoai_callback', // Function to be called to display the section.
'aicc_settings', // Slug of the page.
'aicc_settings_section_openai' // ID of the section.
);
/** Ajustes no utilizados
add_settings_section(
'aicc_settings_section_posproduccion',
_ _( 'External post-production system (optional)', 'ai-content-creator' ),
'aicc_settings_section_posproduccion_callback',
'aicc_settings'
);
add_settings_field(
'aicc_apiurlposproduccion',
_ _( 'Post-production URL', 'ai-content-creator' ),
'aicc_settings_apiurlposproduccion_callback',
'aicc_settings',
'aicc_settings_section_posproduccion'
);
add_settings_field(
'aicc_apikposproduccion',
_ _( 'Post-production API key', 'ai-content-creator' ),
'aicc_settings_apikposproduccion_callback',
'aicc_settings',
'aicc_settings_section_posproduccion'
);
*/
add_settings_section(
'aicc_settings_section_general',
__( 'General settings', 'ai-content-creator' ),
'',
'aicc_settings'
);
add_settings_field(
'aicc_modelo',
__( 'AI model', 'ai-content-creator' ),
'aicc_settings_modelo_callback',
'aicc_settings',
'aicc_settings_section_general'
);
add_settings_field(
'aicc_longitud',
__( 'Article length in words', 'ai-content-creator' ),
'aicc_settings_longitud_callback',
'aicc_settings',
'aicc_settings_section_general'
);
add_settings_field(
'aicc_timeout',
__( 'Time limit in seconds', 'ai-content-creator' ),
'aicc_settings_timeout_callback',
'aicc_settings',
'aicc_settings_section_general'
);
add_settings_field(
'aicc_idioma',
__( 'Language of created articles', 'ai-content-creator' ),
'aicc_settings_idioma_callback',
'aicc_settings',
'aicc_settings_section_general'
);
add_settings_field(
'aicc_tono',
__( 'Tone of created articles', 'ai-content-creator' ),
'aicc_settings_tono_callback',
'aicc_settings',
'aicc_settings_section_general'
);
add_settings_field(
'aicc_tablacontenidos',
__( 'Table of contents', 'ai-content-creator' ),
'aicc_settings_tablacontenidos_callback',
'aicc_settings',
'aicc_settings_section_general'
);
add_settings_field(
'aicc_editorescrean',
__( 'Editors', 'ai-content-creator' ),
'aicc_settings_editorescrean_callback',
'aicc_settings',
'aicc_settings_section_general'
);
}
/** Callback para la sección "OpenAI account".
*/
function aicc_settings_section_openai_callback() {
esc_html_e( 'Enter your API key for', 'ai-content-creator' );
echo ' OpenAI ';
}
/** Callback para el campo "OpenAI API key".
*/
function aicc_settings_apikoai_callback() {
$valor = '';
$options = get_option( 'aicc_settings' );
if ( isset( $options['aicc_apikoai'] ) ) {
$valor = $options['aicc_apikoai'];
}
echo ' ' . "\n";
echo ' ';
echo '';
esc_html_e( 'Help', 'ai-content-creator' );
echo "\n";
}
/** Callback para la sección "External post-production system (optional)".
*/
function aicc_settings_section_posproduccion_callback() {
esc_html_e( 'Enter your access data for post-production API', 'ai-content-creator' );
}
/** Callback para el campo "Post-production URL".
*/
function aicc_settings_apiurlposproduccion_callback() {
$valor = '';
$options = get_option( 'aicc_settings' );
if ( isset( $options['aicc_apiurlposproduccion'] ) ) {
$valor = $options['aicc_apiurlposproduccion'];
}
echo '' . "\n";
}
/** Callback para el campo "Post-production API key".
*/
function aicc_settings_apikposproduccion_callback() {
$valor = '';
$options = get_option( 'aicc_settings' );
if ( isset( $options['aicc_apikposproduccion'] ) ) {
$valor = $options['aicc_apikposproduccion'];
}
echo '' . "\n";
}
/** Callback para el campo "AI model".
*/
function aicc_settings_modelo_callback() {
// Selección del modelo de IA.
$modelo = aicc_conf_modelo();
/* translators: %s: Factor multiplicador del precio, por ejemplo "10x". */
$texto = sprintf( __( 'Price %s higher than GPT-3.5', 'ai-content-creator' ), '10x' );
aicc_mostrar_campo_radio_modelo( $modelo, 'text-davinci-003', $texto );
$texto = '' . __( 'Recommended', 'ai-content-creator' ) . '. ' . __( 'This is the foundation of ChatGPT', 'ai-content-creator' );
aicc_mostrar_campo_radio_modelo( $modelo, 'gpt-3.5-turbo', $texto );
/* translators: %s: Factor multiplicador del precio, por ejemplo "30x". */
$texto = __( 'Reqires a minimum payment of 5 USD to grant access.', 'ai-content-creator' ) . ' ' . sprintf( __( 'Price %s higher than GPT-3.5', 'ai-content-creator' ), '30x' );
aicc_mostrar_campo_radio_modelo( $modelo, 'gpt-4', $texto );
$texto = __( 'Updated GPT-4.', 'ai-content-creator' ) . ' ' . __( 'Price is lower than GPT-4', 'ai-content-creator' );
aicc_mostrar_campo_radio_modelo( $modelo, 'gpt-4-turbo', $texto );
$texto = __( 'Updated GPT-4.', 'ai-content-creator' ) . ' ' . __( 'Faster and cheaper recommended GPT-4 model', 'ai-content-creator' );
aicc_mostrar_campo_radio_modelo( $modelo, 'gpt-4o', $texto );
}
/** Callback para el campo "Article length in words".
*/
function aicc_settings_longitud_callback() {
$valor = aicc_conf_longitud();
echo '' . "\n";
echo ' ';
esc_html_e( 'For guidance only, the final decision is up to the AI. [Default: 500]', 'ai-content-creator' );
echo ' ';
esc_html_e( 'Greater effectiveness in GPT-4.', 'ai-content-creator' );
echo '';
}
/** Callback para el campo "Time limit in seconds".
*/
function aicc_settings_timeout_callback() {
$valor = aicc_conf_timeout();
echo '' . "\n";
echo " \n";
/* translators: %s: default time limit value in seconds. */
echo esc_html( sprintf( __( 'Time limit for reply. After waiting this time for IA reply, the connection will be closed and considered an error. [Default: %s]', 'ai-content-creator' ), aicc_default_timeout() ) );
echo "\n";
}
/** Callback para el campo "Language of created articles".
*/
function aicc_settings_idioma_callback() {
$valor_actual = aicc_conf_idioma();
$idiomas_soportados = aicc_idiomas();
echo '\n";
}
/** Callback para el campo "Tone of created articles".
*/
function aicc_settings_tono_callback() {
$valor_actual = aicc_conf_tono();
$tonos_soportados = aicc_tonos();
echo '\n";
}
/** Callback para el campo "Table of contents".
*/
function aicc_settings_tablacontenidos_callback() {
$valor_actual = aicc_conf_tablacontenidos();
echo " ";
esc_html_e( 'Start with an introduction and a table of contents.', 'ai-content-creator' );
echo ' ';
esc_html_e( 'Recommended for SEO.', 'ai-content-creator' );
echo '';
}
/** Callback para el campo "Editors".
*/
function aicc_settings_editorescrean_callback() {
$valor_actual = aicc_conf_editorescrean();
echo " ";
esc_html_e( 'Editors can use AI to create articles.', 'ai-content-creator' );
}
/** Devuelve la capacidad requerida para crear artículos utilizando el plugin.
*
* @return string La capacidad requerida para crear artículos con la IA.
*/
function aicc_requisito_crear() {
$capacidad = 'manage_options';
if ( aicc_conf_editorescrean() ) {
$capacidad = 'edit_posts';
}
return $capacidad;
}
/** Muestra el campo para el botón de un modelo.
*
* @param string $modelo_elegido El modelo elegido actualmente en la configuración.
* @param string $modelo_seleccionable El modelo que se puede seleccionar.
* @param string $texto HTML adicional para mostrar junto al botón de radio.
*/
function aicc_mostrar_campo_radio_modelo( $modelo_elegido, $modelo_seleccionable, $texto = '' ) {
echo "\n";
echo " \n";
}
/** Valida el conjunto de los valores de entrada de la configuración del plugin.
*
* @param array $input Los valores de entrada de la configuración del plugin.
* @return array Los valores de entrada validados.
*/
function aicc_settings_validate( $input ) {
// Valida diferentes campos.
$input = aicc_settings_validate_openaikey( $input );
$input = aicc_settings_validate_posproduccion_url( $input );
$input = aicc_settings_validate_posproduccion_key( $input );
$input = aicc_settings_validate_posproduccion_par( $input );
$input = aicc_settings_validate_modelo( $input );
$input = aicc_settings_validate_longitud( $input );
$input = aicc_settings_validate_timeout( $input );
$input = aicc_settings_validate_idioma( $input );
$input = aicc_settings_validate_tono( $input );
$input = aicc_settings_validate_tablacontenidos( $input );
$input = aicc_settings_validate_editorescrean( $input );
return $input;
}
/** Valida la longitud del artículo en palabras introducido en el panel de configuración del plugin.
*
* @param array $input Array asociativo que contiene los valores ingresados en el panel de configuración del plugin.
* @return array Array asociativo con los valores validados y ajustados según sea necesario.
*/
function aicc_settings_validate_longitud( $input ) {
// Inicializa variables para la validación de la longitud.
$mensaje_error = __( 'Article length in words', 'ai-content-creator' ) . ': ';
$setting = 'aicc_longitud';
$error_code = '';
$cantidad_minima = 100;
$cantidad_maxima = 2500;
$unidad = __( 'words', 'ai-content-creator' );
// Realiza diferentes validaciones en función de las condiciones especificadas.
if ( empty( $input[ $setting ] ) ) {
// Caso en que el campo está vacío.
$error_code = 'aicc_longitud requerido';
$mensaje_error .= __( 'Required field.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_longitud();
} elseif ( ! is_numeric( $input[ $setting ] ) ) {
// Caso en que el valor no es numérico.
$error_code = 'aicc_longitud no numerica';
$mensaje_error .= __( 'Value must be numeric.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_longitud();
} elseif ( filter_var( $input[ $setting ], FILTER_VALIDATE_INT ) === false ) {
// Caso en que el valor no es un entero.
$error_code = 'aicc_longitud no entera';
$mensaje_error .= __( 'Value must be an integer.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_longitud();
} elseif ( $input[ $setting ] < $cantidad_minima ) {
// Caso en que el valor es menor que la cantidad mínima exigida.
$error_code = 'aicc_longitud minima';
/* translators: %1$s: valor mínimo, %2$s: unidad. */
$mensaje_error .= esc_html( sprintf( __( 'Minimum value is %1$s %2$s.', 'ai-content-creator' ), $cantidad_minima, $unidad ) );
$input[ $setting ] = $cantidad_minima;
} elseif ( $input[ $setting ] > $cantidad_maxima ) {
// Caso en que el valor es mayor que la cantidad máxima permitida.
$error_code = 'aicc_longitud maxima';
/* translators: %1$s: valor máximo, %2$s: unidad. */
$mensaje_error .= esc_html( sprintf( __( 'Maximum value is %1$s %2$s.', 'ai-content-creator' ), $cantidad_maxima, $unidad ) );
$input[ $setting ] = $cantidad_maxima;
}
// Si hay un error en la validación, registra el error y muestra el mensaje correspondiente.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error );
}
// Devuelve el array de entrada con los valores validados y ajustados según sea necesario.
return $input;
}
/** Validación de la clave API de OpenAI en el panel de configuración del plugin.
*
* @param array $input Array asociativo que contiene los valores ingresados en el panel de configuración del plugin.
* @return array Array asociativo con los valores validados y ajustados según sea necesario.
*/
function aicc_settings_validate_openaikey( $input ) {
// Inicializa variables para la validación de la clave API de OpenAI.
$mensaje_error = __( 'OpenAI API key', 'ai-content-creator' ) . ': ';
$setting = 'aicc_apikoai';
$error_code = '';
// Realiza la validación de la clave API de OpenAI si no está vacía.
if ( ! empty( $input[ $setting ] ) ) {
// Comprueba si la clave API tiene el formato correcto.
if ( ! preg_match( '/^(sk\-)?[a-z0-9]{32,48}$/i', $input[ $setting ] ) &&
! preg_match( '/^(sk\-project\-)?[a-z0-9]{32,48}$/i', $input[ $setting ] ) &&
! preg_match( '/^(sk\-proj\-)?[a-z0-9]{32,48}$/i', $input[ $setting ] )
) {
$error_code = 'aicc_apikoai defectuosa';
$mensaje_error .= __( 'The format does not seem to be correct.', 'ai-content-creator' );
// Si el formato no es correcto, establece el valor anterior.
$input[ $setting ] = aicc_conf_apikoai();
}
}
// Si hay un error en la validación, registra el error y muestra el mensaje correspondiente.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error );
}
// Devuelve el array de entrada con los valores validados y ajustados según sea necesario.
return $input;
}
/** Valida el tiempo límite en segundos introducido en el panel de configuración del plugin.
*
* @param array $input Array asociativo que contiene los valores ingresados en el panel de configuración del plugin.
* @return array Array asociativo con los valores validados y ajustados según sea necesario.
*/
function aicc_settings_validate_timeout( $input ) {
// Inicializa variables para la validación del límite de tiempo.
$mensaje_error = __( 'Time limit in seconds', 'ai-content-creator' ) . ': ';
$setting = 'aicc_timeout';
$error_code = '';
$cantidad_minima = 30;
$cantidad_maxima = 600;
$unidad = __( 'seconds', 'ai-content-creator' );
// Realiza diferentes validaciones en función de las condiciones especificadas.
if ( empty( $input[ $setting ] ) ) {
// Caso en que el campo está vacío.
$error_code = 'aicc_timeout requerido';
$mensaje_error .= __( 'Required field.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_timeout();
} elseif ( ! is_numeric( $input[ $setting ] ) ) {
// Caso en que el valor no es numérico.
$error_code = 'aicc_timeout no numerico';
$mensaje_error .= __( 'Value must be numeric.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_timeout();
} elseif ( filter_var( $input[ $setting ], FILTER_VALIDATE_INT ) === false ) {
// Caso en que el valor no es un entero.
$error_code = 'aicc_timeout no entero';
$mensaje_error .= __( 'Value must be an integer.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_timeout();
} elseif ( $input[ $setting ] < $cantidad_minima ) {
// Caso en que el valor es menor que la cantidad mínima exigida.
$error_code = 'aicc_timeout minima';
/* translators: %1$s: valor mínimo, %2$s: unidad. */
$mensaje_error .= esc_html( sprintf( __( 'Minimum value is %1$s %2$s.', 'ai-content-creator' ), $cantidad_minima, $unidad ) );
$input[ $setting ] = $cantidad_minima;
} elseif ( $input[ $setting ] > $cantidad_maxima ) {
// Caso en que el valor es mayor que la cantidad máxima permitida.
$error_code = 'aicc_timeout maxima';
/* translators: %1$s: valor máximo, %2$s: unidad. */
$mensaje_error .= esc_html( sprintf( __( 'Maximum value is %1$s %2$s.', 'ai-content-creator' ), $cantidad_maxima, $unidad ) );
$input[ $setting ] = $cantidad_maxima;
}
// Si hay un error en la validación, registra el error y muestra el mensaje correspondiente.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error );
}
// Devuelve el array de entrada con los valores validados y ajustados según sea necesario.
return $input;
}
/** Valida la URL de posproducción.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_posproduccion_url( $input ) {
// Validación de la URL de posproducción.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'Post-production URL', 'ai-content-creator' ) . ': ';
$setting = 'aicc_apiurlposproduccion';
$error_code = '';
if ( ! empty( $input[ $setting ] ) ) {
if ( ! filter_var( $input[ $setting ], FILTER_VALIDATE_URL ) ) {
$error_code = 'aicc_apiurlposproduccion defectuosa';
$mensaje_error .= __( 'The format does not seem to be correct.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_apiurlposproduccion();
}
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error );
}
return $input;
}
/** Valida la clave API de posproducción.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_posproduccion_key( $input ) {
// Validación de la clave API de posproducción.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'Post-production API key', 'ai-content-creator' ) . ': ';
$setting = 'aicc_apikposproduccion';
$error_code = '';
if ( ! empty( $input[ $setting ] ) ) {
// Formato: "aicc-" + sha-256.
if ( ! preg_match( '/^aicc\-[a-fA-F0-9]{64}$/i', $input[ $setting ] ) ) {
$error_code = 'aicc_apikposproduccion defectuosa';
$mensaje_error .= __( 'The format does not seem to be correct.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_apiurlposproduccion();
}
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error );
}
return $input;
}
/** Valida la URL y la clave API de posproducción.
* Además, no tiene utilidad una sin otra.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_posproduccion_par( $input ) {
// La URL de posproducción requiere clave API.
$mensaje_error = __( 'Post-production data', 'ai-content-creator' ) . ': ';
$setting = 'aicc_apiurlposproduccion';
$error_code = '';
if ( empty( $input['aicc_apiurlposproduccion'] ) xor empty( $input['aicc_apikposproduccion'] ) ) {
$error_code = 'aicc_posproduccion insuficiente';
$mensaje_error .= __( 'To use an external post-production service you need the URL address and your key.', 'ai-content-creator' );
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error, 'warning' );
}
return $input;
}
/** Valida el modelo de IA seleccionado.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_modelo( $input ) {
// Validación del modelo.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'AI model', 'ai-content-creator' ) . ': ';
$setting = 'aicc_modelo';
$error_code = '';
if ( ! aicc_es_valido_modelo( $input[ $setting ] ) ) {
$error_code = 'aicc_modelo incorrecto';
$mensaje_error .= __( 'The selected model is not available.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_modelo();
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error, 'error' );
}
return $input;
}
/** Valida el idioma seleccionado para los artículos creados.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_idioma( $input ) {
// Validación del idioma.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'Language of created articles', 'ai-content-creator' ) . ': ';
$setting = 'aicc_idioma';
$error_code = '';
if ( ! aicc_es_valido_idioma( $input[ $setting ] ) ) {
$error_code = 'aicc_idioma incorrecto';
$mensaje_error .= __( 'The selected language is not available.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_idioma();
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error, 'error' );
}
return $input;
}
/** Valida el tono seleccionado para los artículos creados.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_tono( $input ) {
// Validación del tono.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'Tone of created articles', 'ai-content-creator' ) . ': ';
$setting = 'aicc_tono';
$error_code = '';
if ( ! aicc_es_valido_tono( $input[ $setting ] ) ) {
$error_code = 'aicc_tono incorrecto';
$mensaje_error .= __( 'The selected tone is not available.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_tono();
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error, 'error' );
}
return $input;
}
/** Valida el valor de la tabla de contenidos.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_tablacontenidos( $input ) {
// Validación del valor de la tabla de contenidos.
// Se aceptan '0' o '1' como strings.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'Table of contents', 'ai-content-creator' ) . ': ';
$setting = 'aicc_tablacontenidos';
$error_code = '';
if ( isset( $input[ $setting ] ) ) {
if ( '0' !== $input[ $setting ] && '1' !== $input[ $setting ] ) {
$error_code = 'aicc_tablacontenidos incorrecta';
$mensaje_error .= __( 'Wrong selection.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_tablacontenidos();
}
} else {
$input[ $setting ] = '0';
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error, 'error' );
}
return $input;
}
/** Valida si los editores pueden usar la IA para crear artículos.
*
* @param array $input Valores de entrada de la configuración del plugin.
* @return array Valores de entrada validados.
*/
function aicc_settings_validate_editorescrean( $input ) {
// Validación del valor de la tabla de contenidos.
// Inicio del posible mensaje de error.
$mensaje_error = __( 'Editors', 'ai-content-creator' ) . ': ';
$setting = 'aicc_editorescrean';
$error_code = '';
if ( isset( $input[ $setting ] ) ) {
if ( '0' !== $input[ $setting ] && '1' !== $input[ $setting ] ) {
$error_code = 'aicc_editorescrean incorrecta';
$mensaje_error .= __( 'Wrong selection.', 'ai-content-creator' );
$input[ $setting ] = aicc_conf_editorescrean();
}
} else {
$input[ $setting ] = '0';
}
// Indica error si procede.
if ( $error_code ) {
add_settings_error( $setting, $error_code, $mensaje_error, 'error' );
}
return $input;
}