feat: register custom Elementor dynamic tags for job offer fields
Adds a "Stellenangebot" group to Elementor's dynamic tags dropdown with tags for Standort, Art, Bewerbungsfrist, Kontakt-E-Mail (text), and Logo (image). This removes the dependency on Elementor Pro's ACF module for displaying job offer fields in templates and loop items. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
58
includes/class-elementor-tags.php
Normal file
58
includes/class-elementor-tags.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
/**
|
||||
* Elementor Dynamic Tags integration.
|
||||
*
|
||||
* Registers custom dynamic tags for job offer fields so they appear
|
||||
* in the Elementor editor's dynamic tags dropdown under a
|
||||
* "Stellenangebot" group.
|
||||
*
|
||||
* @package DDHH_Job_Manager
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* Class DDHH_JM_Elementor_Tags
|
||||
*/
|
||||
class DDHH_JM_Elementor_Tags {
|
||||
|
||||
/**
|
||||
* Group slug used for all job offer tags.
|
||||
*/
|
||||
const GROUP_SLUG = 'ddhh-job-offer';
|
||||
|
||||
/**
|
||||
* Initialize hooks.
|
||||
*/
|
||||
public static function init() {
|
||||
add_action( 'elementor/dynamic_tags/register', array( __CLASS__, 'register_tags' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the dynamic tag group and individual tags.
|
||||
*
|
||||
* @param \Elementor\Core\DynamicTags\Manager $manager Elementor dynamic tags manager.
|
||||
*/
|
||||
public static function register_tags( $manager ) {
|
||||
$manager->register_group(
|
||||
self::GROUP_SLUG,
|
||||
array(
|
||||
'title' => 'Stellenangebot',
|
||||
)
|
||||
);
|
||||
|
||||
$tag_dir = DDHH_JM_PLUGIN_DIR . 'includes/elementor-tags/';
|
||||
|
||||
require_once $tag_dir . 'class-tag-job-location.php';
|
||||
require_once $tag_dir . 'class-tag-job-type.php';
|
||||
require_once $tag_dir . 'class-tag-job-deadline.php';
|
||||
require_once $tag_dir . 'class-tag-job-contact-email.php';
|
||||
require_once $tag_dir . 'class-tag-job-logo.php';
|
||||
|
||||
$manager->register( new DDHH_JM_Tag_Job_Location() );
|
||||
$manager->register( new DDHH_JM_Tag_Job_Type() );
|
||||
$manager->register( new DDHH_JM_Tag_Job_Deadline() );
|
||||
$manager->register( new DDHH_JM_Tag_Job_Contact_Email() );
|
||||
$manager->register( new DDHH_JM_Tag_Job_Logo() );
|
||||
}
|
||||
}
|
||||
38
includes/elementor-tags/class-tag-job-contact-email.php
Normal file
38
includes/elementor-tags/class-tag-job-contact-email.php
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
/**
|
||||
* Elementor dynamic tag: Kontakt-E-Mail (job_contact_email).
|
||||
*
|
||||
* Registered in both TEXT and URL categories so it can be used
|
||||
* as link href (mailto:) or plain text display.
|
||||
*
|
||||
* @package DDHH_Job_Manager
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
class DDHH_JM_Tag_Job_Contact_Email extends \Elementor\Core\DynamicTags\Tag {
|
||||
|
||||
public function get_name(): string {
|
||||
return 'ddhh-job-contact-email';
|
||||
}
|
||||
|
||||
public function get_title(): string {
|
||||
return 'Kontakt-E-Mail';
|
||||
}
|
||||
|
||||
public function get_group(): array {
|
||||
return array( DDHH_JM_Elementor_Tags::GROUP_SLUG );
|
||||
}
|
||||
|
||||
public function get_categories(): array {
|
||||
return array(
|
||||
\Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY,
|
||||
\Elementor\Modules\DynamicTags\Module::URL_CATEGORY,
|
||||
);
|
||||
}
|
||||
|
||||
public function render(): void {
|
||||
$value = get_post_meta( get_the_ID(), 'job_contact_email', true );
|
||||
echo esc_html( $value );
|
||||
}
|
||||
}
|
||||
44
includes/elementor-tags/class-tag-job-deadline.php
Normal file
44
includes/elementor-tags/class-tag-job-deadline.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* Elementor dynamic tag: Bewerbungsfrist (job_deadline).
|
||||
*
|
||||
* Formats the stored Y-m-d date as DD.MM.YYYY for display.
|
||||
*
|
||||
* @package DDHH_Job_Manager
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
class DDHH_JM_Tag_Job_Deadline extends \Elementor\Core\DynamicTags\Tag {
|
||||
|
||||
public function get_name(): string {
|
||||
return 'ddhh-job-deadline';
|
||||
}
|
||||
|
||||
public function get_title(): string {
|
||||
return 'Bewerbungsfrist';
|
||||
}
|
||||
|
||||
public function get_group(): array {
|
||||
return array( DDHH_JM_Elementor_Tags::GROUP_SLUG );
|
||||
}
|
||||
|
||||
public function get_categories(): array {
|
||||
return array( \Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY );
|
||||
}
|
||||
|
||||
public function render(): void {
|
||||
$raw = get_post_meta( get_the_ID(), 'job_deadline', true );
|
||||
if ( empty( $raw ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$timestamp = strtotime( $raw );
|
||||
if ( false === $timestamp ) {
|
||||
echo esc_html( $raw );
|
||||
return;
|
||||
}
|
||||
|
||||
echo esc_html( date_i18n( 'd.m.Y', $timestamp ) );
|
||||
}
|
||||
}
|
||||
32
includes/elementor-tags/class-tag-job-location.php
Normal file
32
includes/elementor-tags/class-tag-job-location.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
/**
|
||||
* Elementor dynamic tag: Standort (job_location).
|
||||
*
|
||||
* @package DDHH_Job_Manager
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
class DDHH_JM_Tag_Job_Location extends \Elementor\Core\DynamicTags\Tag {
|
||||
|
||||
public function get_name(): string {
|
||||
return 'ddhh-job-location';
|
||||
}
|
||||
|
||||
public function get_title(): string {
|
||||
return 'Standort';
|
||||
}
|
||||
|
||||
public function get_group(): array {
|
||||
return array( DDHH_JM_Elementor_Tags::GROUP_SLUG );
|
||||
}
|
||||
|
||||
public function get_categories(): array {
|
||||
return array( \Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY );
|
||||
}
|
||||
|
||||
public function render(): void {
|
||||
$value = get_post_meta( get_the_ID(), 'job_location', true );
|
||||
echo wp_kses_post( $value );
|
||||
}
|
||||
}
|
||||
64
includes/elementor-tags/class-tag-job-logo.php
Normal file
64
includes/elementor-tags/class-tag-job-logo.php
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* Elementor dynamic tag: Logo (job_logo).
|
||||
*
|
||||
* Extends Data_Tag to return image data (id + url) for use in
|
||||
* Image widgets and other image-accepting controls.
|
||||
*
|
||||
* @package DDHH_Job_Manager
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
class DDHH_JM_Tag_Job_Logo extends \Elementor\Core\DynamicTags\Data_Tag {
|
||||
|
||||
public function get_name(): string {
|
||||
return 'ddhh-job-logo';
|
||||
}
|
||||
|
||||
public function get_title(): string {
|
||||
return 'Logo';
|
||||
}
|
||||
|
||||
public function get_group(): array {
|
||||
return array( DDHH_JM_Elementor_Tags::GROUP_SLUG );
|
||||
}
|
||||
|
||||
public function get_categories(): array {
|
||||
return array( \Elementor\Modules\DynamicTags\Module::IMAGE_CATEGORY );
|
||||
}
|
||||
|
||||
protected function register_controls(): void {
|
||||
$this->add_control(
|
||||
'fallback',
|
||||
array(
|
||||
'label' => 'Fallback',
|
||||
'type' => \Elementor\Controls_Manager::MEDIA,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function get_value( array $options = array() ): array {
|
||||
$image_id = get_post_meta( get_the_ID(), 'job_logo', true );
|
||||
|
||||
if ( $image_id ) {
|
||||
$url = wp_get_attachment_image_url( $image_id, 'full' );
|
||||
if ( $url ) {
|
||||
return array(
|
||||
'id' => (int) $image_id,
|
||||
'url' => $url,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$fallback = $this->get_settings( 'fallback' );
|
||||
if ( ! empty( $fallback['id'] ) ) {
|
||||
return $fallback;
|
||||
}
|
||||
|
||||
return array(
|
||||
'id' => 0,
|
||||
'url' => '',
|
||||
);
|
||||
}
|
||||
}
|
||||
41
includes/elementor-tags/class-tag-job-type.php
Normal file
41
includes/elementor-tags/class-tag-job-type.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
/**
|
||||
* Elementor dynamic tag: Art (job_type).
|
||||
*
|
||||
* Maps raw select values to German display labels.
|
||||
*
|
||||
* @package DDHH_Job_Manager
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
class DDHH_JM_Tag_Job_Type extends \Elementor\Core\DynamicTags\Tag {
|
||||
|
||||
private const LABELS = array(
|
||||
'vollzeit' => 'Vollzeit',
|
||||
'teilzeit' => 'Teilzeit',
|
||||
'ehrenamt' => 'Ehrenamt',
|
||||
);
|
||||
|
||||
public function get_name(): string {
|
||||
return 'ddhh-job-type';
|
||||
}
|
||||
|
||||
public function get_title(): string {
|
||||
return 'Art';
|
||||
}
|
||||
|
||||
public function get_group(): array {
|
||||
return array( DDHH_JM_Elementor_Tags::GROUP_SLUG );
|
||||
}
|
||||
|
||||
public function get_categories(): array {
|
||||
return array( \Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY );
|
||||
}
|
||||
|
||||
public function render(): void {
|
||||
$raw = get_post_meta( get_the_ID(), 'job_type', true );
|
||||
$label = self::LABELS[ $raw ] ?? $raw;
|
||||
echo esc_html( $label );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user