342 lines
13 KiB
PHP
342 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* Plugin Name: Markdown Parser WP
|
|
* Plugin URI: https://example.com/markdown-parser-wp
|
|
* Description: Ein WordPress-Plugin zum Extrahieren von YAML-Metadaten aus Markdown-Dateien, Konvertieren in JSON und Erstellen von WordPress-Beiträgen mit Gutenberg-Blöcken.
|
|
* Version: 1.1.0
|
|
* Author: Manus
|
|
* Author URI: https://example.com
|
|
* License: GPL-2.0+
|
|
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
|
* Text Domain: markdown-parser-wp
|
|
*/
|
|
|
|
// Wenn direkt aufgerufen, abbrechen
|
|
if (!defined('WPINC')) {
|
|
die;
|
|
}
|
|
|
|
// Plugin-Konstanten definieren
|
|
define('MARKDOWN_PARSER_WP_FILE', __FILE__);
|
|
define('MARKDOWN_PARSER_WP_VERSION', '1.1.0');
|
|
define('MARKDOWN_PARSER_WP_PATH', plugin_dir_path(__FILE__));
|
|
define('MARKDOWN_PARSER_WP_URL', plugin_dir_url(__FILE__));
|
|
|
|
// Composer-Autoloader laden
|
|
require_once plugin_dir_path(__FILE__) . 'vendor/autoload.php';
|
|
|
|
// Plugin-Klasse definieren
|
|
class Markdown_Parser_WP {
|
|
|
|
/**
|
|
* Plugin-Instanz
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Plugin-Version
|
|
*/
|
|
const VERSION = '1.1.0';
|
|
|
|
/**
|
|
* Singleton-Pattern: Instanz zurückgeben oder erstellen
|
|
*/
|
|
public static function get_instance() {
|
|
if (null === self::$instance) {
|
|
self::$instance = new self();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Konstruktor
|
|
*/
|
|
private function __construct() {
|
|
// Admin-Menü hinzufügen
|
|
add_action('admin_menu', array($this, 'add_admin_menu'));
|
|
|
|
// Admin-Assets laden
|
|
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
|
|
|
// Frontend-Assets laden
|
|
add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_scripts'));
|
|
|
|
// Admin-Klasse initialisieren
|
|
\MarkdownParserWP\Admin::init();
|
|
|
|
// Shortcodes initialisieren
|
|
\MarkdownParserWP\Shortcodes::init();
|
|
|
|
// Plugin aktivieren
|
|
register_activation_hook(__FILE__, array($this, 'activate'));
|
|
|
|
// Plugin deaktivieren
|
|
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
|
|
}
|
|
|
|
/**
|
|
* Plugin aktivieren
|
|
*/
|
|
public function activate() {
|
|
// Composer-Abhängigkeiten prüfen
|
|
$this->check_dependencies();
|
|
|
|
// Upload-Verzeichnis erstellen
|
|
$upload_dir = wp_upload_dir();
|
|
$plugin_upload_dir = $upload_dir['basedir'] . '/markdown-parser-wp';
|
|
|
|
if (!file_exists($plugin_upload_dir)) {
|
|
wp_mkdir_p($plugin_upload_dir);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Plugin deaktivieren
|
|
*/
|
|
public function deactivate() {
|
|
// Nichts zu tun
|
|
}
|
|
|
|
/**
|
|
* Abhängigkeiten prüfen
|
|
*/
|
|
private function check_dependencies() {
|
|
// Prüfen, ob Composer-Autoloader existiert
|
|
if (!file_exists(plugin_dir_path(__FILE__) . 'vendor/autoload.php')) {
|
|
add_action('admin_notices', function() {
|
|
echo '<div class="error"><p>';
|
|
echo 'Markdown Parser WP benötigt Composer-Abhängigkeiten. Bitte führe <code>composer install</code> im Plugin-Verzeichnis aus.';
|
|
echo '</p></div>';
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Admin-Menü hinzufügen
|
|
*/
|
|
public function add_admin_menu() {
|
|
add_menu_page(
|
|
__('Markdown Parser', 'markdown-parser-wp'),
|
|
__('Markdown Parser', 'markdown-parser-wp'),
|
|
'manage_options',
|
|
'markdown-parser-wp',
|
|
array($this, 'render_admin_page'),
|
|
'dashicons-media-text',
|
|
100
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Admin-Skripte und Styles laden
|
|
*/
|
|
public function enqueue_admin_scripts($hook) {
|
|
if ('toplevel_page_markdown-parser-wp' !== $hook) {
|
|
return;
|
|
}
|
|
|
|
// CSS laden
|
|
wp_enqueue_style(
|
|
'markdown-parser-wp-admin',
|
|
plugin_dir_url(__FILE__) . 'assets/css/admin.css',
|
|
array(),
|
|
self::VERSION
|
|
);
|
|
|
|
// JavaScript laden
|
|
wp_enqueue_script(
|
|
'markdown-parser-wp-admin',
|
|
plugin_dir_url(__FILE__) . 'assets/js/admin.js',
|
|
array('jquery'),
|
|
self::VERSION,
|
|
true
|
|
);
|
|
|
|
// AJAX-URL für JavaScript bereitstellen
|
|
wp_localize_script(
|
|
'markdown-parser-wp-admin',
|
|
'markdownParserWp',
|
|
array(
|
|
'ajaxUrl' => admin_url('admin-ajax.php'),
|
|
'nonce' => wp_create_nonce('markdown_parser_wp_nonce')
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Frontend-Skripte und Styles laden
|
|
*/
|
|
public function enqueue_frontend_scripts() {
|
|
// CSS für Frontend-Shortcode-Ausgabe laden
|
|
wp_enqueue_style(
|
|
'markdown-parser-wp-frontend',
|
|
plugin_dir_url(__FILE__) . 'assets/css/frontend.css',
|
|
array(),
|
|
self::VERSION
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Admin-Seite rendern
|
|
*/
|
|
public function render_admin_page() {
|
|
// Kategorien für Dropdown holen
|
|
$categories = get_categories(array(
|
|
'hide_empty' => false,
|
|
'orderby' => 'name',
|
|
'order' => 'ASC'
|
|
));
|
|
|
|
// Post-Typen für Dropdown holen
|
|
$post_types = get_post_types(array(
|
|
'public' => true
|
|
), 'objects');
|
|
|
|
?>
|
|
<div class="wrap">
|
|
<h1><?php echo esc_html(get_admin_page_title()); ?></h1>
|
|
|
|
<div class="card">
|
|
<h2><?php _e('Markdown-Datei parsen', 'markdown-parser-wp'); ?></h2>
|
|
|
|
<form id="markdown-parser-form">
|
|
<table class="form-table">
|
|
<tr>
|
|
<th scope="row">
|
|
<label for="markdown-url"><?php _e('Markdown-URL', 'markdown-parser-wp'); ?></label>
|
|
</th>
|
|
<td>
|
|
<input type="url" id="markdown-url" name="markdown-url" class="regular-text"
|
|
placeholder="https://example.com/file.md"
|
|
value="https://git.rpi-virtuell.de/Comenius-Institut/FOERBICO/raw/branch/main/Website/content/posts/2025-03-20-Workshop-KlimaOER/index.md">
|
|
<p class="description">
|
|
<?php _e('URL zu einer Markdown-Datei mit YAML-Frontmatter', 'markdown-parser-wp'); ?>
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p class="submit">
|
|
<button type="submit" id="parse-markdown-button" class="button button-primary">
|
|
<?php _e('Markdown parsen', 'markdown-parser-wp'); ?>
|
|
</button>
|
|
</p>
|
|
</form>
|
|
</div>
|
|
|
|
<div id="parsing-results" style="display: none;">
|
|
<div class="card">
|
|
<h2><?php _e('JSON-Metadaten', 'markdown-parser-wp'); ?></h2>
|
|
<div class="inside">
|
|
<pre id="json-output"></pre>
|
|
<p>
|
|
<button id="copy-json-button" class="button">
|
|
<?php _e('JSON kopieren', 'markdown-parser-wp'); ?>
|
|
</button>
|
|
<button id="download-json-button" class="button">
|
|
<?php _e('JSON herunterladen', 'markdown-parser-wp'); ?>
|
|
</button>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<h2><?php _e('Markdown-Inhalt', 'markdown-parser-wp'); ?></h2>
|
|
<div class="inside">
|
|
<pre id="markdown-output"></pre>
|
|
<p>
|
|
<button id="copy-markdown-button" class="button">
|
|
<?php _e('Markdown kopieren', 'markdown-parser-wp'); ?>
|
|
</button>
|
|
<button id="download-markdown-button" class="button">
|
|
<?php _e('Markdown herunterladen', 'markdown-parser-wp'); ?>
|
|
</button>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="post-creation-options" class="card">
|
|
<h2><?php _e('WordPress-Beitrag erstellen', 'markdown-parser-wp'); ?></h2>
|
|
<div class="inside">
|
|
<p><?php _e('Erstelle einen WordPress-Beitrag aus den geparsten Daten:', 'markdown-parser-wp'); ?></p>
|
|
|
|
<form id="create-post-form">
|
|
<input type="hidden" id="markdown-url-hidden" name="markdown-url-hidden" value="">
|
|
|
|
<table class="form-table">
|
|
<tr>
|
|
<th scope="row">
|
|
<label for="post-type"><?php _e('Beitragstyp', 'markdown-parser-wp'); ?></label>
|
|
</th>
|
|
<td>
|
|
<select id="post-type" name="post-type">
|
|
<?php foreach ($post_types as $post_type): ?>
|
|
<option value="<?php echo esc_attr($post_type->name); ?>">
|
|
<?php echo esc_html($post_type->labels->singular_name); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">
|
|
<label for="post-status"><?php _e('Status', 'markdown-parser-wp'); ?></label>
|
|
</th>
|
|
<td>
|
|
<select id="post-status" name="post-status">
|
|
<option value="draft"><?php _e('Entwurf', 'markdown-parser-wp'); ?></option>
|
|
<option value="publish"><?php _e('Veröffentlicht', 'markdown-parser-wp'); ?></option>
|
|
<option value="pending"><?php _e('Ausstehender Review', 'markdown-parser-wp'); ?></option>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">
|
|
<label for="category-id"><?php _e('Kategorie', 'markdown-parser-wp'); ?></label>
|
|
</th>
|
|
<td>
|
|
<select id="category-id" name="category-id">
|
|
<option value="0"><?php _e('Keine Kategorie', 'markdown-parser-wp'); ?></option>
|
|
<?php foreach ($categories as $category): ?>
|
|
<option value="<?php echo esc_attr($category->term_id); ?>">
|
|
<?php echo esc_html($category->name); ?>
|
|
</option>
|
|
<?php endforeach; ?>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">
|
|
<label for="import-images"><?php _e('Bilder importieren', 'markdown-parser-wp'); ?></label>
|
|
</th>
|
|
<td>
|
|
<input type="checkbox" id="import-images" name="import-images" checked>
|
|
<span class="description">
|
|
<?php _e('Bilder in die WordPress-Mediathek importieren', 'markdown-parser-wp'); ?>
|
|
</span>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p class="submit">
|
|
<button type="submit" id="create-post-button" class="button button-primary">
|
|
<?php _e('Beitrag erstellen', 'markdown-parser-wp'); ?>
|
|
</button>
|
|
</p>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="result-message" class="notice" style="display: none;"></div>
|
|
</div>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
// Plugin initialisieren
|
|
function markdown_parser_wp_init() {
|
|
return Markdown_Parser_WP::get_instance();
|
|
}
|
|
|
|
// Plugin starten
|
|
markdown_parser_wp_init();
|