Files
krolewskie-miody.pl/wp-content/plugins/userfeedback-lite/includes/db/class-userfeedback-email-survey.php
2026-04-28 15:13:50 +02:00

241 lines
4.6 KiB
PHP

<?php
/**
* Email Survey class.
*
* @see UserFeedback_DB
* @since 1.11.0
*
* @package UserFeedback
* @subpackage DB
*/
class UserFeedback_Email_Survey extends UserFeedback_DB {
/**
* @inheritdoc
*/
protected $table_name = 'userfeedback_email_surveys';
/**
* @inheritdoc
*/
protected $casts = array(
'rating_options' => 'array',
'settings' => 'object',
'notifications' => 'object',
);
/**
* Get survey by ID with response count
*
* @param int $id Survey ID.
* @return object|null
*/
public static function find( $id ) {
return self::where(
array(
'id' => $id,
)
)->with_count( array( 'responses' ) )->single();
}
/**
* Find survey by slug
*
* @param string $slug Survey slug.
* @return object|null
*/
public static function find_by_slug( $slug ) {
return self::where(
array(
'slug' => $slug,
)
)->single();
}
/**
* Generate unique slug from title
*
* @param string $title Survey title.
* @param int|null $exclude_id ID to exclude from uniqueness check.
* @return string Unique slug.
*/
public static function generate_unique_slug( $title, $exclude_id = null ) {
global $wpdb;
$instance = new static();
$table = $instance->get_table();
$base_slug = sanitize_title( $title );
$slug = $base_slug;
$counter = 2;
while ( true ) {
$query = "SELECT id FROM $table WHERE slug = %s";
$params = array( $slug );
if ( $exclude_id ) {
$query .= " AND id != %d";
$params[] = $exclude_id;
}
$exists = $wpdb->get_var( $wpdb->prepare( $query, $params ) );
if ( ! $exists ) {
break;
}
$slug = $base_slug . '-' . $counter;
$counter++;
}
return $slug;
}
/**
* Generate secret key for HMAC signing
*
* @return string 64-character random key.
*/
public static function generate_secret_key() {
return wp_generate_password( 64, false );
}
/**
* Change surveys status to draft
*
* @param array $survey_ids Survey IDs.
* @return bool|int
*/
public static function draft( $survey_ids ) {
return self::update_many(
$survey_ids,
array(
'status' => 'draft',
)
);
}
/**
* Change surveys status to publish
*
* @param array $survey_ids Survey IDs.
* @return bool|int
*/
public static function publish( $survey_ids ) {
return self::update_many(
$survey_ids,
array(
'status' => 'publish',
)
);
}
/**
* Change surveys status to trash
*
* @param array $survey_ids Survey IDs.
* @return bool|int
*/
public static function trash( $survey_ids ) {
return self::update_many(
$survey_ids,
array(
'status' => 'trash',
)
);
}
/**
* Restore surveys (change status to draft)
*
* @param array $survey_ids Survey IDs.
* @return bool|int
*/
public static function restore( $survey_ids ) {
return self::update_many(
$survey_ids,
array(
'status' => 'draft',
)
);
}
/**
* @inheritdoc
*/
public function get_columns() {
return array(
'id',
'slug',
'secret_key',
'title',
'link_text',
'status',
'rating_options',
'thank_you_message',
'collect_feedback',
'feedback_response',
'feedback_field_label',
'settings',
'notifications',
'created_at',
'updated_at',
);
}
/**
* @inheritdoc
*/
public function create_table() {
global $wpdb;
if ( self::table_exists() ) {
return;
}
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
$charset_collate = $wpdb->get_charset_collate();
$table_name = self::get_table();
$sql = "CREATE TABLE $table_name (
id bigint(20) NOT NULL AUTO_INCREMENT,
slug varchar(255) NOT NULL,
secret_key varchar(64) NOT NULL,
title varchar(255) NOT NULL,
link_text varchar(255) DEFAULT 'How would you rate this email?',
status enum('publish', 'draft', 'trash') DEFAULT 'draft',
rating_options longtext,
thank_you_message varchar(255) DEFAULT 'Thank You For Your Feedback',
collect_feedback tinyint(1) DEFAULT 1,
feedback_field_label varchar(255) DEFAULT 'Why did you rate us this way',
feedback_response varchar(255) DEFAULT 'Thank You For Your Feedback! We appreciate it!',
settings text,
notifications text,
created_at timestamp NOT NULL,
updated_at timestamp NULL,
PRIMARY KEY (id),
UNIQUE KEY slug (slug),
UNIQUE KEY secret_key (secret_key)
) $charset_collate;";
dbDelta( $sql );
}
/**
* @inheritdoc
*/
public function get_relationship_config( $name ) {
switch ( $name ) {
case 'responses':
return array(
'type' => 'many',
'class' => UserFeedback_Email_Response::class,
'key' => 'survey_id',
);
default:
return null;
}
}
}