wp-md-rest-import/markdown-parser-wp.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();