alberello/alberello.php

135 lines
4.1 KiB
PHP
Raw Normal View History

2024-11-09 19:12:24 +01:00
<?php
/**
* Plugin Name: Albërellì
* Plugin URI: https://www.your-site.com/
* Description: linktree-like interface for wordpress
* Version: 0.1
* Author: boyska+pinke
* Author URI: https://www.your-site.com/
**/
define('ALB_LINK_URI', 'links');
/* Render {{{ */
function parse_code($text) {
$links = [];
$regexp = '@^(.*)\s+(https?://.*)$@';
foreach(explode("\n", $text) as $line) {
$ret = preg_match($regexp, rtrim($line, "\n\r"), $matches);
if($ret === false || count($matches) < 3) {
continue;
}
$link = [
'text' => rtrim($matches[1]),
'url' => $matches[2]
];
$links[] = $link;
}
return $links;
}
function alb_request() {
$is_front = get_option('alb_option_front');
$uri = $is_front ? '/' : '/' . ALB_LINK_URI;
if($_SERVER["REQUEST_URI"] == $uri ||
$_SERVER["REQUEST_URI"] == '/' . ALB_LINK_URI
) {
$raw = get_option('alb_option_menucode');
$links = parse_code($raw);
// XXX: fai un foglio di stile e una grafica puffosa
echo '<html><head><link href="' . plugins_url('style.css', __FILE__) . '" rel="stylesheet" />';
echo "</head><body><main>\n";
echo "<header><h1>" . get_bloginfo('name') .
"</h1><small class=\"description\">" . get_bloginfo('description') . "</small></header>";
echo "<div class=\"links\">";
foreach($links as $link) {
echo '<a class="link" href="' . esc_html($link['url']) . '">' . esc_html($link['text']) . "</a>";
}
echo "</div>";
echo "</main></body></html>";
exit();
}
}
add_action('init', 'alb_request');
/* Render }}} */
/* Settings page {{{ */
function alb_settings_menu() {
add_options_page('Modifica menu albero', 'Albero dei link', 'activate_plugins', 'alb_settings', 'alb_settings_render', 5);
}
function alb_register_settings() {
register_setting('alb_options', 'alb_option_menucode', 'alb_validate_options');
register_setting('alb_options', 'alb_option_front', 'alb_validate_options');
add_settings_section('alb_menu', 'Menu', 'alb_settings_section_menu', 'alb_settings');
add_settings_field('alb_menucode', 'Versione testuale del menu', 'alb_settings_field_menucode', 'alb_settings', 'alb_menu');
add_settings_field('alb_front', 'Il menu deve sovrascrivere l\'homepage?', 'alb_settings_field_front', 'alb_settings', 'alb_menu');
}
add_action('admin_init', 'alb_register_settings');
function alb_settings() {
}
function alb_settings_render() {
?>
<h2>Albero dei link</h2>
<form action="options.php" method="post">
<?php
settings_fields('alb_options');
do_settings_sections('alb_settings');
?>
<input name="submit" class="button button-primary" type="submit" value="Save" />
</form>
<?php
}
function alb_settings_section_menu() {
$link = get_site_url();
if(!get_option('alb_option_front')) {
$link .= '/' . ALB_LINK_URI;
}
?>
<div>
Il tuo menu è disponibile all'indirizzo <a href="<?php echo $link; ?>"><?php echo esc_html($link); ?></a>
</div>
<?php
}
function alb_settings_field_menucode() {
$value = get_option('alb_option_menucode');
if($value === false) {
$value = "My website " . get_site_url();
}
?>
<textarea style="width: 100%;" id="alb_option_menucode" name="alb_option_menucode" rows="10" wrap="off" type="text" >
<?php
echo esc_html($value);
?>
</textarea>
<div>
<p>Per ogni link che vuoi aggiungere, scrivi il titolo seguito dall'URL.
Vai a capo dopo ogni link.</p>
<p>Esempio:
<pre>
Il mio utente mastodon https://mastodon.bida.im/@noblogs
Il mio sito preferito https://autistici.org/
Un'ottima enciclopedia https://it.wikipedia.org/
</pre></p>
<p>Le righe vuote (o non valide) vengono ignorate</p>
</div>
<?php
}
function alb_settings_field_front() {
$value = get_option('alb_option_front');
?>
<input type="checkbox" <?php echo $value ? 'checked' : '' ?> name="alb_option_front" id="alb_option_front" />
<?php
}
function alb_validate_options( $input ) {
// XXX: protesta quando ci sono linee non vuote che però hanno errori
return $input;
}
add_action('admin_menu', 'alb_settings_menu');
/* Settings page }}} */