# Feedback_Source Class Reference
**[→ User Guide](feedback-source.md)** | **[← Back to Index](README.md)**
Technical reference for `Automattic\Jetpack\Forms\ContactForm\Feedback_Source`
**Source:** [`class-feedback-source.php`](../src/contact-form/class-feedback-source.php)
## Constructor
### `__construct()`
[📍 Source](../src/contact-form/class-feedback-source.php#L70)
```php
public function __construct(
int|string $id = 0,
string $title = '',
int $page_number = 1,
string $source_type = 'single',
string $request_url = ''
)
```
**Parameters:**
- `$id` (int|string) - The source ID (post ID, widget ID, block template ID, or 0 for homepage)
- `$title` (string) - The title of the feedback entry
- `$page_number` (int) - The page number of the feedback entry (default: 1)
- `$source_type` (string) - The source type (default: 'single')
- `$request_url` (string) - The request URL of the feedback entry
**Source Types:**
- `'single'` - Regular post or page
- `'widget'` - Widget area
- `'block_template'` - Block theme template
- `'block_template_part'` - Block theme template part
**Behavior:**
- Automatically fetches post data if ID is numeric and > 0
- Updates title to "(deleted) [title]" if post doesn't exist
- Updates title to "(trashed) [title]" if post is trashed
- Sets permalink to empty string for non-published posts
---
## Static Methods
### `from_submission()`
[📍 Source](../src/contact-form/class-feedback-source.php#L112)
Creates a Feedback_Source instance from a submission.
```php
public static function from_submission(
?WP_Post $current_post,
int $current_page_number = 1
): Feedback_Source
```
**Parameters:**
- `$current_post` (WP_Post|null) - The current post object
- `$current_page_number` (int) - The current page number (default: 1)
**Returns:** `Feedback_Source` - New source instance
**Note:** Returns source with ID 0 if post is null or invalid.
---
### `get_current()`
[📍 Source](../src/contact-form/class-feedback-source.php#L159)
Creates a Feedback_Source instance for the current context.
```php
public static function get_current( array $attributes ): Feedback_Source
```
**Parameters:**
- `$attributes` (array) - Form shortcode attributes
**Returns:** `Feedback_Source` - Source based on current context
**Detects Source Type Based on Attributes:**
- `$attributes['widget']` → widget source
- `$attributes['block_template']` → block template source
- `$attributes['block_template_part']` → template part source
- Otherwise → single post/page source
**Uses Globals:**
- `$wp` - For building current URL
- `$page` - For page number
- `$_wp_current_template_id` - For block template ID
---
### `from_serialized()`
[📍 Source](../src/contact-form/class-feedback-source.php#L184)
Creates a Feedback_Source instance from serialized data.
```php
public static function from_serialized( array $data ): Feedback_Source
```
**Parameters:**
- `$data` (array) - The serialized data
**Returns:** `Feedback_Source` - Reconstructed source instance
**Expected Data Keys:**
- `source_id` - Source ID (default: 0)
- `entry_title` - Title (default: '')
- `entry_page` - Page number (default: 1)
- `source_type` - Type (default: 'single')
- `request_url` - URL (default: '')
---
## Instance Methods
### Basic Information
#### `get_id()`
[📍 Source](../src/contact-form/class-feedback-source.php#L271)
Get the post ID of the feedback entry.
```php
public function get_id(): int|string
```
**Returns:** `int|string` - The ID of the feedback entry (numeric for posts, string for widgets/templates)
---
#### `get_title()`
[📍 Source](../src/contact-form/class-feedback-source.php#L263)
Get the title of the feedback entry.
```php
public function get_title(): string
```
**Returns:** `string` - The title (may include "(deleted)" or "(trashed)" prefix)
---
#### `get_page_number()`
[📍 Source](../src/contact-form/class-feedback-source.php#L255)
Get the page number of the feedback entry.
```php
public function get_page_number(): int
```
**Returns:** `int` - The page number (for paginated forms)
---
### Permalinks
#### `get_permalink()`
[📍 Source](../src/contact-form/class-feedback-source.php#L199)
Get the permalink of the feedback entry.
```php
public function get_permalink(): string
```
**Returns:** `string` - The full permalink (includes `?page=N` parameter if page_number > 1)
**Behavior:**
- Returns validated redirect URL for published posts
- Returns empty string for deleted/trashed/unpublished posts
- Falls back to home URL if permalink is invalid
---
#### `get_relative_permalink()`
[📍 Source](../src/contact-form/class-feedback-source.php#L243)
Get the relative permalink of the feedback entry.
```php
public function get_relative_permalink(): string
```
**Returns:** `string` - The relative permalink (e.g., "/contact?page=2")
---
### Edit URLs
#### `get_edit_form_url()`
[📍 Source](../src/contact-form/class-feedback-source.php#L211)
Get the edit URL of the form or page where the feedback was submitted from.
```php
public function get_edit_form_url(): string
```
**Returns:** `string` - The edit URL, or empty string if not permitted or not available
**Behavior by Source Type:**
| Source Type | Required Capability | Returns |
|-------------|-------------------|---------|
| `block_template` | `edit_theme_options` + block theme | Site editor URL |
| `block_template_part` | `edit_theme_options` + block theme | Site editor URL |
| `widget` | `edit_theme_options` + widget support | Widgets admin URL |
| `single` | `edit_post` for specific post | Post edit URL |
**Special Cases:**
- Returns empty string for trashed posts (must be restored first)
- Returns empty string if user lacks required capabilities
- Returns empty string if source type doesn't support editing
---
### Serialization
#### `serialize()`
[📍 Source](../src/contact-form/class-feedback-source.php#L280)
Get the serialized representation of the source.
```php
public function serialize(): array
```
**Returns:** `array` - Array with keys: `entry_title`, `entry_page`, `source_id`, `source_type`, `request_url`
---
## Private Static Methods
### `get_source_title()`
[📍 Source](../src/contact-form/class-feedback-source.php#L129)
Get the title of the current page for display.
```php
private static function get_source_title(): string
```
**Returns:** `string` - The appropriate title based on context
**Title Detection Logic:**
| Context | Returns |
|---------|---------|
| `is_front_page()` | Site name (`get_bloginfo('name')`) |
| `is_home()` | Blog page title |
| `is_singular()` | Post/page title |
| `is_archive()` | Archive title |
| `is_search()` | "Search results for: [query]" |
| `is_404()` | "404 Not Found" |
| Default | Site name |
---
## Edit URL Construction
### Block Template
```php
// Format: /wp-admin/site-editor.php?p=/wp_template/{template_id}&canvas=edit
admin_url( 'site-editor.php?p=' . esc_attr( '/wp_template/' . addslashes( $id ) ) . '&canvas=edit' )
```
### Block Template Part
```php
// Format: /wp-admin/site-editor.php?p=/wp_template_part/{template_id}&canvas=edit
admin_url( 'site-editor.php?p=' . esc_attr( '/wp_template_part/' . addslashes( $id ) ) . '&canvas=edit' )
```
### Widget
```php
// Format: /wp-admin/widgets.php
admin_url( 'widgets.php' )
```
### Single Post/Page
```php
// Format: /wp-admin/post.php?post={id}&action=edit
get_edit_post_link( (int) $id, 'url' )
```
---
## Usage Examples
### From Current Context
```php
$source = Feedback_Source::get_current( $form_attributes );
echo $source->get_title();
echo $source->get_permalink();
```
### Manual Creation
```php
$source = new Feedback_Source(
123, // post ID
'Contact Page', // title
2, // page number
'single', // source type
'https://example.com' // request URL
);
```
### Check Source Type
```php
$source = $feedback->get_source_object();
switch ( $source->get_source_type() ) {
case 'widget':
// Handle widget source
break;
case 'block_template':
// Handle template source
break;
case 'single':
default:
// Handle post/page source
break;
}
```
### Display with Edit Link
```php
echo '';
echo esc_html( $source->get_title() ) . '';
if ( $edit_url = $source->get_edit_form_url() ) {
echo ' Edit';
}
```
---
## Special Cases
### Deleted Post
```php
// Post 999 doesn't exist
$source = new Feedback_Source( 999, 'Old Page' );
echo $source->get_title(); // "(deleted) Old Page"
echo $source->get_permalink(); // ""
```
### Trashed Post
```php
// Post exists but is in trash
$source = new Feedback_Source( 123, 'Contact' );
echo $source->get_title(); // "(trashed) Contact"
echo $source->get_edit_form_url(); // "" (can't edit trashed)
```
### Homepage
```php
$source = new Feedback_Source( 0 );
echo $source->get_title(); // Site name
echo $source->get_permalink(); // Home URL
```
### Paginated Form
```php
$source = new Feedback_Source( 123, 'Long Form', 3 );
echo $source->get_permalink(); // "https://example.com/long-form?page=3"
```
---
## See Also
- [Feedback_Source User Guide](feedback-source.md) - Usage examples and patterns
- [Feedback Class Reference](feedback-class.md)