<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Allgemein News Kategorie - Homepage-nach-Preis</title>
	<atom:link href="https://homepage-nach-preis.de/thema/allgemein/feed/" rel="self" type="application/rss+xml" />
	<link>https://homepage-nach-preis.de/thema/allgemein/</link>
	<description>★ Responsive Webdesigner Homepage erstellen lassen, bereits ab 299 Euro professionelle Webseite. ✓ Google-Optimiert ✓ Mobil-Optimiert &#124; Webdesign &#38; Seo</description>
	<lastBuildDate>Fri, 06 Sep 2024 16:40:50 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://homepage-nach-preis.de/wp-content/uploads/2021/02/cropped-icon-150x150.png</url>
	<title>Allgemein News Kategorie - Homepage-nach-Preis</title>
	<link>https://homepage-nach-preis.de/thema/allgemein/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Simple Blockchain Beispiel mit Miner</title>
		<link>https://homepage-nach-preis.de/2024/09/06/simple-blockchain-beispiel-mit-miner/</link>
					<comments>https://homepage-nach-preis.de/2024/09/06/simple-blockchain-beispiel-mit-miner/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Fri, 06 Sep 2024 16:17:14 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Blockchain]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[Miner]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8348</guid>

					<description><![CDATA[<p>Wie funktioniert eine Kryptowährung bzw. eine Blockchain mit einem Proof of Work Mechanismus (Mining). Ihr Gerät unterstützt eine Wiedergabe des Videos nicht. Github: https://github.com/HNP-Christopher-Rohde/hnp-example-blockchain-with-miner Blockchain Die Blockchain in diesem System ist eine auf Blöcken basierende Kette, die kryptografisch gesichert ist. Jeder Block enthält folgende Informationen: Index: Die Position des Blocks in der Kette. Zeitstempel: Der Zeitpunkt, zu dem der Block erstellt wurde (in Unix-Zeit). Daten: Die im Block gespeicherten Informationen (in binärer Form). Vorheriger Hash: Der Hash des vorhergehenden Blocks, der die Verbindung zu diesem sicherstellt. Hash: Der eigene Hash des Blocks, der durch den Hashing-Algorithmus SHA-256 berechnet wird. Nonce: Eine Zahl, die während des Minings variiert wird, um den Hash zu finden, der den Anforderungen der Schwierigkeit entspricht. Die Blockchain wird mit einem Genesis-Block initialisiert. Jeder neue Block wird durch einen Mining-Prozess erstellt, der den Hash so anpasst, dass er den Schwierigkeitsanforderungen (Difficulty) entspricht, d. h. der Hash muss mit einer bestimmten Anzahl von Nullen beginnen. Die Schwierigkeit passt sich dynamisch an, basierend auf der Zeit, die für die Erstellung der letzten Blöcke benötigt wurde. Validität der Blockchain: Jeder Block in der Kette wird überprüft, um sicherzustellen, dass der Hash korrekt ist und der Hash des vorherigen Blocks mit....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/09/06/simple-blockchain-beispiel-mit-miner/">Simple Blockchain Beispiel mit Miner</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Wie funktioniert eine Kryptowährung bzw. eine Blockchain mit einem Proof of Work Mechanismus (Mining). </strong></p>
<div class="video-own" style="padding-top:5px;"><video style="width:99%;" poster="https://homepage-nach-preis.de/wp-content/uploads/2024/09/blockchain.jpg" controls controlsList="nodownload" preload="none"><source src="https://homepage-nach-preis.de/wp-content/uploads/2024/09/2024-09-06-18-38-00.mp4" type="video/mp4"/>Ihr Gerät unterstützt eine Wiedergabe des Videos nicht.</video></div>
<p><strong>Github:</strong> <a href="https://github.com/HNP-Christopher-Rohde/hnp-example-blockchain-with-miner" target="_blank" rel="nofollow noopener">https://github.com/HNP-Christopher-Rohde/hnp-example-blockchain-with-miner</a></p>
<h4>Blockchain</h4>
<p>Die Blockchain in diesem System ist eine auf Blöcken basierende Kette, die kryptografisch gesichert ist. Jeder Block enthält folgende Informationen:</p>
<p>    Index: Die Position des Blocks in der Kette.<br />
    Zeitstempel: Der Zeitpunkt, zu dem der Block erstellt wurde (in Unix-Zeit).<br />
    Daten: Die im Block gespeicherten Informationen (in binärer Form).<br />
    Vorheriger Hash: Der Hash des vorhergehenden Blocks, der die Verbindung zu diesem sicherstellt.<br />
    Hash: Der eigene Hash des Blocks, der durch den Hashing-Algorithmus SHA-256 berechnet wird.<br />
    Nonce: Eine Zahl, die während des Minings variiert wird, um den Hash zu finden, der den Anforderungen der Schwierigkeit entspricht.</p>
<p>Die Blockchain wird mit einem Genesis-Block initialisiert. Jeder neue Block wird durch einen Mining-Prozess erstellt, der den Hash so anpasst, dass er den Schwierigkeitsanforderungen (Difficulty) entspricht, d. h. der Hash muss mit einer bestimmten Anzahl von Nullen beginnen. Die Schwierigkeit passt sich dynamisch an, basierend auf der Zeit, die für die Erstellung der letzten Blöcke benötigt wurde.</p>
<p><strong>Validität der Blockchain:</strong></p>
<p>    Jeder Block in der Kette wird überprüft, um sicherzustellen, dass der Hash korrekt ist und der Hash des vorherigen Blocks mit dem gespeicherten previous_hash übereinstimmt.<br />
    Es wird außerdem geprüft, ob der Block die Schwierigkeit (Difficulty) erfüllt, bevor er zur Kette hinzugefügt wird.</p>
<p>Die Blockchain speichert die Blöcke auf der Festplatte (z. B. in der Datei blockchain.json) und bietet APIs für den Empfang und das Senden neuer Blöcke zwischen Peers.</p>
<p><strong>Blockchain:</strong></p>
<pre>
use serde::{Serialize, Deserialize};
use std::collections::VecDeque;
use std::fs;
use sha2::Digest;
use hex;
use std::time::{SystemTime, UNIX_EPOCH};
use reqwest;
use warp::Filter;
use log::{info, error};
use std::env;
use std::sync::{Arc, Mutex};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Block {
    pub index: u64,
    pub timestamp: u64,
    pub data: Vec&#x3C;u8&#x3E;,
    pub previous_hash: String,
    pub hash: String,
    pub nonce: u64,
}

impl Block {
    pub fn new(index: u64, data: Vec&#x3C;u8&#x3E;, previous_hash: String) -&#x3E; Self {
        let timestamp = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs();
        let mut block = Block {
            index,
            timestamp,
            data,
            previous_hash,
            hash: String::new(),
            nonce: 0,
        };
        block.hash = block.calculate_hash();
        info!(&#x22;Created new block: {:?}&#x22;, block);
        block
    }

    pub fn calculate_hash(&#x26;self) -&#x3E; String {
        let mut hasher = sha2::Sha256::new();
        hasher.update(format!(&#x22;{}{}{}{}{}&#x22;, self.index, self.timestamp, hex::encode(&#x26;self.data), self.previous_hash, self.nonce));
        let result = hasher.finalize();
        hex::encode(result)
    }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Blockchain {
    pub chain: VecDeque&#x3C;Block&#x3E;,
    pub difficulty: u32,
    pub adjustment_interval: u64,
    pub target_block_time: u64,
    pub last_difficulty_update: u64,
}

impl Blockchain {
    pub fn new(difficulty: u32, adjustment_interval: u64, target_block_time: u64) -&#x3E; Self {
        let mut chain = VecDeque::new();
        chain.push_back(create_genesis_block());
        info!(&#x22;Blockchain initialized with genesis block&#x22;);
        Blockchain {
            chain,
            difficulty,
            adjustment_interval,
            target_block_time,
            last_difficulty_update: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(),
        }
    }

    pub fn add_block(&#x26;mut self, data: Vec&#x3C;u8&#x3E;) {
        let previous_block = self.chain.back().unwrap();
        let new_block = mine_block(previous_block, data, self.difficulty);
        info!(&#x22;Adding new block: {:?}&#x22;, new_block);
        self.chain.push_back(new_block);
    
        // Update difficulty if needed
        if (self.chain.len() as u64) % self.adjustment_interval == 0 {
            self.update_difficulty_based_on_time();
        }
    
        if let Err(e) = self.save_to_file(&#x22;blockchain.json&#x22;) {
            error!(&#x22;Failed to save blockchain after adding block: {}&#x22;, e);
        }
    }
    
    pub fn is_valid(&#x26;self) -&#x3E; bool {
        for i in 1..self.chain.len() {
            let current = &#x26;self.chain[i];
            let previous = &#x26;self.chain[i - 1];

            if current.hash != current.calculate_hash() {
                error!(&#x22;Block {} has invalid hash&#x22;, current.index);
                return false;
            }

            if current.previous_hash != previous.hash {
                error!(&#x22;Block {} has invalid previous hash&#x22;, current.index);
                return false;
            }

            if !meets_difficulty(&#x26;current.hash, self.difficulty) {
                error!(&#x22;Block {} does not meet difficulty&#x22;, current.index);
                return false;
            }
        }
        true
    }

    pub fn save_to_file(&#x26;self, filename: &#x26;str) -&#x3E; std::io::Result&#x3C;()&#x3E; {
        let serialized = serde_json::to_string(self)
            .expect(&#x22;Serialization failed&#x22;);
        fs::write(filename, serialized).map_err(|e| {
            error!(&#x22;Failed to write blockchain to file: {}&#x22;, e);
            e
        })?;
        info!(&#x22;Blockchain saved to file: {}&#x22;, filename);
        Ok(())
    }
    
    pub fn load_from_file(filename: &#x26;str) -&#x3E; std::io::Result&#x3C;Self&#x3E; {
        match fs::read_to_string(filename) {
            Ok(data) if !data.is_empty() =&#x3E; {
                match serde_json::from_str::&#x3C;Blockchain&#x3E;(&#x26;data) {
                    Ok(blockchain) =&#x3E; {
                        info!(&#x22;Blockchain loaded from file: {}&#x22;, filename);
                        Ok(blockchain)
                    }
                    Err(e) =&#x3E; {
                        info!(&#x22;Failed to deserialize blockchain from file, creating a new one: {}&#x22;, e);
                        let (difficulty, adjustment_interval, target_block_time) = load_config();
                        Ok(Blockchain::new(difficulty, adjustment_interval, target_block_time))
                    }
                }
            }
            _ =&#x3E; {
                info!(&#x22;Blockchain file is empty or not found. Creating a new blockchain.&#x22;);
                let (difficulty, adjustment_interval, target_block_time) = load_config();
                Ok(Blockchain::new(difficulty, adjustment_interval, target_block_time))
            }
        }
    }
    
    pub async fn broadcast_new_block(&#x26;self, block: &#x26;Block, peers: &#x26;[&#x26;str]) -&#x3E; reqwest::Result&#x3C;()&#x3E; {
        for peer in peers {
            let url = format!(&#x22;{}/new-block&#x22;, peer);
            info!(&#x22;Broadcasting new block to peer: {}&#x22;, url);
            let result = reqwest::Client::new()
                .post(&#x26;url)
                .json(&#x26;block)
                .send()
                .await;

            match result {
                Ok(_) =&#x3E; info!(&#x22;Successfully sent block to {}&#x22;, url),
                Err(e) =&#x3E; error!(&#x22;Failed to send block to {}: {:?}&#x22;, url, e),
            }
        }
        Ok(())
    }
</pre>
<pre>
    pub fn add_block_from_request(&#x26;mut self, block: Block) -&#x3E; bool {
        let previous_block = self.chain.back().unwrap();

        info!(&#x22;Received block: {:?}&#x22;, block);
        info!(&#x22;Last block in chain: {:?}&#x22;, previous_block);

        // Additional validation for the timestamp
        if block.timestamp &#x3C;= previous_block.timestamp {
            error!(&#x22;Block timestamp is not valid&#x22;);
            return false;
        }

        let is_valid = block.index == previous_block.index + 1
            &#x26;&#x26; block.previous_hash == previous_block.hash
            &#x26;&#x26; block.hash == block.calculate_hash()
            &#x26;&#x26; meets_difficulty(&#x26;block.hash, self.difficulty);
        
        if is_valid {
            info!(&#x22;Valid block received and added to chain&#x22;);
            self.chain.push_back(block);
            if let Err(e) = self.save_to_file(&#x22;blockchain.json&#x22;) {
                error!(&#x22;Failed to save blockchain after adding block: {}&#x22;, e);
            }
        } else {
            error!(&#x22;Invalid block received: \n\
                    Index: {} \n\
                    Previous Hash: {} \n\
                    Expected Previous Hash: {} \n\
                    Hash: {} \n\
                    Calculated Hash: {} \n\
                    Difficulty Met: {}&#x22;,
                block.index,
                block.previous_hash,
                previous_block.hash,
                block.hash,
                block.calculate_hash(),
                meets_difficulty(&#x26;block.hash, self.difficulty));
        }
        
        is_valid
    }
    
    pub fn update_difficulty_based_on_time(&#x26;mut self) {
        let length = self.chain.len() as u64;
        info!(&#x22;Chain length: {}&#x22;, length);
        
        if length &#x3E;= self.adjustment_interval {
            let interval_start_block = &#x26;self.chain[self.chain.len() - self.adjustment_interval as usize];
            let interval_end_block = self.chain.back().unwrap();
    
            let time_taken = interval_end_block.timestamp - interval_start_block.timestamp;
            let expected_time = self.adjustment_interval * self.target_block_time;
    
            info!(&#x22;Time taken for the last {} blocks: {} seconds&#x22;, self.adjustment_interval, time_taken);
            info!(&#x22;Expected time for the last {} blocks: {} seconds&#x22;, self.adjustment_interval, expected_time);
    
            if time_taken &#x3C; expected_time / 2 {
                self.difficulty += 1;
                info!(&#x22;Difficulty increased to {}&#x22;, self.difficulty);
            } else if time_taken &#x3E; expected_time * 2 {
                if self.difficulty &#x3E; 1 {
                    self.difficulty -= 1;
                    info!(&#x22;Difficulty decreased to {}&#x22;, self.difficulty);
                }
            } else {
                info!(&#x22;Difficulty remains at {}&#x22;, self.difficulty);
            }
    
            // Update the last difficulty update timestamp
            self.last_difficulty_update = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs();
        } else {
            info!(&#x22;Not enough blocks to adjust difficulty.&#x22;);
        }
    }
    
    
    pub fn update_difficulty(&#x26;mut self, new_difficulty: u32) {
        self.difficulty = new_difficulty;
        info!(&#x22;Difficulty updated to {}&#x22;, new_difficulty);
        if let Err(e) = self.save_to_file(&#x22;blockchain.json&#x22;) {
            error!(&#x22;Failed to save blockchain after updating difficulty: {}&#x22;, e);
        }
    }
}

pub fn create_genesis_block() -&#x3E; Block {
    Block::new(0, &#x22;Genesis Block&#x22;.as_bytes().to_vec(), &#x22;0&#x22;.to_string())
}

fn meets_difficulty(hash: &#x26;str, difficulty: u32) -&#x3E; bool {
    let target = vec![0u8; difficulty as usize];
    let hash_bytes = hex::decode(hash).expect(&#x22;Hex decode failed&#x22;);
    hash_bytes.len() &#x3E;= target.len() &#x26;&#x26; hash_bytes.starts_with(&#x26;target)
}

fn mine_block(previous_block: &#x26;Block, data: Vec&#x3C;u8&#x3E;, difficulty: u32) -&#x3E; Block {
    let mut new_block = Block::new(previous_block.index + 1, data.clone(), previous_block.hash.clone());

    let mut attempt = 0;

    while !meets_difficulty(&#x26;new_block.hash, difficulty) {
        new_block.nonce += 1;
        new_block.hash = new_block.calculate_hash();

        attempt += 1;
        if attempt % 100 == 0 {
            println!(&#x22;Attempt {}: Trying hash: {}&#x22;, attempt, new_block.hash);
        }
    }

    new_block
}


fn load_config() -&#x3E; (u32, u64, u64) {
    use serde::Deserialize;
    #[derive(Deserialize)]
    struct Config {
        initial_difficulty: u32,
        adjustment_interval: u64,
        target_block_time: u64,
    }

    let data = fs::read_to_string(&#x22;config.json&#x22;).expect(&#x22;Unable to read config file&#x22;);
    let config: Config = serde_json::from_str(&#x26;data).expect(&#x22;Unable to parse config file&#x22;);
    (config.initial_difficulty, config.adjustment_interval, config.target_block_time)
}

#[tokio::main]
async fn main() {
    env::set_var(&#x22;RUST_LOG&#x22;, &#x22;info&#x22;);
    env_logger::init();

    let (initial_difficulty, adjustment_interval, target_block_time) = load_config();
    let blockchain = Arc::new(Mutex::new(
        Blockchain::load_from_file(&#x22;blockchain.json&#x22;).unwrap_or_else(|_| Blockchain::new(initial_difficulty, adjustment_interval, target_block_time))
    ));

    let blockchain_filter = warp::any().map(move || blockchain.clone());

    let new_block = warp::post()
        .and(warp::path(&#x22;new-block&#x22;))
        .and(warp::body::json())
        .and(blockchain_filter.clone())
        .map(|block: Block, blockchain: Arc&#x3C;Mutex&#x3C;Blockchain&#x3E;&#x3E;| {
            let mut blockchain = blockchain.lock().unwrap();
            let response = if blockchain.add_block_from_request(block) {
                &#x22;Block added successfully&#x22;
            } else {
                &#x22;Invalid block&#x22;
            };
            response
        });

    let difficulty = warp::get()
        .and(warp::path(&#x22;difficulty&#x22;))
        .map(move || format!(&#x22;Difficulty: {}&#x22;, initial_difficulty));

    let set_difficulty = warp::post()
        .and(warp::path(&#x22;set-difficulty&#x22;))
        .and(warp::body::json())
        .and(blockchain_filter.clone())
        .map(|_new_difficulty: u32, _blockchain: Arc&#x3C;Mutex&#x3C;Blockchain&#x3E;&#x3E;| {
            // Ignoring difficulty change here, as it&#x27;s handled externally
            format!(&#x22;Difficulty updated to {}&#x22;, _new_difficulty)
        });

    let last_block = warp::get()
        .and(warp::path(&#x22;last-block&#x22;))
        .and(blockchain_filter.clone())
        .map(|blockchain: Arc&#x3C;Mutex&#x3C;Blockchain&#x3E;&#x3E;| {
            let blockchain = blockchain.lock().unwrap();
            let last_block = blockchain.chain.back().cloned().unwrap_or_else(|| create_genesis_block());
            warp::reply::json(&#x26;last_block)
        });

    let routes = new_block.or(difficulty).or(set_difficulty).or(last_block);

    info!(&#x22;Starting server at http://127.0.0.1:8000&#x22;);
    warp::serve(routes).run(([127, 0, 0, 1], 8000)).await;
}

</pre>
<h4>Miner</h4>
<p>Der Miner ist für die Erstellung neuer Blöcke in der Blockchain verantwortlich. Er arbeitet nach einem Proof-of-Work-Mechanismus, bei dem der Miner eine nonce-Nummer anpasst, bis ein gültiger Hash gefunden wird, der den Schwierigkeitsanforderungen entspricht.</p>
<p><strong>Ablauf des Mining-Prozesses:</strong></p>
<p>    Der Miner fragt den letzten Block der Blockchain von einem Server ab.<br />
    Der Miner fragt die aktuelle Schwierigkeit vom Server ab.<br />
    Ein neuer Block wird erstellt, indem die Daten des vorherigen Blocks verwendet werden, sowie neue Transaktionsdaten.<br />
    Der Miner berechnet den Hash des neuen Blocks durch Anpassung der nonce, bis der Hash die Schwierigkeit erfüllt (d. h., der Hash beginnt mit einer bestimmten Anzahl von Nullen).<br />
    Sobald ein gültiger Block gefunden wurde, wird er an den Server gesendet, der ihn zur Blockchain hinzufügt.</p>
<p>Der Mining-Prozess läuft in einem Loop, sodass kontinuierlich nach neuen Blöcken gesucht wird, die der Blockchain hinzugefügt werden können.</p>
<pre>
use serde::{Serialize, Deserialize};
use sha2::{Sha256, Digest};
use std::time::{SystemTime, UNIX_EPOCH};
use reqwest;
use hex;
use anyhow::{Result, Context};
use tokio::task;

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Block {
    pub index: u64,
    pub timestamp: u64,
    pub data: Vec&#x3C;u8&#x3E;,
    pub previous_hash: String,
    pub hash: String,
    pub nonce: u64,
}

impl Block {
    pub fn new(index: u64, data: Vec&#x3C;u8&#x3E;, previous_hash: String) -&#x3E; Self {
        let timestamp = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs();
        let mut block = Block {
            index,
            timestamp,
            data,
            previous_hash,
            hash: String::new(),
            nonce: 0,
        };
        block.hash = block.calculate_hash();
        block
    }

    pub fn calculate_hash(&#x26;self) -&#x3E; String {
        let mut hasher = Sha256::new();
        hasher.update(format!(&#x22;{}{}{}{}{}&#x22;, self.index, self.timestamp, hex::encode(&#x26;self.data), self.previous_hash, self.nonce));
        let result = hasher.finalize();
        hex::encode(result)
    }
}

fn meets_difficulty(hash: &#x26;str, difficulty: u32) -&#x3E; bool {
    let target = vec![0u8; difficulty as usize];
    let hash_bytes = hex::decode(hash).expect(&#x22;Hex decode failed&#x22;);
    hash_bytes.starts_with(&#x26;target)
}

async fn mine_block(previous_block: &#x26;Block, data: Vec&#x3C;u8&#x3E;, difficulty: u32) -&#x3E; Block {
    let mut new_block = Block::new(previous_block.index + 1, data.clone(), previous_block.hash.clone());

    // Parallel mining using multiple threads
    let mining_task = task::spawn_blocking(move || {
        let mut attempt = 0;
        while !meets_difficulty(&#x26;new_block.hash, difficulty) {
            new_block.nonce += 1;
            new_block.hash = new_block.calculate_hash();

            attempt += 1;
            if attempt % 100 == 0 {
                println!(&#x22;Attempt {}: Trying hash: {}&#x22;, attempt, new_block.hash);
            }
        }

        new_block
    });

    mining_task.await.unwrap()
}

async fn get_last_block_from_server() -&#x3E; Result&#x3C;Block&#x3E; {
    let client = reqwest::Client::new();
    let url = &#x22;http://localhost:8000/last-block&#x22;;

    let res = client.get(url)
        .send()
        .await
        .context(&#x22;Failed to send request to get last block&#x22;)?;

    let last_block: Block = res.json().await
        .context(&#x22;Failed to parse last block&#x22;)?;
    Ok(last_block)
}

async fn send_block_to_server(block: &#x26;Block) -&#x3E; Result&#x3C;()&#x3E; {
    let client = reqwest::Client::new();
    let url = &#x22;http://localhost:8000/new-block&#x22;;

    println!(&#x22;Sending block: {:?}&#x22;, block);

    let res = client.post(url)
        .json(block)
        .send()
        .await
        .context(&#x22;Failed to send request to post new block&#x22;)?;

    let status = res.status();
    let body = res.text().await
        .context(&#x22;Failed to read response text&#x22;)?;

    if status.is_success() {
        println!(&#x22;Block successfully sent to server.&#x22;);
    } else {
        println!(&#x22;Failed to send block to server: {} - {}&#x22;, status, body);
    }

    Ok(())
}
</pre>
<pre>
async fn get_difficulty_from_server() -&#x3E; Result&#x3C;u32&#x3E; {
    let client = reqwest::Client::new();
    let url = &#x22;http://localhost:8000/difficulty&#x22;;

    let res = client.get(url)
        .send()
        .await
        .context(&#x22;Failed to send request to get difficulty&#x22;)?;

    let difficulty_str = res.text().await
        .context(&#x22;Failed to read difficulty response&#x22;)?;
    let difficulty = difficulty_str.trim_start_matches(&#x22;Difficulty: &#x22;)
        .parse::&#x3C;u32&#x3E;()
        .context(&#x22;Failed to parse difficulty&#x22;)?;

    Ok(difficulty)
}

async fn display_difficulty() -&#x3E; Result&#x3C;()&#x3E; {
    let difficulty = get_difficulty_from_server().await
        .context(&#x22;Error retrieving difficulty from server&#x22;)?;

    println!(&#x22;Current Difficulty: {}&#x22;, difficulty);

    Ok(())
}

#[tokio::main]
async fn main() -&#x3E; Result&#x3C;()&#x3E; {
    loop {
        // Anzeige der aktuellen Schwierigkeit
        display_difficulty().await
            .context(&#x22;Error displaying difficulty&#x22;)?;

        // Hol die Schwierigkeit vom Server
        let difficulty = get_difficulty_from_server().await
            .context(&#x22;Error retrieving difficulty from server&#x22;)?;

        // Hol den letzten Block vom Server
        let previous_block = get_last_block_from_server().await
            .context(&#x22;Error retrieving last block from server&#x22;)?;

        let data = b&#x22;Block data&#x22;.to_vec();
        let new_block = mine_block(&#x26;previous_block, data, difficulty).await;

        send_block_to_server(&#x26;new_block).await
            .context(&#x22;Error sending block to server&#x22;)?;

        // Warte eine gewisse Zeit, bevor der n&#xE4;chste Block erstellt wird
        tokio::time::sleep(tokio::time::Duration::from_secs(0)).await; // Wartezeit erh&#xF6;ht
    }
}

</pre>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/09/06/simple-blockchain-beispiel-mit-miner/">Simple Blockchain Beispiel mit Miner</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/09/06/simple-blockchain-beispiel-mit-miner/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://homepage-nach-preis.de/wp-content/uploads/2024/09/2024-09-06-18-38-00.mp4" length="41740699" type="video/mp4" />

			</item>
		<item>
		<title>WordPress Rest API Schnittstelle mit Firewall</title>
		<link>https://homepage-nach-preis.de/2024/05/22/wordpress-rest-api-schnittstelle-mit-firewall/</link>
					<comments>https://homepage-nach-preis.de/2024/05/22/wordpress-rest-api-schnittstelle-mit-firewall/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Wed, 22 May 2024 12:41:18 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Homepage]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Wordpress Code]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Firewall]]></category>
		<category><![CDATA[Schnitstelle]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8247</guid>

					<description><![CDATA[<p>Registrierung der benutzerdefinierten REST-Route Die Funktion zur Registrierung der REST-API-Route wird verwendet, um einen neuen Endpunkt in WordPress hinzuzuf&#xFC;gen. Dieser Endpunkt erm&#xF6;glicht es, externe Anfragen an WordPress zu senden und eine Antwort zu erhalten. Schritte der Registrierung: Hook zur Initialisierung der REST-API: Mit add_action(&#x27;rest_api_init&#x27;, function () { &#8230; }); wird eine anonyme Funktion registriert, die w&#xE4;hrend der Initialisierung der REST-API aufgerufen wird. Definition der Route: Innerhalb dieser anonymen Funktion wird register_rest_route aufgerufen, um die Route zu definieren. Namespace: &#x27;hnp_api_firewall/v1&#x27; legt den Namespace fest, der als Versionierung der API dient. Route: &#x27;/api&#x27; ist der spezifische Endpunkt innerhalb des Namespace. Optionen: Ein Array von Optionen, darunter: Methode: &#x27;methods&#x27; =&#x3E; &#x27;POST&#x27; spezifiziert, dass die Route nur POST-Anfragen akzeptiert. Callback: &#x27;callback&#x27; =&#x3E; &#x27;hnp_api_firewall_callback&#x27; gibt die Funktion an, die aufgerufen wird, wenn die Route erreicht wird. Berechtigung: &#x27;permission_callback&#x27; =&#x3E; &#x27;hnp_api_firewall_combined_permissions&#x27; bestimmt die Funktion, die die Berechtigungen f&#xFC;r den Zugriff auf die Route &#xFC;berpr&#xFC;ft. Kombinierte Berechtigungs- und Blockierungslogik Die Funktion hnp_api_firewall_combined_permissions dient dazu, die Berechtigungen und Blockierungslogik zu kombinieren. Sie wird aufgerufen, bevor die Haupt-Callback-Funktion ausgef&#xFC;hrt wird, um sicherzustellen, dass nur berechtigte Anfragen zugelassen werden. Schritte der Berechtigungspr&#xFC;fung: IP-&#xDC;berpr&#xFC;fung: Die IP-Adresse des Anfragenden wird &#xFC;berpr&#xFC;ft, um festzustellen, ob sie blockiert ist. Wenn die IP-Adresse blockiert ist....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/05/22/wordpress-rest-api-schnittstelle-mit-firewall/">WordPress Rest API Schnittstelle mit Firewall</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong><br />
Registrierung der benutzerdefinierten REST-Route</strong></p>
<p>Die Funktion zur Registrierung der REST-API-Route wird verwendet, um einen neuen Endpunkt in WordPress hinzuzuf&#xFC;gen. Dieser Endpunkt erm&#xF6;glicht es, externe Anfragen an WordPress zu senden und eine Antwort zu erhalten.</p>
<p><strong>Schritte der Registrierung:</strong></p>
<p>    Hook zur Initialisierung der REST-API: Mit add_action(&#x27;rest_api_init&#x27;, function () { &#8230; }); wird eine anonyme Funktion registriert, die w&#xE4;hrend der Initialisierung der REST-API aufgerufen wird.<br />
    Definition der Route: Innerhalb dieser anonymen Funktion wird register_rest_route aufgerufen, um die Route zu definieren.<br />
        Namespace: &#x27;hnp_api_firewall/v1&#x27; legt den Namespace fest, der als Versionierung der API dient.<br />
        Route: &#x27;/api&#x27; ist der spezifische Endpunkt innerhalb des Namespace.<br />
        Optionen: Ein Array von Optionen, darunter:<br />
            Methode: &#x27;methods&#x27; =&#x3E; &#x27;POST&#x27; spezifiziert, dass die Route nur POST-Anfragen akzeptiert.<br />
            Callback: &#x27;callback&#x27; =&#x3E; &#x27;hnp_api_firewall_callback&#x27; gibt die Funktion an, die aufgerufen wird, wenn die Route erreicht wird.<br />
            Berechtigung: &#x27;permission_callback&#x27; =&#x3E; &#x27;hnp_api_firewall_combined_permissions&#x27; bestimmt die Funktion, die die Berechtigungen f&#xFC;r den Zugriff auf die Route &#xFC;berpr&#xFC;ft.</p>
<p><strong>Kombinierte Berechtigungs- und Blockierungslogik</strong></p>
<p>Die Funktion hnp_api_firewall_combined_permissions dient dazu, die Berechtigungen und Blockierungslogik zu kombinieren. Sie wird aufgerufen, bevor die Haupt-Callback-Funktion ausgef&#xFC;hrt wird, um sicherzustellen, dass nur berechtigte Anfragen zugelassen werden.</p>
<p><strong>Schritte der Berechtigungspr&#xFC;fung:</strong></p>
<p>    IP-&#xDC;berpr&#xFC;fung: Die IP-Adresse des Anfragenden wird &#xFC;berpr&#xFC;ft, um festzustellen, ob sie blockiert ist.<br />
        Wenn die IP-Adresse blockiert ist und die Blockierungsdauer noch nicht abgelaufen ist, wird der Zugriff verweigert.<br />
        Wenn die Blockierungsdauer abgelaufen ist, wird die IP-Adresse entsperrt und die Blockierungsinformationen werden zur&#xFC;ckgesetzt.</p>
<p>    &#xDC;berpr&#xFC;fung der API-Benutzer und -Geheimnisse: Die Kopfzeilen der Anfrage werden auf g&#xFC;ltige API-Benutzer und -Geheimnisse &#xFC;berpr&#xFC;ft.<br />
        Wenn die Anmeldedaten korrekt sind, wird der Z&#xE4;hler f&#xFC;r g&#xFC;ltige Versuche erh&#xF6;ht.<br />
        Wenn die Anmeldedaten falsch sind, wird der Z&#xE4;hler f&#xFC;r ung&#xFC;ltige Versuche erh&#xF6;ht.<br />
            Wenn die Anzahl ung&#xFC;ltiger Versuche einen bestimmten Schwellenwert &#xFC;berschreitet (z.B. 50), wird die IP-Adresse blockiert.</p>
<p>    Versuchsverfolgung: Die Anzahl der erfolgreichen und fehlgeschlagenen Anmeldeversuche wird verfolgt, um die Blockierungslogik zu unterst&#xFC;tzen.</p>
<p><strong>R&#xFC;ckgabewert</strong></p>
<p>    Erfolgreiche Berechtigung: Wenn die Berechtigung erfolgreich ist, gibt die Funktion true zur&#xFC;ck, wodurch die Haupt-Callback-Funktion hnp_api_firewall_callback aufgerufen wird.<br />
    Fehlgeschlagene Berechtigung: Wenn die Berechtigung fehlschl&#xE4;gt, wird ein Fehler zur&#xFC;ckgegeben und die Haupt-Callback-Funktion wird nicht ausgef&#xFC;hrt.</p>
<p><strong>Haupt-Callback-Funktion</strong></p>
<p>Die Haupt-Callback-Funktion hnp_api_firewall_callback wird aufgerufen, wenn die Berechtigung erfolgreich ist und die Route erreicht wird. Sie gibt eine JSON-Antwort mit dem Dateninhalt zur&#xFC;ck, der in diesem Fall ein einfaches Beispiel mit {&#x22;testdata&#x22;: &#x22;test&#x22;} ist.</p>
<pre>

// Register the custom REST route
add_action(&#x27;rest_api_init&#x27;, function () {
    register_rest_route(&#x27;hnp_api_firewall/v1&#x27;, &#x27;/api&#x27;, array(
        &#x27;methods&#x27; =&#x3E; &#x27;POST&#x27;,
        &#x27;callback&#x27; =&#x3E; &#x27;hnp_api_firewall_callback&#x27;,
        &#x27;permission_callback&#x27; =&#x3E; &#x27;hnp_api_firewall_combined_permissions&#x27;,
    ));
});

// Combined function to handle permissions and blocking logic
function hnp_api_firewall_combined_permissions(WP_REST_Request $request) {
    $ip_address = sanitize_text_field($_SERVER[&#x27;REMOTE_ADDR&#x27;]);
    $blocked_ips = get_option(&#x27;hnp_blocked_ips&#x27;, array());

    // Check if IP is blocked
    if (isset($blocked_ips[$ip_address])) {
        $block_info = $blocked_ips[$ip_address];
        $block_time = $block_info[&#x27;block_time&#x27;];
        $block_duration = $block_info[&#x27;block_duration&#x27;];
        $current_time = current_time(&#x27;timestamp&#x27;);

        // If current time is less than block time + block duration, deny access
        if ($current_time &#x3C; ($block_time + $block_duration)) {
            return new WP_Error(&#x27;blocked_ip&#x27;, &#x27;Your IP is temporarily blocked due to too many attempts.&#x27;, array(&#x27;status&#x27; =&#x3E; 403));
        } else {
            // Unblock IP and reset attempts after block duration
            unset($blocked_ips[$ip_address]);
            update_option(&#x27;hnp_blocked_ips&#x27;, $blocked_ips);
        }
    }

    // Check API user and secret
    $api_user = $request-&#x3E;get_header(&#x27;APIUser&#x27;);
    $api_secret = $request-&#x3E;get_header(&#x27;APISecret&#x27;);
    $valid_api_user = &#x27;4GI53seaRLu!FK9XEiAk323U6M!f2bT7Sda28ZqsaegQCn0!Y121Y1L&#x27;;
    $valid_api_secret = &#x27;091572EddV!YcTKGR3Q13a!CM6TN!UWbPqFRdwa1XpP!1g8o32aaJD4&#x27;;

    // Tracking attempts
    $attempts = get_option(&#x27;hnp_attempts&#x27;, array());

    if (!isset($attempts[$ip_address])) {
        $attempts[$ip_address] = array(
            &#x27;valid_count&#x27; =&#x3E; 0,
            &#x27;invalid_count&#x27; =&#x3E; 0,
            &#x27;invalid_license_count&#x27; =&#x3E; 0,
            &#x27;first_attempt_time&#x27; =&#x3E; current_time(&#x27;timestamp&#x27;)
        );
    }

    $permission_granted = null !== $api_user &#x26;&#x26; $api_user === $valid_api_user &#x26;&#x26; null !== $api_secret &#x26;&#x26; $api_secret === $valid_api_secret;

    if ($permission_granted) {
        $attempts[$ip_address][&#x27;valid_count&#x27;]++;
    } else {
        $attempts[$ip_address][&#x27;invalid_count&#x27;]++;

        // Block IP if invalid attempts exceed threshold (e.g., 50)
        if ($attempts[$ip_address][&#x27;invalid_count&#x27;] &#x3E;= 50) {
            $blocked_ips[$ip_address] = array(&#x27;block_time&#x27; =&#x3E; current_time(&#x27;timestamp&#x27;), &#x27;block_duration&#x27; =&#x3E; 12 * HOUR_IN_SECONDS);
            update_option(&#x27;hnp_blocked_ips&#x27;, $blocked_ips);
            return new WP_Error(&#x27;blocked_ip&#x27;, &#x27;Your IP is temporarily blocked due to too many invalid attempts for API Secret/Username.&#x27;, array(&#x27;status&#x27; =&#x3E; 403));
        }

        update_option(&#x27;hnp_attempts&#x27;, $attempts);
        return new WP_Error(&#x27;invalid_credentials&#x27;, &#x27;Invalid API Secret key or password.&#x27;, array(&#x27;status&#x27; =&#x3E; 403));
    }

    // Reset invalid attempts on successful authentication
    if (isset($attempts[$ip_address])) {
        unset($attempts[$ip_address][&#x27;invalid_count&#x27;]);
        update_option(&#x27;hnp_attempts&#x27;, $attempts);
    }

    return true;
}

function hnp_api_firewall_callback() {
    return new WP_REST_Response(array(
        &#x27;testdata&#x27; =&#x3E; &#x27;test&#x27;
    ), 200);
}

</pre>
<p><strong>cUrl Anfrage zum Testen:</strong></p>
<pre>
curl -X POST https://yourdomain.com/wp-json/hnp_api_firewall/v1/api \
     -H &#x22;APIUser: 4GI53seaRLu!FK9XEiAk323U6M!f2bT7Sda28ZqsaegQCn0!Y121Y1L&#x22; \
     -H &#x22;APISecret: 091572EddV!YcTKGR3Q13a!CM6TN!UWbPqFRdwa1XpP!1g8o32aaJD4&#x22;

</pre>
<p><strong>PHP Anfrage zum Testen:</strong></p>
<pre>
&#x3C;?php

function call_hnp_api_firewall() {
    $url = &#x27;https://yourdomain.com/wp-json/hnp_api_firewall/v1/api&#x27;;
    
    $args = array(
        &#x27;headers&#x27; =&#x3E; array(
            &#x27;APIUser&#x27; =&#x3E; &#x27;4GI53seaRLu!FK9XEiAk323U6M!f2bT7Sda28ZqsaegQCn0!Y121Y1L&#x27;,
            &#x27;APISecret&#x27; =&#x3E; &#x27;091572EddV!YcTKGR3Q13a!CM6TN!UWbPqFRdwa1XpP!1g8o32aaJD4&#x27;
        ),
        &#x27;body&#x27; =&#x3E; array(
            // Any additional data you want to send in the body
        )
    );

    $response = wp_remote_post($url, $args);

    if (is_wp_error($response)) {
        $error_message = $response-&#x3E;get_error_message();
        echo &#x22;Something went wrong: $error_message&#x22;;
    } else {
        $response_body = wp_remote_retrieve_body($response);
        echo &#x27;Response:&#x3C;br&#x3E;&#x27;;
        echo &#x27;&#x3C;pre&#x3E;&#x27;;
        print_r(json_decode($response_body, true));
        echo &#x27;&#x3C;/pre&#x3E;&#x27;;
    }
}

// Call the function
call_hnp_api_firewall();

?&#x3E;

</pre>
<p><strong>C# Anfrage zum Testen:</strong></p>
<pre>
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class Program
{
    private static async Task CallHnpApiFirewallAsync()
    {
        var url = &#x22;https://yourdomain.com/wp-json/hnp_api_firewall/v1/api&#x22;;
        
        using (var client = new HttpClient())
        {
            // Set the APIUser and APISecret headers
            client.DefaultRequestHeaders.Add(&#x22;APIUser&#x22;, &#x22;4GI53seaRLu!FK9XEiAk323U6M!f2bT7Sda28ZqsaegQCn0!Y121Y1L&#x22;);
            client.DefaultRequestHeaders.Add(&#x22;APISecret&#x22;, &#x22;091572EddV!YcTKGR3Q13a!CM6TN!UWbPqFRdwa1XpP!1g8o32aaJD4&#x22;);

            // Optionally set the content of the request (if needed)
            var content = new StringContent(&#x22;&#x22;, System.Text.Encoding.UTF8, &#x22;application/json&#x22;);

            try
            {
                var response = await client.PostAsync(url, content);

                if (response.IsSuccessStatusCode)
                {
                    var responseBody = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(&#x22;Response:&#x22;);
                    Console.WriteLine(responseBody);
                }
                else
                {
                    Console.WriteLine($&#x22;Error: {response.StatusCode}&#x22;);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($&#x22;Exception: {ex.Message}&#x22;);
            }
        }
    }

    static void Main(string[] args)
    {
        Task.Run(() =&#x3E; CallHnpApiFirewallAsync()).GetAwaiter().GetResult();
    }
}

</pre>
<p><strong>Sicherheit:</strong></p>
<p>Anzahl der möglichen Kombinationen bei BrutForceAttacken</p>
<p>Einzelne Schlüssel:</p>
<p>Für einen einzelnen Schlüssel mit 50 Zeichen und 94 möglichen Zeichen pro Position ergibt sich:<br />
945094 hoch50<br />
Zwei Schlüssel kombiniert</p>
<p>Da beide Schlüssel unabhängig voneinander betrachtet werden, multiplizieren wir die Anzahl der möglichen Kombinationen beider Schlüssel:</p>
<p>(94 hoch50)×(94 hoch50)(94 hoch50)×(94 hoch50)</p>
<p><strong>Dies entspricht:</strong><br />
9410094 hoch100</p>
<p><strong>Zeit für einen Brute-Force-Angriff</strong></p>
<p>Angenommen, ein Computer kann 1 Milliarde (1.000.000.000) Kombinationen pro Sekunde testen:</p>
<p>    Anzahl der Kombinationen:<br />
        Die Anzahl der Kombinationen für einen Schlüssel: 945094 hoch50 (eine extrem große Zahl)<br />
        Die Anzahl der Kombinationen für beide Schlüssel: 9410094 hoch100 (noch viel größer)</p>
<p><strong>    Zeit für Brute-Force:</strong><br />
        Selbst wenn ein Computer 1 Milliarde Kombinationen pro Sekunde testen könnte, würde das Testen aller Kombinationen von zwei Schlüsseln extrem lange dauern.<br />
        Zum Vergleich:<br />
            Eine Milliarde Sekunden sind etwa 31,7 Jahre.</p>
<p><strong>            Die Anzahl der Kombinationen für 9410094 hoch100 ist so groß, dass selbst mit extrem schneller Hardware Billionen von Jahren benötigt würden, um alle Kombinationen zu testen.</strong></p>
<p><strong>Durch die Rate Limitierung der Firewall wird die Zeit auf Milliarden von Jahren erhöht, zudem sind DDOS oder ähnliche Hacking-Angriffe nicht möglich. Die Schnittstelle wird somit zusätzlich geschützt. </strong></p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/05/22/wordpress-rest-api-schnittstelle-mit-firewall/">WordPress Rest API Schnittstelle mit Firewall</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/05/22/wordpress-rest-api-schnittstelle-mit-firewall/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HNP WIN SHORTCODE Tool: Eine Revolution für WordPress</title>
		<link>https://homepage-nach-preis.de/2024/04/26/hnp-win-shortcode-tool-eine-revolution-fuer-wordpress/</link>
					<comments>https://homepage-nach-preis.de/2024/04/26/hnp-win-shortcode-tool-eine-revolution-fuer-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Fri, 26 Apr 2024 19:13:58 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Homepage]]></category>
		<category><![CDATA[Onlineshop]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Daten]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[Shortcode]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Verbindung]]></category>
		<category><![CDATA[Win]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8216</guid>

					<description><![CDATA[<p>Unbegrenzte Anpassung mit dem HNP WIN SHORTCODE Tool: Eine Revolution für WordPress In der Welt des Webdesigns und der Content-Verwaltungssysteme ist Flexibilität der Schlüssel. WordPress, das beliebte CMS, bietet bereits eine Vielzahl von Funktionen, aber was, wenn Sie noch weiter gehen möchten? Was ist, wenn Sie Ihre Inhalte noch individueller gestalten möchten? Hier kommt das HNP WIN SHORTCODE Tool ins Spiel &#8211; ein innovatives WordPress-Plugin in Kombination mit einer leistungsstarken Windows x64-Software, die Ihnen die unbegrenzte Erstellung und Anpassung von Shortcodes ermöglicht. Was ist das HNP WIN SHORTCODE Tool? Das HNP WIN SHORTCODE Tool besteht aus zwei Hauptkomponenten: einem WordPress-Plugin und einer Windows x64-Software. Zusammen ermöglichen sie die einfache Erstellung und Verwaltung von Shortcodes mit anpassbaren Inhalten direkt von Ihrem Desktop aus. Wie funktioniert es? Das WordPress-Plugin integriert sich nahtlos in Ihre WordPress-Installation. Nach der Installation und Aktivierung stehen Ihnen sofort alle Funktionen zur Verfügung. Sie können die Anzahl der Shortcodes festlegen und die Daten bearbeiten, alles direkt über das Backend von WordPress. Die Windows-Software bietet eine benutzerfreundliche Oberfläche, mit der Sie die Shortcodes und deren Inhalte laden und ändern können. Dank der Integration mit der WordPress-Rest-API können Sie die Änderungen direkt auf Ihrer Website veröffentlichen. Funktionen des WordPress-Plugins: Einfache....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/26/hnp-win-shortcode-tool-eine-revolution-fuer-wordpress/">HNP WIN SHORTCODE Tool: Eine Revolution für WordPress</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Unbegrenzte Anpassung mit dem HNP WIN SHORTCODE Tool: Eine Revolution für WordPress</strong></p>
<p>In der Welt des Webdesigns und der Content-Verwaltungssysteme ist Flexibilität der Schlüssel. WordPress, das beliebte CMS, bietet bereits eine Vielzahl von Funktionen, aber was, wenn Sie noch weiter gehen möchten? Was ist, wenn Sie Ihre Inhalte noch individueller gestalten möchten? Hier kommt das HNP WIN SHORTCODE Tool ins Spiel &#8211; ein innovatives WordPress-Plugin in Kombination mit einer leistungsstarken Windows x64-Software, die Ihnen die unbegrenzte Erstellung und Anpassung von Shortcodes ermöglicht.</p>
<h3>Was ist das HNP WIN SHORTCODE Tool?</h3>
<p>Das HNP WIN SHORTCODE Tool besteht aus zwei Hauptkomponenten: einem WordPress-Plugin und einer Windows x64-Software. Zusammen ermöglichen sie die einfache Erstellung und Verwaltung von Shortcodes mit anpassbaren Inhalten direkt von Ihrem Desktop aus.</p>
<h3>Wie funktioniert es?</h3>
<p>Das WordPress-Plugin integriert sich nahtlos in Ihre WordPress-Installation. Nach der Installation und Aktivierung stehen Ihnen sofort alle Funktionen zur Verfügung. Sie können die Anzahl der Shortcodes festlegen und die Daten bearbeiten, alles direkt über das Backend von WordPress.</p>
<p>Die Windows-Software bietet eine benutzerfreundliche Oberfläche, mit der Sie die Shortcodes und deren Inhalte laden und ändern können. Dank der Integration mit der WordPress-Rest-API können Sie die Änderungen direkt auf Ihrer Website veröffentlichen.</p>
<h3>Funktionen des WordPress-Plugins:</h3>
<ul>
<li><strong>Einfache Einrichtung:</strong> Installieren und aktivieren Sie das Plugin &#8211; der Rest ist optional, da das Plugin bereits vorkonfiguriert ist.</li>
<li><strong>Backend-Verwaltung:</strong> Eine eigene Backend-Seite im Admin-Dashboard von WordPress ermöglicht die Verwaltung der Shortcodes und ihrer Inhalte.</li>
<li><strong>Anpassung:</strong> Passen Sie die Anzahl der Shortcodes an und definieren Sie die Daten, die ausgelesen und geändert werden sollen.</li>
<li><strong>Sprachunabhängig:</strong> Das Plugin ist derzeit nur in Englisch verfügbar, aber da Sie die Inhalte der Shortcodes selbst bestimmen können, ist die Sprache irrelevant.</li>
<li><strong>Performance und Sicherheit:</strong> Das Plugin nutzt pures JavaScript und ist mit PHP 7.X und PHP 8.X kompatibel. Die REST-API ist durch einen Secret Key geschützt.</li>
</ul>
<h3>Funktionen der Windows-Software:</h3>
<ul>
<li><strong>Einfache Nutzung:</strong> Starten Sie die Anwendung auf einem Windows-64-Bit-System und geben Sie Ihre Domain-Adresse ein &#8211; mehr ist nicht nötig.</li>
<li><strong>Vielseitigkeit:</strong> Die Anwendung funktioniert auf Servern, Laptops und herkömmlichen Computern.</li>
<li><strong>Anpassungsmöglichkeiten:</strong> Ändern Sie den Secret Key, die Anzahl der Shortcodes und die Domain-Adresse nach Bedarf.</li>
<li><strong>Speicherungsfunktion:</strong> Die Anwendung merkt sich die letzten Einstellungen für einen bequemen Autostart.</li>
<li><strong>Performance und Sicherheit:</strong> Nutzt keine externen Bibliotheken außer denen von Python, Netcore und GTK. Die Datenübertragung zur WordPress-Website erfolgt über die REST-API mit einem Secret Key.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Mehr Informationen und Download:</strong><br />
<a href="https://shop.homepage-nach-preis.de/produkt/hnp-unlimiterte-shortcodes-schnitstelle-wordpress-windows-x64/" target="_blank" rel="nofollow noopener">https://shop.homepage-nach-preis.de/produkt/hnp-unlimiterte-shortcodes-schnitstelle-wordpress-windows-x64/</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/26/hnp-win-shortcode-tool-eine-revolution-fuer-wordpress/">HNP WIN SHORTCODE Tool: Eine Revolution für WordPress</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/04/26/hnp-win-shortcode-tool-eine-revolution-fuer-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WooCommerce Warenkorb Leeren &#038; Session Button</title>
		<link>https://homepage-nach-preis.de/2024/04/15/woocommerce-warenkorb-leeren-session-button/</link>
					<comments>https://homepage-nach-preis.de/2024/04/15/woocommerce-warenkorb-leeren-session-button/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Mon, 15 Apr 2024 14:27:03 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Onlineshop]]></category>
		<category><![CDATA[Wordpress Code]]></category>
		<category><![CDATA[Button]]></category>
		<category><![CDATA[leeren]]></category>
		<category><![CDATA[Warenkorb]]></category>
		<category><![CDATA[Woocommerce]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8204</guid>

					<description><![CDATA[<p>Das HNP Warenkorb Leeren Button Plugin für WooCommerce und WordPress erzeugt einen Button auf der Warenkorb-Seite, welcher bei Betätigung den kompletten Warenkorb leert und zudem die Session und Cookies resetet. Download: [sdm_download id=&#8221;8202&#8243; fancy=&#8221;0&#8243;] &#x3C;?php /** Plugin Name: HNP Clear WooCommerce Cart &#x26; Session Description: Ein Plugin zum Leeren des WooCommerce Warenkorbs und L&#xF6;schen von Sessions und Cookies. Version: 1.2 Author: HNP C.R. Author URI: https://homepage-nach-preis.de/ License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html */ // Exit, wenn der Direktzugriff verhindert ist if (!defined(&#x27;ABSPATH&#x27;)) { exit; } function hnp_cwc_enqueue_scripts() { if (is_cart() &#x26;&#x26; get_option(&#x27;hnp_cwc_enable&#x27;, &#x27;no&#x27;) == &#x27;yes&#x27; &#x26;&#x26; get_option(&#x27;hnp_cwc_hook_enable&#x27;, &#x27;no&#x27;) == &#x27;yes&#x27;) { $nonce = wp_create_nonce(&#x27;hnp_cwc_nonce&#x27;); $script = &#x22; var ajaxurl = &#x27;&#x22; . admin_url(&#x27;admin-ajax.php&#x27;) . &#x22;&#x27;; var nonce = &#x27;&#x22; . $nonce . &#x22;&#x27;; document.addEventListener(&#x27;DOMContentLoaded&#x27;, function() { var clearCartButton = document.getElementById(&#x27;clear-cart&#x27;); clearCartButton.addEventListener(&#x27;click&#x27;, function() { // Clear cart var xhr = new XMLHttpRequest(); xhr.open(&#x27;POST&#x27;, ajaxurl, true); xhr.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/x-www-form-urlencoded&#x27;); xhr.setRequestHeader(&#x27;X-WP-Nonce&#x27;, nonce); xhr.onload = function() { if (this.status &#x3E;= 200 &#x26;&#x26; this.status &#x3C; 400) { console.log(&#x27;Cart Cleared&#x27;, this.responseText); // Clear sessions and cookies var xhr2 = new XMLHttpRequest(); xhr2.open(&#x27;POST&#x27;, ajaxurl, true); xhr2.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/x-www-form-urlencoded&#x27;); xhr2.setRequestHeader(&#x27;X-WP-Nonce&#x27;, nonce); xhr2.onload = function() { if (this.status &#x3E;= 200 &#x26;&#x26; this.status &#x3C; 400) { console.log(&#x27;Sessions and Cookies Cleared&#x27;, this.responseText); // Reload....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/15/woocommerce-warenkorb-leeren-session-button/">WooCommerce Warenkorb Leeren &#038; Session Button</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Das HNP Warenkorb Leeren Button Plugin für WooCommerce und WordPress erzeugt einen Button auf der Warenkorb-Seite, welcher bei Betätigung den kompletten Warenkorb leert und zudem die Session und Cookies resetet.</p>
<p><strong>Download: </strong><br />
[sdm_download id=&#8221;8202&#8243; fancy=&#8221;0&#8243;]</p>
<pre>
&#x3C;?php
/**
Plugin Name: HNP Clear WooCommerce Cart &#x26; Session
Description: Ein Plugin zum Leeren des WooCommerce Warenkorbs und L&#xF6;schen von Sessions und Cookies.
Version: 1.2
Author: HNP C.R.
Author URI: https://homepage-nach-preis.de/
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
 */

// Exit, wenn der Direktzugriff verhindert ist
if (!defined(&#x27;ABSPATH&#x27;)) {
    exit;
}

function hnp_cwc_enqueue_scripts() {
    if (is_cart() &#x26;&#x26; get_option(&#x27;hnp_cwc_enable&#x27;, &#x27;no&#x27;) == &#x27;yes&#x27; &#x26;&#x26; get_option(&#x27;hnp_cwc_hook_enable&#x27;, &#x27;no&#x27;) == &#x27;yes&#x27;) {
        $nonce = wp_create_nonce(&#x27;hnp_cwc_nonce&#x27;);
        
        $script = &#x22;
            var ajaxurl = &#x27;&#x22; . admin_url(&#x27;admin-ajax.php&#x27;) . &#x22;&#x27;;
            var nonce = &#x27;&#x22; . $nonce . &#x22;&#x27;;
            
            document.addEventListener(&#x27;DOMContentLoaded&#x27;, function() {
                var clearCartButton = document.getElementById(&#x27;clear-cart&#x27;);
                
                clearCartButton.addEventListener(&#x27;click&#x27;, function() {
                    // Clear cart
                    var xhr = new XMLHttpRequest();
                    xhr.open(&#x27;POST&#x27;, ajaxurl, true);
                    xhr.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/x-www-form-urlencoded&#x27;);
                    xhr.setRequestHeader(&#x27;X-WP-Nonce&#x27;, nonce);
                    xhr.onload = function() {
                        if (this.status &#x3E;= 200 &#x26;&#x26; this.status &#x3C; 400) {
                            console.log(&#x27;Cart Cleared&#x27;, this.responseText);
                            
                            // Clear sessions and cookies
                            var xhr2 = new XMLHttpRequest();
                            xhr2.open(&#x27;POST&#x27;, ajaxurl, true);
                            xhr2.setRequestHeader(&#x27;Content-Type&#x27;, &#x27;application/x-www-form-urlencoded&#x27;);
                            xhr2.setRequestHeader(&#x27;X-WP-Nonce&#x27;, nonce);
                            xhr2.onload = function() {
                                if (this.status &#x3E;= 200 &#x26;&#x26; this.status &#x3C; 400) {
                                    console.log(&#x27;Sessions and Cookies Cleared&#x27;, this.responseText);
                                    
                                    // Reload the page after clearing cart and sessions/cookies
                                    location.reload();
                                } else {
                                    console.error(&#x27;Error clearing sessions and cookies&#x27;, this);
                                }
                            };
                            xhr2.onerror = function() {
                                console.error(&#x27;Error clearing sessions and cookies&#x27;, this);
                            };
                            xhr2.send(&#x27;action=hnp_clear_sessions_cookies&#x26;nonce=&#x27; + nonce);
                            
                        } else {
                            console.error(&#x27;Error clearing cart&#x27;, this);
                        }
                    };
                    xhr.onerror = function() {
                        console.error(&#x27;Error clearing cart&#x27;, this);
                    };
                    xhr.send(&#x27;action=hnp_clear_cart_session&#x26;nonce=&#x27; + nonce);
                });
            });
        &#x22;;
        wp_add_inline_script(&#x27;jquery&#x27;, $script);
    }
}


add_action(&#x27;wp_enqueue_scripts&#x27;, &#x27;hnp_cwc_enqueue_scripts&#x27;);



// Register shortcode
function hnp_cwc_button_shortcode() {
    ob_start(); ?&#x3E;
    &#x3C;button id=&#x22;clear-cart&#x22;&#x3E;Warenkorb leeren&#x3C;/button&#x3E;
    &#x3C;?php
    return ob_get_clean();
}
add_shortcode(&#x27;hnp_cwc_button&#x27;, &#x27;hnp_cwc_button_shortcode&#x27;);

// Hook to display the button on cart page
function hnp_cwc_display_button() {
    if (get_option(&#x27;hnp_cwc_hook_enable&#x27;, &#x27;no&#x27;) == &#x27;yes&#x27;) {
        echo do_shortcode(&#x27;[hnp_cwc_button]&#x27;);
    }
}
add_action(&#x27;woocommerce_cart_actions&#x27;, &#x27;hnp_cwc_display_button&#x27;);

// AJAX handler to clear cart
function hnp_cwc_clear_cart() {
    check_ajax_referer(&#x27;hnp_cwc_nonce&#x27;, &#x27;nonce&#x27;);

    try {
        WC()-&#x3E;cart-&#x3E;empty_cart();
        echo &#x27;Cart Cleared&#x27;;
    } catch (Exception $e) {
        echo &#x27;Error clearing cart: &#x27; . $e-&#x3E;getMessage();
    }
    die();
}

add_action(&#x27;wp_ajax_hnp_clear_cart_session&#x27;, &#x27;hnp_cwc_clear_cart&#x27;);
add_action(&#x27;wp_ajax_nopriv_hnp_clear_cart_session&#x27;, &#x27;hnp_cwc_clear_cart&#x27;);

</pre>
<pre>

// AJAX handler to clear sessions and cookies
function hnp_cwc_clear_sessions_cookies() {
    check_ajax_referer(&#x27;hnp_cwc_nonce&#x27;, &#x27;nonce&#x27;);

    try {
        // Reset WooCommerce session
        WC()-&#x3E;session-&#x3E;set_customer_session_cookie(false);
        WC()-&#x3E;session-&#x3E;set_session_cookie(false);
        WC()-&#x3E;session-&#x3E;reset_session();

        // Unset all cookies
        foreach ($_COOKIE as $cookie_key =&#x3E; $cookie_value) {
            unset($_COOKIE[$cookie_key]);
            setcookie($cookie_key, &#x27;&#x27;, time() - 3600, &#x27;/&#x27;, $_SERVER[&#x27;HTTP_HOST&#x27;]);
            setcookie($cookie_key, &#x27;&#x27;, time() - 3600, &#x27;/&#x27;, &#x27;.&#x27; . $_SERVER[&#x27;HTTP_HOST&#x27;]);
        }

        echo &#x27;Sessions and Cookies Cleared&#x27;;
    } catch (Exception $e) {
        echo &#x27;Error clearing sessions and cookies: &#x27; . $e-&#x3E;getMessage();
    }
    die();
}


add_action(&#x27;wp_ajax_hnp_clear_sessions_cookies&#x27;, &#x27;hnp_cwc_clear_sessions_cookies&#x27;);
add_action(&#x27;wp_ajax_nopriv_hnp_clear_sessions_cookies&#x27;, &#x27;hnp_cwc_clear_sessions_cookies&#x27;);


// Admin settings
function hnp_cwc_admin_menu() {
    add_menu_page(
        &#x27;HNP Clear WooCommerce Cart Settings&#x27;, 
        &#x27;HNP Clear WooCommerce Cart&#x27;,           
        &#x27;manage_options&#x27;,                   
        &#x27;hnp_cwc_settings&#x27;,                 
        &#x27;hnp_cwc_settings_page&#x27;,            
&#x9;&#x9; plugin_dir_url(__FILE__) . &#x27;img/hnp-favi.png&#x27;                               
    );
}
add_action(&#x27;admin_menu&#x27;, &#x27;hnp_cwc_admin_menu&#x27;);

function hnp_cwc_settings_page() {
&#x9;if (!current_user_can(&#x27;manage_options&#x27;)) {
        return;
    }
    if ($_SERVER[&#x27;REQUEST_METHOD&#x27;] === &#x27;POST&#x27; &#x26;&#x26; check_admin_referer(&#x27;hnp_cwc_nonce&#x27;, &#x27;hnp_cwc_nonce_field&#x27;)) {
        if (isset($_POST[&#x27;hnp_cwc_enable&#x27;])) {
            update_option(&#x27;hnp_cwc_enable&#x27;, $_POST[&#x27;hnp_cwc_enable&#x27;]);
        } else {
            update_option(&#x27;hnp_cwc_enable&#x27;, &#x27;no&#x27;);
        }

        if (isset($_POST[&#x27;hnp_cwc_hook_enable&#x27;])) {
            update_option(&#x27;hnp_cwc_hook_enable&#x27;, $_POST[&#x27;hnp_cwc_hook_enable&#x27;]);
        } else {
            update_option(&#x27;hnp_cwc_hook_enable&#x27;, &#x27;no&#x27;);
        }
    }

    $enabled = get_option(&#x27;hnp_cwc_enable&#x27;, &#x27;no&#x27;);
    $hook_enabled = get_option(&#x27;hnp_cwc_hook_enable&#x27;, &#x27;no&#x27;);
    $nonce = wp_create_nonce(&#x27;hnp_cwc_nonce&#x27;);
    ?&#x3E;
    &#x3C;div class=&#x22;wrap&#x22;&#x3E;
        &#x3C;h2&#x3E;HNP Clear WooCommerce Cart Settings&#x3C;/h2&#x3E;
        &#x3C;form method=&#x22;post&#x22; action=&#x22;&#x22;&#x3E;
            &#x3C;?php wp_nonce_field(&#x27;hnp_cwc_nonce&#x27;, &#x27;hnp_cwc_nonce_field&#x27;); ?&#x3E;
            &#x3C;table class=&#x22;form-table&#x22;&#x3E;
                &#x3C;tr&#x3E;
                    &#x3C;th scope=&#x22;row&#x22;&#x3E;Allgemeine Funktion aktivieren&#x3C;/th&#x3E;
                    &#x3C;td&#x3E;
                        &#x3C;input type=&#x22;checkbox&#x22; name=&#x22;hnp_cwc_enable&#x22; value=&#x22;yes&#x22; &#x3C;?php checked(&#x27;yes&#x27;, $enabled); ?&#x3E; /&#x3E;
                    &#x3C;/td&#x3E;
                &#x3C;/tr&#x3E;
                &#x3C;tr&#x3E;
                    &#x3C;th scope=&#x22;row&#x22;&#x3E;Hook f&#xFC;r Warenkorb aktivieren&#x3C;/th&#x3E;
                    &#x3C;td&#x3E;
                        &#x3C;input type=&#x22;checkbox&#x22; name=&#x22;hnp_cwc_hook_enable&#x22; value=&#x22;yes&#x22; &#x3C;?php checked(&#x27;yes&#x27;, $hook_enabled); ?&#x3E; /&#x3E;
                    &#x3C;/td&#x3E;
                &#x3C;/tr&#x3E;
&#x9;&#x9;&#x9;&#x9;&#x3C;tr&#x3E;Shortcode um den Button manuell einzubinden: [hnp_cwc_button]&#x3C;/tr&#x3E;
            &#x3C;/table&#x3E;
            &#x3C;?php submit_button(); ?&#x3E;
        &#x3C;/form&#x3E;
    &#x3C;/div&#x3E;
    &#x3C;?php
}

</pre>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/15/woocommerce-warenkorb-leeren-session-button/">WooCommerce Warenkorb Leeren &#038; Session Button</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/04/15/woocommerce-warenkorb-leeren-session-button/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HNP Empty Plugin &#8211; WordPress Demo Code</title>
		<link>https://homepage-nach-preis.de/2024/04/10/hnp-empty-plugin-wordpress-demo-code/</link>
					<comments>https://homepage-nach-preis.de/2024/04/10/hnp-empty-plugin-wordpress-demo-code/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Wed, 10 Apr 2024 13:54:30 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Wordpress Code]]></category>
		<category><![CDATA[Beispiel]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Empty]]></category>
		<category><![CDATA[Leeres]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8186</guid>

					<description><![CDATA[<p>Das HNP Empty Plugin ist ein einfaches Demo-Plugin für WordPress, das entwickelt wurde, um grundlegende Funktionen eines Plugins zu demonstrieren. Es zeigt, wie man Styles und Skripte sowohl im Frontend als auch im Backend von WordPress einbindet. Außerdem bietet es eine Benutzeroberfläche zur Verwaltung von Plugin-Optionen über das WordPress-Dashboard. Der Plugin-Demo Code besitzt alle wichtigen Sicherheitsoptionen und Code-Qualitätsanforderungen, damit ein Plugin im offiziellen WordPress Verzeichnis aufgenommen wird. Zudem Funktionen, welche im Jahr 2024 auf dem neuesten Stand sind. Somit eine gute Grundlage für WordPress-Plugin-Entwickler. Geteste Kompatibilität: WordPress 6.5.2 und PHP 8.3. Das Plugin wird aber auch mit neueren und älteren PHP und WordPress Versionen kompatibel sein. Features: Frontend und Backend Styling: Das Plugin fügt sowohl dem Frontend als auch dem Backend von WordPress benutzerdefinierte CSS- und JavaScript-Dateien hinzu, um das Erscheinungsbild anzupassen. Plugin-Optionen: Es bietet eine einfache Möglichkeit, Plugin-Optionen über das WordPress-Dashboard zu konfigurieren, einschließlich Textfelder, Zahlenfelder, Farbwähler, Dropdown-Listen und Checkboxen. Shortcode: Das Plugin stellt einen Shortcode bereit, mit dem Benutzer die konfigurierten Optionen auf beliebigen Seiten oder Beiträgen anzeigen können. Sicherheitsmaßnahmen: Das Plugin implementiert Sicherheitsmaßnahmen wie Nonce-Überprüfung, um unerwünschte Zugriffe auf die Plugin-Einstellungen zu verhindern. &#160; Plugin-Download: [sdm_download id=&#8221;8187&#8243; fancy=&#8221;0&#8243;] Github: https://github.com/HNP-Christopher-Rohde/hnp_empty_wordpress_plugin Quellcode: &#60;?php /* Plugin Name: HNP Empty....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/10/hnp-empty-plugin-wordpress-demo-code/">HNP Empty Plugin &#8211; WordPress Demo Code</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Das HNP Empty Plugin ist ein einfaches Demo-Plugin für WordPress, das entwickelt wurde, um grundlegende Funktionen eines Plugins zu demonstrieren. Es zeigt, wie man Styles und Skripte sowohl im Frontend als auch im Backend von WordPress einbindet. Außerdem bietet es eine Benutzeroberfläche zur Verwaltung von Plugin-Optionen über das WordPress-Dashboard. Der Plugin-Demo Code besitzt alle wichtigen Sicherheitsoptionen und Code-Qualitätsanforderungen, damit ein Plugin im offiziellen WordPress Verzeichnis aufgenommen wird. Zudem Funktionen, welche im Jahr 2024 auf dem neuesten Stand sind. Somit eine gute Grundlage für WordPress-Plugin-Entwickler. Geteste Kompatibilität: WordPress 6.5.2 und PHP 8.3. Das Plugin wird aber auch mit neueren und älteren PHP und WordPress Versionen kompatibel sein. </p>
<p><strong>Features:</strong></p>
<ul>
<li><strong>Frontend und Backend Styling:</strong> Das Plugin fügt sowohl dem Frontend als auch dem Backend von WordPress benutzerdefinierte CSS- und JavaScript-Dateien hinzu, um das Erscheinungsbild anzupassen.</li>
<li><strong>Plugin-Optionen:</strong> Es bietet eine einfache Möglichkeit, Plugin-Optionen über das WordPress-Dashboard zu konfigurieren, einschließlich Textfelder, Zahlenfelder, Farbwähler, Dropdown-Listen und Checkboxen.</li>
<li><strong>Shortcode:</strong> Das Plugin stellt einen Shortcode bereit, mit dem Benutzer die konfigurierten Optionen auf beliebigen Seiten oder Beiträgen anzeigen können.</li>
<li><strong>Sicherheitsmaßnahmen:</strong> Das Plugin implementiert Sicherheitsmaßnahmen wie Nonce-Überprüfung, um unerwünschte Zugriffe auf die Plugin-Einstellungen zu verhindern.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Plugin-Download:</strong> [sdm_download id=&#8221;8187&#8243; fancy=&#8221;0&#8243;]<br />
<strong>Github:</strong> <a href="https://github.com/HNP-Christopher-Rohde/hnp_empty_wordpress_plugin" target="_blank" rel="nofollow noopener">https://github.com/HNP-Christopher-Rohde/hnp_empty_wordpress_plugin</a><br />
<strong>Quellcode:</strong></p>
<pre>&lt;?php
/*
  Plugin Name: HNP Empty Plugin
  Description: Creates a Demo Plugin in WordPress
  Version: 2.0
  Author: HNP C.R. 
  Author URI: https://homepage-nach-preis.de/
  License: GPLv3
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
 */

// Security check to prevent direct access to the plugin file
defined('ABSPATH') or die('No script kiddies please!');

// Function to enqueue the Frontend CSS and JS
function hnp_empty_plugin_frontend_scripts() {
    // Define a version number
    $version = '2.0';

    // Check if CSS is not already enqueued
    if (!wp_style_is('hnp_empty_plugin_frontend-css')) {
        // Enqueue CSS with the defined version
        wp_enqueue_style('hnp_empty_plugin_frontend-css', plugin_dir_url(__FILE__) . '/frontend/css/hnp_empty_plugin_frontend.css', array(), $version);
    }

    // Check if JavaScript is not already enqueued
    if (!wp_script_is('hnp_empty_plugin_frontend-js')) {
        // Enqueue JavaScript with the defined version
        wp_enqueue_script('hnp_empty_plugin_frontend-js', plugin_dir_url(__FILE__) . '/frontend/js/hnp_empty_plugin_frontend.js', array(), $version, true);
    }
}
add_action('wp_enqueue_scripts', 'hnp_empty_plugin_frontend_scripts');

// Function to enqueue Backend CSS and JS
function hnp_empty_plugin_backend_scripts() {
    // Define a version number
    $version = '2.0';

    // Check if CSS is not already enqueued
    if (!wp_style_is('hnp_empty_plugin_backend-css')) {
        // Enqueue CSS with the defined version
        wp_enqueue_style('hnp_empty_plugin_backend-css', plugin_dir_url(__FILE__) . '/backend/css/hnp_empty_plugin_backend.css', array(), $version);
    }

    // Check if JavaScript is not already enqueued
    if (!wp_script_is('hnp_empty_plugin_backend-js')) {
        // Enqueue JavaScript with the defined version
        wp_enqueue_script('hnp_empty_plugin_backend-js', plugin_dir_url(__FILE__) . '/backend/js/hnp_empty_plugin_backend.js', array(), $version, true);
    }
}
add_action('admin_enqueue_scripts', 'hnp_empty_plugin_backend_scripts');

// Function for Test - with load Options and Fallback
function hnp_empty_plugin_echo_func() {
    // Get option values
    $name = get_option('hnp_empty_plugin_name_field', 'Name');
    $number = get_option('hnp_empty_plugin_number_field', '12');
    $color = get_option('hnp_empty_plugin_color_field', '#ff0000');
    $description = get_option('hnp_empty_plugin_description_field', 'Im a Desc Field');
    $dropdown = get_option('hnp_empty_plugin_dropdown_field', 'option1');
    $checkbox = get_option('hnp_empty_plugin_checkbox_field', 0);

    // Echo option values
    echo '&lt;p&gt;Name Field: ' . esc_html($name) . '&lt;/p&gt;';
    echo '&lt;p&gt;Number Field: ' . esc_html($number) . '&lt;/p&gt;';
    echo '&lt;p&gt;Color Field: ' . esc_html($color) . '&lt;/p&gt;';
    echo '&lt;p&gt;Description Field: ' . esc_html($description) . '&lt;/p&gt;';
    echo '&lt;p&gt;Dropdown Field: ' . esc_html($dropdown) . '&lt;/p&gt;';
    echo '&lt;p&gt;Checkbox Field: ' . ($checkbox ? 'Enabled' : 'Disabled') . '&lt;/p&gt;';
}
add_shortcode('hnp_empty_plugin_echo_func', 'hnp_empty_plugin_echo_func');


// Function to add plugin options to the main menu
function hnp_empty_plugin_add_plugin_options_page() {
    // Check permission
    if (current_user_can('manage_options')) {
        add_menu_page(
            'HNP Empty Plugin Settings',
            'HNP Empty Plugin',
            'manage_options',
            'hnp-empty-plugin-settings',
            'hnp_empty_plugin_render_plugin_options_page',
            plugin_dir_url(__FILE__) . 'img/hnp-favi.png' 
        );
    }
}
add_action('admin_menu', 'hnp_empty_plugin_add_plugin_options_page');


// Function to render plugin options page
function hnp_empty_plugin_render_plugin_options_page() {
    ?&gt;
    &lt;div class="wrap hnp-empty-plugin-settings"&gt;
        &lt;h1&gt;HNP Empty Plugin Settings&lt;/h1&gt;
        &lt;form method="post" action="options.php"&gt;
            &lt;?php settings_fields('hnp_empty_plugin_settings_group'); ?&gt;
            &lt;?php do_settings_sections('hnp-empty-plugin-settings'); ?&gt;
            
            &lt;?php 
                // Add nonce
                wp_nonce_field('hnp_empty_plugin_settings_nonce', 'hnp_empty_plugin_settings_nonce'); 
            ?&gt;
            
            &lt;?php submit_button(); ?&gt;
        &lt;/form&gt;
    &lt;/div&gt;
    &lt;?php
}

// Function to register plugin options
function hnp_empty_plugin_register_plugin_options() {
    // Name
    add_settings_section(
        'hnp_empty_plugin_name_section',
        'Demo',
        'hnp_empty_plugin_demo_section_callback',
        'hnp-empty-plugin-settings'
    );

    // Name
    add_settings_field(
        'hnp_empty_plugin_name_field', 
        'Name Field', 
        'hnp_empty_plugin_name_field_callback', 
        'hnp-empty-plugin-settings', 
        'hnp_empty_plugin_name_section' 
    );

    // Number
    add_settings_field(
        'hnp_empty_plugin_number_field',
        'Number Field',
        'hnp_empty_plugin_number_field_callback',
        'hnp-empty-plugin-settings',
        'hnp_empty_plugin_name_section'
    );

    // Color
    add_settings_field(
        'hnp_empty_plugin_color_field',
        'Color Field',
        'hnp_empty_plugin_color_field_callback',
        'hnp-empty-plugin-settings',
        'hnp_empty_plugin_name_section'
    );

    // Description
    add_settings_field(
        'hnp_empty_plugin_description_field',
        'Description Field',
        'hnp_empty_plugin_description_field_callback',
        'hnp-empty-plugin-settings',
        'hnp_empty_plugin_name_section'
    );

    // Dropdown
    add_settings_field(
        'hnp_empty_plugin_dropdown_field',
        'Dropdown Field',
        'hnp_empty_plugin_dropdown_field_callback',
        'hnp-empty-plugin-settings',
        'hnp_empty_plugin_name_section'
    );

    // Checkbox
    add_settings_field(
        'hnp_empty_plugin_checkbox_field',
        'Checkbox Field',
        'hnp_empty_plugin_checkbox_field_callback',
        'hnp-empty-plugin-settings',
        'hnp_empty_plugin_name_section'
    );
}
add_action('admin_init', 'hnp_empty_plugin_register_plugin_options');
</pre>
<pre>
// Callback function for demo section
function hnp_empty_plugin_demo_section_callback() {
    echo 'This a Demo Plugin. Frontend-Shortcode: &amp;#x5B;hnp_empty_plugin_echo_func]&lt;/p&gt;';
}

// Callback function for name field
function hnp_empty_plugin_name_field_callback() {
    $value = get_option('hnp_empty_plugin_name_field', 'Name'); // Fallback value is 'Name'
    echo '&lt;input type="text" name="hnp_empty_plugin_name_field" value="' . esc_attr($value) . '" /&gt;';
}

// Callback functions for number fields
function hnp_empty_plugin_number_field_callback() {
    $value = get_option('hnp_empty_plugin_number_field', '12'); // Fallback value is '12'
    echo '&lt;input type="number" name="hnp_empty_plugin_number_field" value="' . esc_attr($value) . '" /&gt;';
}

// Callback function for Color Field
function hnp_empty_plugin_color_field_callback() {
    $value = get_option('hnp_empty_plugin_color_field', '#ff0000'); // Fallback value is red color
    echo '&lt;input type="color" name="hnp_empty_plugin_color_field" value="' . esc_attr($value) . '" /&gt;';
}

// Callback function for Description Field
function hnp_empty_plugin_description_field_callback() {
    $value = get_option('hnp_empty_plugin_description_field', 'Im a Desc Field'); // Fallback value is 'Im a Desc Field'
    echo '&lt;textarea name="hnp_empty_plugin_description_field"&gt;' . esc_html($value) . '&lt;/textarea&gt;';
}

// Callback function for dropdown field
function hnp_empty_plugin_dropdown_field_callback() {
    $value = get_option('hnp_empty_plugin_dropdown_field', 'option1'); // Fallback value is 'option1'
    ?&gt;
    &lt;select name="hnp_empty_plugin_dropdown_field"&gt;
        &lt;option value="option1" &lt;?php selected($value, 'option1'); ?&gt;&gt;Option 1&lt;/option&gt;
        &lt;option value="option2" &lt;?php selected($value, 'option2'); ?&gt;&gt;Option 2&lt;/option&gt;
        &lt;option value="option3" &lt;?php selected($value, 'option3'); ?&gt;&gt;Option 3&lt;/option&gt;
    &lt;/select&gt;
    &lt;?php
}

// Callback function for checkbox field
function hnp_empty_plugin_checkbox_field_callback() {
    $value = get_option('hnp_empty_plugin_checkbox_field', 0); // Fallback value is 0 (not checked)
    ?&gt;
    &lt;label for="hnp_empty_plugin_checkbox_field"&gt;
        &lt;input type="checkbox" name="hnp_empty_plugin_checkbox_field" id="hnp_empty_plugin_checkbox_field" value="1" &lt;?php checked($value, 1); ?&gt;&gt;
        Enable Checkbox
    &lt;/label&gt;
    &lt;?php
}

// Security measures: Nonce verification and save options
function hnp_empty_plugin_register_security_options() {
    // Check if the current page is our plugin options page
    if (isset($_POST['option_page']) &amp;&amp; $_POST['option_page'] == 'hnp_empty_plugin_settings_group') {
        // Check if the nonce is set and valid
        if (!isset($_POST['hnp_empty_plugin_settings_nonce']) || !wp_verify_nonce($_POST['hnp_empty_plugin_settings_nonce'], 'hnp_empty_plugin_settings_nonce')) {
            // Unauthorized request, do not save options
            wp_die('Unauthorized request.'); // Output error message for unauthorized requests
        }

        // Save options
        update_option('hnp_empty_plugin_name_field', $_POST['hnp_empty_plugin_name_field']);
        update_option('hnp_empty_plugin_number_field', sanitize_text_field($_POST['hnp_empty_plugin_number_field']));
        update_option('hnp_empty_plugin_color_field', sanitize_text_field($_POST['hnp_empty_plugin_color_field']));
        update_option('hnp_empty_plugin_description_field', sanitize_textarea_field($_POST['hnp_empty_plugin_description_field']));
        update_option('hnp_empty_plugin_dropdown_field', sanitize_text_field($_POST['hnp_empty_plugin_dropdown_field']));
        update_option('hnp_empty_plugin_checkbox_field', isset($_POST['hnp_empty_plugin_checkbox_field']) ? 1 : 0);
    }
}
add_action('admin_init', 'hnp_empty_plugin_register_security_options');

// Register plugin options and security measures
function hnp_empty_plugin_register_settings() {
    // Register setting and sanitize callback
    register_setting('hnp_empty_plugin_settings_group', 'hnp_empty_plugin_name_field');
    register_setting('hnp_empty_plugin_settings_group', 'hnp_empty_plugin_number_field');
    register_setting('hnp_empty_plugin_settings_group', 'hnp_empty_plugin_color_field');
    register_setting('hnp_empty_plugin_settings_group', 'hnp_empty_plugin_description_field');
    register_setting('hnp_empty_plugin_settings_group', 'hnp_empty_plugin_dropdown_field');
    register_setting('hnp_empty_plugin_settings_group', 'hnp_empty_plugin_checkbox_field');
}
add_action('admin_init', 'hnp_empty_plugin_register_settings');


// Security measures: Nonce verification for options update
function hnp_empty_plugin_validate_settings($input) {
    return $input; // Simply return the input, no further validation here
}

</pre>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/10/hnp-empty-plugin-wordpress-demo-code/">HNP Empty Plugin &#8211; WordPress Demo Code</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/04/10/hnp-empty-plugin-wordpress-demo-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HNP OpenStreetMap kostenloses Plugin</title>
		<link>https://homepage-nach-preis.de/2024/04/10/hnp-openstreetmap-kostenloses-plugin/</link>
					<comments>https://homepage-nach-preis.de/2024/04/10/hnp-openstreetmap-kostenloses-plugin/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Wed, 10 Apr 2024 10:19:20 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Homepage]]></category>
		<category><![CDATA[Wordpress Code]]></category>
		<category><![CDATA[Karte]]></category>
		<category><![CDATA[kostenlos]]></category>
		<category><![CDATA[Openmaps]]></category>
		<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Shortcode]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8176</guid>

					<description><![CDATA[<p>Das &#8220;HNP OpenStreetMap Shortcode&#8221; Plugin ermöglicht es Benutzern, OpenStreetMap-Karten mit einem Pin direkt auf ihrer WordPress-Website einzubetten, indem sie einen Shortcode verwenden. Es bietet eine einfache Möglichkeit, einen Standort auf einer interaktiven Karte zu markieren. &#160; Hier sind die Hauptmerkmale des Plugins: Shortcode-Unterstützung: Benutzer können den bereitgestellten Shortcode verwenden, um eine Karte mit einem Pin an einem bestimmten Standort anzuzeigen. Anpassbare Optionen: Das Plugin bietet verschiedene anpassbare Optionen, darunter die Möglichkeit, die Adresse des Pins, den Namen des Markers, den Zoomlevel der Karte, den Kartenstil sowie die Höhe und Breite der Karte anzupassen. Integrierte Sicherheitsmaßnahmen: Das Plugin enthält Sicherheitsmaßnahmen wie Nonce-Überprüfung, um unautorisierte Zugriffe auf die Plugin-Optionen zu verhindern und die Datenintegrität zu gewährleisten. Einfache Konfiguration: Benutzer können die Plugin-Optionen über das WordPress-Adminpanel konfigurieren, um ihre Karten entsprechend ihren Anforderungen anzupassen. Das Plugin wurde von Homepage-nach-Preis.de entwickelt und steht unter der GNU General Public License Version 3 (GPLv3), was bedeutet, dass es kostenlos verwendet und modifiziert werden kann, solange die Lizenzbedingungen eingehalten werden. Download: [sdm_download id=&#8221;8174&#8243; fancy=&#8221;0&#8243;] Github: https://github.com/HNP-Christopher-Rohde/hnp-openstreetmap-wordpress-plugin/tree/main/hnp_openstreetmap Quellcode: &#x3C;?php /* Plugin Name: HNP OpenStreetMap Shortcode Description: Creates a frontend OpenStreetMap map with a pin using a shortcode Version: 1.0 Author: HNP - C.R. Author URI: https://homepage-nach-preis.de/ License: GPLv3....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/10/hnp-openstreetmap-kostenloses-plugin/">HNP OpenStreetMap kostenloses Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Das &#8220;HNP OpenStreetMap Shortcode&#8221; Plugin ermöglicht es Benutzern, OpenStreetMap-Karten mit einem Pin direkt auf ihrer WordPress-Website einzubetten, indem sie einen Shortcode verwenden. Es bietet eine einfache Möglichkeit, einen Standort auf einer interaktiven Karte zu markieren.</p>
<p>&nbsp;</p>
<p>Hier sind die Hauptmerkmale des Plugins:</p>
<ol>
<li><strong>Shortcode-Unterstützung:</strong> Benutzer können den bereitgestellten Shortcode verwenden, um eine Karte mit einem Pin an einem bestimmten Standort anzuzeigen.</li>
<li><strong>Anpassbare Optionen:</strong> Das Plugin bietet verschiedene anpassbare Optionen, darunter die Möglichkeit, die Adresse des Pins, den Namen des Markers, den Zoomlevel der Karte, den Kartenstil sowie die Höhe und Breite der Karte anzupassen.</li>
<li><strong>Integrierte Sicherheitsmaßnahmen:</strong> Das Plugin enthält Sicherheitsmaßnahmen wie Nonce-Überprüfung, um unautorisierte Zugriffe auf die Plugin-Optionen zu verhindern und die Datenintegrität zu gewährleisten.</li>
<li><strong>Einfache Konfiguration:</strong> Benutzer können die Plugin-Optionen über das WordPress-Adminpanel konfigurieren, um ihre Karten entsprechend ihren Anforderungen anzupassen.</li>
</ol>
<p>Das Plugin wurde von Homepage-nach-Preis.de entwickelt und steht unter der GNU General Public License Version 3 (GPLv3), was bedeutet, dass es kostenlos verwendet und modifiziert werden kann, solange die Lizenzbedingungen eingehalten werden.</p>
<p><strong>Download:</strong> [sdm_download id=&#8221;8174&#8243; fancy=&#8221;0&#8243;]</p>
<p><strong>Github:</strong> <a href="https://github.com/HNP-Christopher-Rohde/hnp-openstreetmap-wordpress-plugin/tree/main/hnp_openstreetmap" target="_blank" rel="nofollow noopener">https://github.com/HNP-Christopher-Rohde/hnp-openstreetmap-wordpress-plugin/tree/main/hnp_openstreetmap</a><br />
<strong>Quellcode:</strong></p>
<pre>
&#x3C;?php
/*
  Plugin Name: HNP OpenStreetMap Shortcode
  Description: Creates a frontend OpenStreetMap map with a pin using a shortcode
  Version: 1.0
  Author: HNP - C.R.
  Author URI: https://homepage-nach-preis.de/
  License: GPLv3
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
 */

// Security check to prevent direct access to the plugin file
defined(&#x27;ABSPATH&#x27;) or die(&#x27;No script kiddies please!&#x27;);

// Function to enqueue Leaflet library
function hnp_openmaps_enqueue_leaflet_scripts() {
    // Define a version number for your CSS file
    $version = &#x27;1.9.4&#x27;;

    // Check if Leaflet CSS is not already enqueued
    if (!wp_style_is(&#x27;leaflet-css&#x27;)) {
        // Enqueue Leaflet CSS with the defined version
        wp_enqueue_style(&#x27;leaflet-css&#x27;, plugin_dir_url(__FILE__) . &#x27;leaflet/leaflet.css&#x27;, array(), $version);
    }

    // Check if Leaflet JavaScript is not already enqueued
    if (!wp_script_is(&#x27;leaflet-js&#x27;)) {
        // Enqueue Leaflet JavaScript with the defined version
        wp_enqueue_script(&#x27;leaflet-js&#x27;, plugin_dir_url(__FILE__) . &#x27;leaflet/leaflet.js&#x27;, array(), $version, true);
    }
}
add_action(&#x27;wp_enqueue_scripts&#x27;, &#x27;hnp_openmaps_enqueue_leaflet_scripts&#x27;);

// Function to display OpenStreetMap maps with a pin
function hnp_openmaps_display_map_with_pin() {
    // Load options and sanitize address
    $raw_address = get_option(&#x27;hnp_openmaps_map_address&#x27;, &#x27;Hardenbergpl. 8, 10787 Berlin, Germany&#x27;);
    $clean_address = sanitize_text_field($raw_address);

    // Load options and sanitize marker name
    $marker_name = get_option(&#x27;hnp_openmaps_map_name&#x27;, &#x27;Berlin Zoological Garden&#x27;); 

    // Load zoom level, map style, height, and width of the map
    $zoom = get_option(&#x27;hnp_openmaps_map_zoom&#x27;, 12);
    $style = get_option(&#x27;hnp_openmaps_map_style&#x27;, &#x27;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#x27;);
    $height = get_option(&#x27;hnp_openmaps_map_height&#x27;, &#x27;400px&#x27;);
    $width = get_option(&#x27;hnp_openmaps_map_width&#x27;, &#x27;100%&#x27;);

    // JavaScript variable for map initialization and adding markers
    $map = &#x22;
        &#x3C;script&#x3E;
            document.addEventListener(&#x27;DOMContentLoaded&#x27;, function() {
    &#x22;;

    // Split address into individual parts and encode
    $address_parts = explode(&#x27;,&#x27;, $clean_address);
    $encoded_address_parts = array_map(&#x27;urlencode&#x27;, $address_parts);
    $encoded_address = implode(&#x27;,&#x27;, $encoded_address_parts);

    // Construct Nominatim URL
    $nominatim_url = &#x22;https://nominatim.openstreetmap.org/search?format=json&#x26;q={$encoded_address}&#x22;;

    // Get geocoding data from Nominatim
    $response = wp_remote_get($nominatim_url);

    // Check if the request was successful
    if (!is_wp_error($response) &#x26;&#x26; wp_remote_retrieve_response_code($response) === 200) {
        $data = json_decode(wp_remote_retrieve_body($response), true);

        // Check if geocoding results were obtained
        if (!empty($data)) {
            $latitude = $data[0][&#x27;lat&#x27;];
            $longitude = $data[0][&#x27;lon&#x27;];

            // Initialize map with center at marker coordinates
            $map .= &#x22;
                var hnp_openmaps_map = L.map(&#x27;hnp_openmaps_map&#x27;).setView([$latitude, $longitude], $zoom);
            &#x22;;

            // Add tiles to the map
            $map .= &#x22;
                L.tileLayer(&#x27;$style&#x27;, {
                    attribution: &#x27;&#x26;copy; &#x3C;a href=\&#x22;https://www.openstreetmap.org/copyright\&#x22;&#x3E;OpenStreetMap&#x3C;/a&#x3E; contributors&#x27;
                }).addTo(hnp_openmaps_map);
            &#x22;;

            // Add marker to the map
            $map .= &#x22;
                L.marker([$latitude, $longitude]).addTo(hnp_openmaps_map).bindPopup(&#x27;&#x22; . esc_js($clean_address) . &#x22;&#x27;).bindTooltip(&#x27;&#x22; . esc_js($marker_name) . &#x22;&#x27;);
                console.log(&#x27;Geocoding successful for address:&#x27;, &#x22; . wp_json_encode($clean_address) . &#x22;);
            &#x22;;
        } else {
            // Error retrieving geocoding data
            error_log(&#x22;Error retrieving geocoding data for address: $clean_address&#x22;);
            $map .= &#x22;
                console.log(&#x27;Error retrieving geocoding data for address:&#x27;, &#x22; . wp_json_encode($clean_address) . &#x22;);
            &#x22;;
        }
    } else {
        // Error retrieving geocoding data
        error_log(&#x22;Error retrieving geocoding data for address: $clean_address&#x22;);
        $map .= &#x22;
            console.log(&#x27;Error retrieving geocoding data for address:&#x27;, &#x22; . wp_json_encode($clean_address) . &#x22;);
        &#x22;;
    }

    // Add JavaScript end
    $map .= &#x22;
            });
        &#x3C;/script&#x3E;
    &#x22;;

    // Return map div and JavaScript
    return &#x27;&#x3C;div id=&#x22;hnp_openmaps_map&#x22; style=&#x22;height: &#x27; . esc_attr($height) . &#x27;; width: &#x27; . esc_attr($width) . &#x27;;&#x22;&#x3E;&#x3C;/div&#x3E;&#x27; . $map;
}

// Register shortcode
add_shortcode(&#x27;hnp_openmaps_display_map_with_pin&#x27;, &#x27;hnp_openmaps_display_map_with_pin&#x27;);

// Function to add plugin options to the main menu
function hnp_openmaps_add_plugin_options_page() {
    // Check permission
    if (current_user_can(&#x27;manage_options&#x27;)) {
        add_menu_page(
            &#x27;HNP OpenStreetMap Settings&#x27;,
            &#x27;HNP OpenStreetMap&#x27;,
            &#x27;manage_options&#x27;,
            &#x27;hnp-openmaps-osm-settings&#x27;,
            &#x27;hnp_openmaps_render_plugin_options_page&#x27;,
            plugin_dir_url(__FILE__) . &#x27;img/hnp-favi.png&#x27; 
        );
    }
}
add_action(&#x27;admin_menu&#x27;, &#x27;hnp_openmaps_add_plugin_options_page&#x27;);

// Add settings link to plugin on the Plugins page
function hnp_openmaps_add_settings_link($links) {
    $settings_link = &#x27;&#x3C;a href=&#x22;admin.php?page=hnp-openmaps-osm-settings&#x22;&#x3E;&#x27; . __(&#x27;Settings&#x27;) . &#x27;&#x3C;/a&#x3E;&#x27;;
    array_unshift($links, $settings_link); // Add the settings link at the beginning of the array
    return $links;
}
add_filter(&#x27;plugin_action_links_&#x27; . plugin_basename(__FILE__), &#x27;hnp_openmaps_add_settings_link&#x27;);


// Function to render plugin options page
function hnp_openmaps_render_plugin_options_page() {
    ?&#x3E;
    &#x3C;div class=&#x22;wrap&#x22;&#x3E;
        &#x3C;h1&#x3E;HNP OpenStreetMap Settings&#x3C;/h1&#x3E;
        &#x3C;form method=&#x22;post&#x22; action=&#x22;options.php&#x22;&#x3E;
            &#x3C;?php settings_fields(&#x27;hnp_openmaps_osm_settings_group&#x27;); ?&#x3E;
            &#x3C;?php do_settings_sections(&#x27;hnp-openmaps-osm-settings&#x27;); ?&#x3E;
            &#x3C;?php 
                // Add nonce
                wp_nonce_field(&#x27;hnp_openmaps_osm_settings_nonce&#x27;, &#x27;hnp_openmaps_osm_settings_nonce&#x27;); 
            ?&#x3E;
            &#x3C;?php submit_button(); ?&#x3E;
        &#x3C;/form&#x3E;
    &#x3C;/div&#x3E;
    &#x3C;?php
}

</pre>
<pre>

// Function to register plugin options
function hnp_openmaps_register_plugin_options() {
    // Adresse
    add_settings_section(
        &#x27;hnp_openmaps_osm_address_section&#x27;,
        &#x27;Address&#x27;,
        &#x27;hnp_openmaps_osm_address_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
    add_settings_field(
        &#x27;hnp_openmaps_map_address&#x27;,
        &#x27;Address&#x27;,
        &#x27;hnp_openmaps_map_address_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;,
        &#x27;hnp_openmaps_osm_address_section&#x27;
    );
    register_setting(&#x27;hnp_openmaps_osm_settings_group&#x27;, &#x27;hnp_openmaps_map_address&#x27;);

    // Name
    add_settings_section(
        &#x27;hnp_openmaps_osm_name_section&#x27;,
        &#x27;Name&#x27;,
        &#x27;hnp_openmaps_osm_name_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
    add_settings_field(
        &#x27;hnp_openmaps_map_name&#x27;,
        &#x27;Name&#x27;,
        &#x27;hnp_openmaps_map_name_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;,
        &#x27;hnp_openmaps_osm_name_section&#x27;
    );
    register_setting(&#x27;hnp_openmaps_osm_settings_group&#x27;, &#x27;hnp_openmaps_map_name&#x27;);

    // Karten-Zoom
    add_settings_section(
        &#x27;hnp_openmaps_osm_zoom_section&#x27;,
        &#x27;Map Zoom&#x27;,
        &#x27;hnp_openmaps_osm_zoom_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
    add_settings_field(
        &#x27;hnp_openmaps_map_zoom&#x27;,
        &#x27;Map Zoom&#x27;,
        &#x27;hnp_openmaps_map_zoom_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;,
        &#x27;hnp_openmaps_osm_zoom_section&#x27;
    );
    register_setting(&#x27;hnp_openmaps_osm_settings_group&#x27;, &#x27;hnp_openmaps_map_zoom&#x27;);

    // Kartenstil
    add_settings_section(
        &#x27;hnp_openmaps_osm_style_section&#x27;,
        &#x27;Map Style&#x27;,
        &#x27;hnp_openmaps_osm_style_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
    add_settings_field(
        &#x27;hnp_openmaps_map_style&#x27;,
        &#x27;Map Style&#x27;,
        &#x27;hnp_openmaps_map_style_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;,
        &#x27;hnp_openmaps_osm_style_section&#x27;
    );
    register_setting(&#x27;hnp_openmaps_osm_settings_group&#x27;, &#x27;hnp_openmaps_map_style&#x27;);

    add_settings_section(
        &#x27;hnp_openmaps_osm_height_section&#x27;,
        &#x27;Map Height&#x27;,
        &#x27;hnp_openmaps_osm_height_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
    add_settings_field(
        &#x27;hnp_openmaps_map_height&#x27;,
        &#x27;Map Height&#x27;,
        &#x27;hnp_openmaps_map_height_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;,
        &#x27;hnp_openmaps_osm_height_section&#x27;
    );
    register_setting(&#x27;hnp_openmaps_osm_settings_group&#x27;, &#x27;hnp_openmaps_map_height&#x27;);

    add_settings_section(
        &#x27;hnp_openmaps_osm_width_section&#x27;,
        &#x27;Map Width&#x27;,
        &#x27;hnp_openmaps_osm_width_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
    add_settings_field(
        &#x27;hnp_openmaps_map_width&#x27;,
        &#x27;Map Width&#x27;,
        &#x27;hnp_openmaps_map_width_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;,
        &#x27;hnp_openmaps_osm_width_section&#x27;
    );
    register_setting(&#x27;hnp_openmaps_osm_settings_group&#x27;, &#x27;hnp_openmaps_map_width&#x27;);

    add_settings_section(
        &#x27;hnp_openmaps_shortcode_section&#x27;,
        &#x27;Shortcode&#x27;,
        &#x27;hnp_openmaps_shortcode_section_callback&#x27;,
        &#x27;hnp-openmaps-osm-settings&#x27;
    );
}

</pre>
<pre>

// Callback functions for each option
function hnp_openmaps_osm_address_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Enter the address to be displayed on the map. &#x3C;br&#x3E;Format: Streetname + Housenumber, City Name + ZIP Code, Country &#x3C;br&#x3E;(Separate each part with a comma)&#x3C;/p&#x3E;&#x27;;
}
function hnp_openmaps_map_address_callback() {
    $address = get_option(&#x27;hnp_openmaps_map_address&#x27;, &#x27;Hardenbergpl. 8, 10787 Berlin, Germany&#x27;);
    echo &#x27;&#x3C;input type=&#x22;text&#x22; name=&#x22;hnp_openmaps_map_address&#x22; value=&#x22;&#x27; . esc_attr($address) . &#x27;&#x22; /&#x3E;&#x27;;
}

function hnp_openmaps_osm_name_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Enter the name for the marker to be displayed on the map.&#x3C;/p&#x3E;&#x27;;
}
function hnp_openmaps_map_name_callback() {
    $name = get_option(&#x27;hnp_openmaps_map_name&#x27;, &#x27;Berlin Zoological Garden&#x27;);
    echo &#x27;&#x3C;input type=&#x22;text&#x22; name=&#x22;hnp_openmaps_map_name&#x22; value=&#x22;&#x27; . esc_attr($name) . &#x27;&#x22; /&#x3E;&#x27;;
}

function hnp_openmaps_osm_zoom_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Set the zoom level of the map.&#x3C;/p&#x3E;&#x27;;
}
function hnp_openmaps_map_zoom_callback() {
    $zoom = get_option(&#x27;hnp_openmaps_map_zoom&#x27;, 12);
    echo &#x27;&#x3C;input type=&#x22;number&#x22; name=&#x22;hnp_openmaps_map_zoom&#x22; value=&#x22;&#x27; . esc_attr($zoom) . &#x27;&#x22; /&#x3E;&#x27;;
}
function hnp_openmaps_osm_style_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Select the map style.&#x3C;/p&#x3E;&#x27;;
}
function hnp_openmaps_map_style_callback() {
    $style = get_option(&#x27;hnp_openmaps_map_style&#x27;, &#x27;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#x27;);
    $styles = array(
        &#x27;Standard (OpenStreetMap)&#x27; =&#x3E; &#x27;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&#x27;,
        &#x27;Hot&#x27; =&#x3E; &#x27;https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png&#x27;,
        &#x27;Cycle&#x27; =&#x3E; &#x27;https://tile.thunderforest.com/cycle/{z}/{x}/{y}.png&#x27;,
        &#x27;Transport&#x27; =&#x3E; &#x27;https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png&#x27;
        // More styles can be added here
    );
    echo &#x27;&#x3C;select name=&#x22;hnp_openmaps_map_style&#x22;&#x3E;&#x27;;
    foreach ($styles as $label =&#x3E; $url) {
        echo &#x27;&#x3C;option value=&#x22;&#x27; . esc_attr($url) . &#x27;&#x22; &#x27; . selected($style, $url, false) . &#x27;&#x3E;&#x27; . esc_html($label) . &#x27;&#x3C;/option&#x3E;&#x27;;
    }
    echo &#x27;&#x3C;/select&#x3E;&#x27;;
}

function hnp_openmaps_osm_height_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Set the height of the map.&#x3C;/p&#x3E;&#x27;;
}
function hnp_openmaps_map_height_callback() {
    $height = get_option(&#x27;hnp_openmaps_map_height&#x27;, &#x27;400px&#x27;);
    echo &#x27;&#x3C;input type=&#x22;text&#x22; name=&#x22;hnp_openmaps_map_height&#x22; value=&#x22;&#x27; . esc_attr($height) . &#x27;&#x22; /&#x3E;&#x27;;
}
function hnp_openmaps_osm_width_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Set the width of the map.&#x3C;/p&#x3E;&#x27;;
}
function hnp_openmaps_map_width_callback() {
    $width = get_option(&#x27;hnp_openmaps_map_width&#x27;, &#x27;100%&#x27;);
    echo &#x27;&#x3C;input type=&#x22;text&#x22; name=&#x22;hnp_openmaps_map_width&#x22; value=&#x22;&#x27; . esc_attr($width) . &#x27;&#x22; /&#x3E;&#x27;;
}
function hnp_openmaps_shortcode_section_callback() {
    echo &#x27;&#x3C;p&#x3E;Shortcode: &#x26;#x5B;hnp_openmaps_display_map_with_pin]&#x3C;/p&#x3E;&#x27;;
}

// Register plugin options and security measures
add_action(&#x27;admin_init&#x27;, &#x27;hnp_openmaps_register_plugin_options&#x27;);

// Security measures: Nonce verification for options update
function hnp_openmaps_validate_settings($input) {
    return $input; // Simply return the input, no further validation here
}

// Security measures: Nonce verification and save options
function hnp_openmaps_register_security_options() {
    // Check if the current page is our plugin options page
    if (isset($_POST[&#x27;option_page&#x27;]) &#x26;&#x26; $_POST[&#x27;option_page&#x27;] == &#x27;hnp_openmaps_osm_settings_group&#x27;) {
        // Check if the nonce is set and valid
        if (!isset($_POST[&#x27;hnp_openmaps_osm_settings_nonce&#x27;]) || !wp_verify_nonce($_POST[&#x27;hnp_openmaps_osm_settings_nonce&#x27;], &#x27;hnp_openmaps_osm_settings_nonce&#x27;)) {
            // Unauthorized request, do not save options
            wp_die(&#x27;Unauthorized request.&#x27;); // Output error message for unauthorized requests
        }

        // Save options
        update_option(&#x27;hnp_openmaps_map_address&#x27;, $_POST[&#x27;hnp_openmaps_map_address&#x27;]);
        update_option(&#x27;hnp_openmaps_map_name&#x27;, $_POST[&#x27;hnp_openmaps_map_name&#x27;]);
        update_option(&#x27;hnp_openmaps_map_zoom&#x27;, $_POST[&#x27;hnp_openmaps_map_zoom&#x27;]);
        update_option(&#x27;hnp_openmaps_map_style&#x27;, $_POST[&#x27;hnp_openmaps_map_style&#x27;]);
        update_option(&#x27;hnp_openmaps_map_height&#x27;, $_POST[&#x27;hnp_openmaps_map_height&#x27;]);
        update_option(&#x27;hnp_openmaps_map_width&#x27;, $_POST[&#x27;hnp_openmaps_map_width&#x27;]);
    }
}
add_action(&#x27;admin_init&#x27;, &#x27;hnp_openmaps_register_security_options&#x27;);

</pre>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/10/hnp-openstreetmap-kostenloses-plugin/">HNP OpenStreetMap kostenloses Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/04/10/hnp-openstreetmap-kostenloses-plugin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HNP Bewertungssystem Plugin</title>
		<link>https://homepage-nach-preis.de/2024/04/05/hnp-bewertungssystem-plugin/</link>
					<comments>https://homepage-nach-preis.de/2024/04/05/hnp-bewertungssystem-plugin/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Fri, 05 Apr 2024 12:24:30 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Bewertungen]]></category>
		<category><![CDATA[Bewertungssystem]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Rating]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8151</guid>

					<description><![CDATA[<p>HNP Rating Form &#8211; Revolutionieren Sie das Bewertungserlebnis auf Ihrer WordPress-Website Das HNP Rating Form Plugin ist die ultimative Lösung, um Ihrer WordPress-Website eine hochmoderne Bewertungsfunktion hinzuzufügen. Mit einer Vielzahl von leistungsstarken Funktionen und einem benutzerfreundlichen Interface bietet dieses Plugin eine nahtlose Möglichkeit, das Feedback Ihrer Benutzer zu sammeln und zu verwalten. Hier sind einige herausragende Merkmale, die das HNP Rating Form Plugin zu bieten hat: &#160; Benutzerfreundliches Backend-Interface Das Plugin bietet eine intuitive und benutzerfreundliche Oberfläche im WordPress-Backend, über die Sie mühelos alle Aspekte Ihres Bewertungssystems verwalten können. Von der Genehmigung von Bewertungen bis hin zur Anpassung der Einstellungen haben Sie alles im Griff. &#160; Sicherheitsfunktionen zum Schutz vor Missbrauch Mit integrierten Sicherheitsfunktionen wie Captcha können Sie Ihr Bewertungssystem vor Spam und Missbrauch schützen. Aktivieren Sie Captcha, um sicherzustellen, dass nur echte Benutzer Bewertungen abgeben können, ohne von unerwünschten Inhalten überflutet zu werden. &#160; Flexible Einstellungsoptionen Passen Sie das Bewertungssystem an Ihre spezifischen Anforderungen an, indem Sie Optionen wie die Anzeige des Bewertungsdatums, die automatische Freischaltung von Bewertungen und die Anzahl der angezeigten Sterne anpassen. Mit dem HNP Rating Form Plugin haben Sie die volle Kontrolle über Ihre Bewertungen. &#160; Leistungsstarke Shortcodes für eine nahtlose Integration Nutzen Sie eine....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/05/hnp-bewertungssystem-plugin/">HNP Bewertungssystem Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>HNP Rating Form &#8211; Revolutionieren Sie das Bewertungserlebnis auf Ihrer WordPress-Website</h3>
<p>Das HNP Rating Form Plugin ist die ultimative Lösung, um Ihrer WordPress-Website eine hochmoderne Bewertungsfunktion hinzuzufügen. Mit einer Vielzahl von leistungsstarken Funktionen und einem benutzerfreundlichen Interface bietet dieses Plugin eine nahtlose Möglichkeit, das Feedback Ihrer Benutzer zu sammeln und zu verwalten. Hier sind einige herausragende Merkmale, die das HNP Rating Form Plugin zu bieten hat:</p>
<p>&nbsp;</p>
<h3>Benutzerfreundliches Backend-Interface</h3>
<p>Das Plugin bietet eine intuitive und benutzerfreundliche Oberfläche im WordPress-Backend, über die Sie mühelos alle Aspekte Ihres Bewertungssystems verwalten können. Von der Genehmigung von Bewertungen bis hin zur Anpassung der Einstellungen haben Sie alles im Griff.</p>
<p>&nbsp;</p>
<h3>Sicherheitsfunktionen zum Schutz vor Missbrauch</h3>
<p>Mit integrierten Sicherheitsfunktionen wie Captcha können Sie Ihr Bewertungssystem vor Spam und Missbrauch schützen. Aktivieren Sie Captcha, um sicherzustellen, dass nur echte Benutzer Bewertungen abgeben können, ohne von unerwünschten Inhalten überflutet zu werden.</p>
<p>&nbsp;</p>
<h3>Flexible Einstellungsoptionen</h3>
<p>Passen Sie das Bewertungssystem an Ihre spezifischen Anforderungen an, indem Sie Optionen wie die Anzeige des Bewertungsdatums, die automatische Freischaltung von Bewertungen und die Anzahl der angezeigten Sterne anpassen. Mit dem HNP Rating Form Plugin haben Sie die volle Kontrolle über Ihre Bewertungen.</p>
<p>&nbsp;</p>
<h3>Leistungsstarke Shortcodes für eine nahtlose Integration</h3>
<p>Nutzen Sie eine Vielzahl von Shortcodes, um Bewertungsformulare und -ergebnisse nahtlos in Ihre Website zu integrieren. Mit Shortcodes können Sie Gesamtbewertungen, Einzelbewertungen und benutzerdefinierte Bewertungsformulare mit Leichtigkeit anzeigen.</p>
<p>&nbsp;</p>
<h3>Vollständig anpassbares Design</h3>
<p>Passen Sie das Aussehen und Verhalten Ihres Bewertungssystems mühelos an, um sicherzustellen, dass es perfekt zu Ihrem Website-Design passt. Mit benutzerdefinierten CSS-Styles können Sie das Aussehen Ihres Bewertungssystems ganz nach Ihren Wünschen gestalten.</p>
<p>&nbsp;</p>
<h3>Unterstützung für strukturierte Daten (JSON-LD)</h3>
<p>Verbessern Sie die Sichtbarkeit Ihrer Website in den Suchergebnissen, indem Sie strukturierte Daten für Rich Snippets hinzufügen. Das Plugin generiert automatisch strukturierte Daten für Ihre Bewertungen, um Suchmaschinen zu helfen, Ihre Inhalte besser zu verstehen.</p>
<p>&nbsp;</p>
<p>Das HNP Rating Form Plugin bietet Ihnen alles, was Sie benötigen, um das Benutzerengagement zu steigern, wertvolle Rückmeldungen zu sammeln und das Vertrauen Ihrer Besucher zu stärken. Holen Sie sich noch heute das Plugin und bringen Sie Ihre Bewertungen auf die nächste Stufe!</p>
<p>Erwecken Sie Ihre Website zum Leben und geben Sie Ihren Benutzern eine Stimme mit dem HNP Rating Form Plugin!</p>
<p>&nbsp;</p>
<p><strong>Mehr Lesen &amp; Download:</strong></p>
<p><a href="https://shop.homepage-nach-preis.de/produkt/hnp-bewertungssystem-wordpress-plugin/" target="_blank" rel="nofollow noopener">https://shop.homepage-nach-preis.de/produkt/hnp-bewertungssystem-wordpress-plugin/</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/04/05/hnp-bewertungssystem-plugin/">HNP Bewertungssystem Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/04/05/hnp-bewertungssystem-plugin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HNP SQL-Database Tool für WordPress als Plugin</title>
		<link>https://homepage-nach-preis.de/2024/03/31/hnp-database-tool-fuer-wordpress-als-plugin/</link>
					<comments>https://homepage-nach-preis.de/2024/03/31/hnp-database-tool-fuer-wordpress-als-plugin/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Sun, 31 Mar 2024 00:35:32 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Wordpress Code]]></category>
		<category><![CDATA[Abrufen]]></category>
		<category><![CDATA[ändern]]></category>
		<category><![CDATA[Bearbeiten]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[HNP Database Tool]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8122</guid>

					<description><![CDATA[<p>Einleitung: Die effiziente Verwaltung von Datenbankeinträgen ist entscheidend für die reibungslose Funktion einer WordPress-Website. Von der Aktualisierung von Produktinformationen bis hin zur Verfolgung von Benutzeraktivitäten müssen Website-Betreiber häufig auf Datenbanktabellen zugreifen und Einträge bearbeiten. Das HNP Database Tool Plugin bietet eine benutzerfreundliche Lösung, um diese Aufgaben direkt aus dem WordPress-Dashboard heraus durchzuführen. Was ist das Database Change Plugin?: Das HNP Database Plugin ist ein leistungsstarkes Tool, das es WordPress-Benutzern ermöglicht, Datenbankeinträge abzurufen und zu ändern, ohne dass sie sich direkt mit SQL-Abfragen befassen müssen. Mit diesem Plugin können Benutzer die gewünschten Tabellen und Spalten angeben, nach denen sie suchen möchten, und dann die Ergebnisse direkt im WordPress-Adminbereich anzeigen und bearbeiten. Funktionen des Plugins: Einfache Konfiguration: Das Plugin fügt eine benutzerdefinierte Optionenseite im WordPress-Dashboard hinzu, auf der Benutzer die Datenbanktabelle, die zu durchsuchende Spalte und optional eine weitere Spalte für die Anzeige auswählen können. Sicherheit im Vordergrund: Das Plugin verwendet sichere Methoden zur Datenbereinigung und Escapen, um XSS-Angriffe und SQL-Injectionen zu verhindern und die Sicherheit der Website zu gewährleisten. Live-Vorschau der Ergebnisse: Nach der Konfiguration zeigt das Plugin eine Live-Vorschau der Datenbankeinträge an, die den angegebenen Kriterien entsprechen. Benutzer können die Ergebnisse direkt im Adminbereich anzeigen und bearbeiten. Direkte Aktualisierung: Das....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/03/31/hnp-database-tool-fuer-wordpress-als-plugin/">HNP SQL-Database Tool für WordPress als Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>Einleitung:</strong> Die effiziente Verwaltung von Datenbankeinträgen ist entscheidend für die reibungslose Funktion einer WordPress-Website. Von der Aktualisierung von Produktinformationen bis hin zur Verfolgung von Benutzeraktivitäten müssen Website-Betreiber häufig auf Datenbanktabellen zugreifen und Einträge bearbeiten. Das HNP Database Tool Plugin bietet eine benutzerfreundliche Lösung, um diese Aufgaben direkt aus dem WordPress-Dashboard heraus durchzuführen.</p>
<p><strong>Was ist das Database Change Plugin?:</strong> Das HNP Database Plugin ist ein leistungsstarkes Tool, das es WordPress-Benutzern ermöglicht, Datenbankeinträge abzurufen und zu ändern, ohne dass sie sich direkt mit SQL-Abfragen befassen müssen. Mit diesem Plugin können Benutzer die gewünschten Tabellen und Spalten angeben, nach denen sie suchen möchten, und dann die Ergebnisse direkt im WordPress-Adminbereich anzeigen und bearbeiten.</p>
<p><strong>Funktionen des Plugins:</strong></p>
<ol>
<li><strong>Einfache Konfiguration:</strong> Das Plugin fügt eine benutzerdefinierte Optionenseite im WordPress-Dashboard hinzu, auf der Benutzer die Datenbanktabelle, die zu durchsuchende Spalte und optional eine weitere Spalte für die Anzeige auswählen können.</li>
<li><strong>Sicherheit im Vordergrund:</strong> Das Plugin verwendet sichere Methoden zur Datenbereinigung und Escapen, um XSS-Angriffe und SQL-Injectionen zu verhindern und die Sicherheit der Website zu gewährleisten.</li>
<li><strong>Live-Vorschau der Ergebnisse:</strong> Nach der Konfiguration zeigt das Plugin eine Live-Vorschau der Datenbankeinträge an, die den angegebenen Kriterien entsprechen. Benutzer können die Ergebnisse direkt im Adminbereich anzeigen und bearbeiten.</li>
<li><strong>Direkte Aktualisierung:</strong> Das Plugin ermöglicht es Benutzern, Werte direkt aus der Ergebnistabelle heraus zu bearbeiten und zu aktualisieren, ohne die Seite verlassen zu müssen. Dies spart Zeit und verbessert die Benutzerfreundlichkeit.</li>
</ol>
<p><strong>Verwendung des Plugins:</strong></p>
<ol>
<li>Installieren und aktivieren Sie das Das HNP Database Tool Plugin über den WordPress-Plugin-Manager.</li>
<li>Gehen Sie zum neuen Menüpunkt &#8220;Das HNP Database Tool&#8221; im WordPress-Dashboard und konfigurieren Sie die gewünschten Optionen.</li>
<li>Sobald die Optionen festgelegt sind, zeigt das Plugin eine Live-Vorschau der Datenbankeinträge an, die den angegebenen Kriterien entsprechen.</li>
<li>Bearbeiten Sie die Werte direkt aus der Ergebnistabelle heraus und aktualisieren Sie sie bei Bedarf.</li>
</ol>
<p><strong>Mehr Informationen und Kaufmöglichkeit:</strong><br />
<a href="https://shop.homepage-nach-preis.de/produkt/hnp-wordpress-database-tool/" rel="noopener nofollow" target="_blank">https://shop.homepage-nach-preis.de/produkt/hnp-wordpress-database-tool/</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/03/31/hnp-database-tool-fuer-wordpress-als-plugin/">HNP SQL-Database Tool für WordPress als Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/03/31/hnp-database-tool-fuer-wordpress-als-plugin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Wie einflussreich sind Backlinks für eine Webseite?</title>
		<link>https://homepage-nach-preis.de/2024/03/22/wie-einflussreich-sind-backlinks-fuer-eine-webseite/</link>
					<comments>https://homepage-nach-preis.de/2024/03/22/wie-einflussreich-sind-backlinks-fuer-eine-webseite/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Fri, 22 Mar 2024 00:46:40 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Seo-Optimierung]]></category>
		<category><![CDATA[Backlinks]]></category>
		<category><![CDATA[Einfluss]]></category>
		<category><![CDATA[Seo]]></category>
		<category><![CDATA[Wirkung]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8112</guid>

					<description><![CDATA[<p>Kunden Original Screenshot, nach Nutzung unseres Backlink-Services, aus der Google Search Console &#160; Die Bedeutung von Backlinks für die Suchmaschinenoptimierung (SEO) kann kaum überschätzt werden. Untersuchungen und Studien haben gezeigt, dass Backlinks einen wesentlichen Einfluss auf das Ranking einer Website in den Suchergebnissen haben und darüber hinaus auch Traffic, Umsatz und Konversionsraten beeinflussen können. Eine detaillierte Analyse verschiedener Daten und Studien verdeutlicht diesen Zusammenhang eindrucksvoll. Korrelation mit Rankings: Moz führte im Jahr 2019 eine umfangreiche Studie durch, bei der über 12.000 Keywords und mehr als 100.000 Websites analysiert wurden. Die Ergebnisse dieser Studie zeigten eine starke Korrelation zwischen der Anzahl der Backlinks und der Position einer Website in den Suchergebnissen. Websites, die in den Top 10 der Google-Suchergebnisse rankten, wiesen im Durchschnitt über 168% mehr Backlinks auf als solche außerhalb dieser Top-Positionen. Eine ähnliche Untersuchung von Ahrefs bestätigte diese Ergebnisse und ergänzte, dass Seiten in den Top 10 im Durchschnitt über 3,5-mal mehr Backlinks hatten als Seiten auf den Plätzen 4 bis 10. Einfluss auf Traffic und Umsatz: Im Jahr 2020 untersuchte SEMrush den Zusammenhang zwischen Backlinks und dem Traffic von Websites. Die Ergebnisse zeigten, dass Websites in den Top 3 der Suchergebnisse im Durchschnitt über 3,5-mal mehr Backlinks hatten....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/03/22/wie-einflussreich-sind-backlinks-fuer-eine-webseite/">Wie einflussreich sind Backlinks für eine Webseite?</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img width="1134" height="486" decoding="async" src="https://homepage-nach-preis.de/wp-content/uploads/2024/03/ranking-ref832.jpg" /></p>
<p style="text-align: right;"><em>Kunden Original Screenshot, nach Nutzung unseres Backlink-Services, aus der Google Search Console</em></p>
<p>&nbsp;</p>
<p>Die Bedeutung von Backlinks für die Suchmaschinenoptimierung (SEO) kann kaum überschätzt werden. Untersuchungen und Studien haben gezeigt, dass Backlinks einen wesentlichen Einfluss auf das Ranking einer Website in den Suchergebnissen haben und darüber hinaus auch Traffic, Umsatz und Konversionsraten beeinflussen können. Eine detaillierte Analyse verschiedener Daten und Studien verdeutlicht diesen Zusammenhang eindrucksvoll.</p>
<p><strong>Korrelation mit Rankings:</strong> Moz führte im Jahr 2019 eine umfangreiche Studie durch, bei der über 12.000 Keywords und mehr als 100.000 Websites analysiert wurden. Die Ergebnisse dieser Studie zeigten eine starke Korrelation zwischen der Anzahl der Backlinks und der Position einer Website in den Suchergebnissen. Websites, die in den Top 10 der Google-Suchergebnisse rankten, wiesen im Durchschnitt über 168% mehr Backlinks auf als solche außerhalb dieser Top-Positionen. Eine ähnliche Untersuchung von Ahrefs bestätigte diese Ergebnisse und ergänzte, dass Seiten in den Top 10 im Durchschnitt über 3,5-mal mehr Backlinks hatten als Seiten auf den Plätzen 4 bis 10.</p>
<p><strong>Einfluss auf Traffic und Umsatz:</strong> Im Jahr 2020 untersuchte SEMrush den Zusammenhang zwischen Backlinks und dem Traffic von Websites. Die Ergebnisse zeigten, dass Websites in den Top 3 der Suchergebnisse im Durchschnitt über 3,5-mal mehr Backlinks hatten als Websites auf den Plätzen 4 bis 10. Eine detaillierte Analyse von Backlinko im Jahr 2021 ergab zudem einen starken Zusammenhang zwischen Backlinks und dem Umsatz von Websites. Demnach erzielten Websites mit einer höheren Anzahl von hochwertigen Backlinks im Durchschnitt einen um bis zu 45% höheren Umsatz als solche mit weniger Backlinks.</p>
<p><strong>Lokale SEO und Konversionsraten:</strong> Im Jahr 2019 widmete sich BrightLocal der Untersuchung des Einflusses von Backlinks auf lokale Suchergebnisse. Die Studie ergab, dass lokale Unternehmen mit einer größeren Anzahl qualitativ hochwertiger Backlinks tendenziell besser in den lokalen Suchergebnissen abschnitten. Zusätzlich fand eine Analyse von Search Engine Journal im Jahr 2022 heraus, dass Websites mit einer höheren Anzahl von Backlinks auch tendenziell höhere Konversionsraten aufwiesen.</p>
<p>Diese umfassende Zusammenstellung von Daten und Studien verdeutlicht die entscheidende Rolle, die Backlinks für die SEO-Performance von Websites spielen. Sie sind nicht nur ein wichtiger Ranking-Faktor, sondern haben auch einen signifikanten Einfluss auf Traffic, Umsatz und Konversionsraten.</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/03/22/wie-einflussreich-sind-backlinks-fuer-eine-webseite/">Wie einflussreich sind Backlinks für eine Webseite?</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/03/22/wie-einflussreich-sind-backlinks-fuer-eine-webseite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Neues HNP Lieferdatum &#038; Lieferzeit WooCommerce Plugin</title>
		<link>https://homepage-nach-preis.de/2024/01/16/neues-hnp-lieferdatum-lieferzeit-woocommerce-plugin/</link>
					<comments>https://homepage-nach-preis.de/2024/01/16/neues-hnp-lieferdatum-lieferzeit-woocommerce-plugin/#respond</comments>
		
		<dc:creator><![CDATA[Homepage-nach-Preis]]></dc:creator>
		<pubDate>Tue, 16 Jan 2024 14:27:04 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Homepage]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Wordpress Code]]></category>
		<category><![CDATA[Lieferdatum]]></category>
		<category><![CDATA[Lieferuhrzeit]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[Woocommerce]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">https://homepage-nach-preis.de/?p=8089</guid>

					<description><![CDATA[<p>In der dynamischen Welt des E-Commerce ist es von entscheidender Bedeutung, den Kunden eine nahtlose und personalisierte Erfahrung zu bieten. Das HNP Lieferdatum &#38; Lieferzeit WordPress &#38; WooCommerce Plugin eröffnet neue Möglichkeiten für Online-Shops, insbesondere für Restaurants, Bäckereien, Speditionen und Dienstleistungsanbieter. Diese Erweiterung ermöglicht es Kunden, das Lieferdatum und die Lieferzeit flexibel zu wählen, um den individuellen Anforderungen gerecht zu werden. Überblick der Funktionen: Datums- und Zeitauswahl: Integriert mühelos neue Felder für Lieferdatum und Lieferzeit auf der WooCommerce-Kassenseite. Unabhängige und synchronisierte Nutzung von Datum- und Zeitauswahl-Plugins. Datenverwaltung: Gespeicherte Informationen werden an die Admin- und Kunden-E-Mails der Kaufbestätigung weitergeleitet. Anzeige der Daten in der Admin-Bestellübersicht für eine einfache Verwaltung. Validierung und Filteroptionen: Gültigkeitsprüfung der eingegebenen Daten für eine zuverlässige Erfassung. Datumsauswahl kann nach Wochentagen und individuellen Terminen gefiltert werden. Maximale Uhrzeit und Verzögerungsoptionen: Einführung einer &#8220;maximalen Uhrzeit&#8221; Funktion für Lieferungen am Bestelltag. Möglichkeit der Lieferverzögerung in Tagen oder Minuten für individuelle Anforderungen. Benutzerfreundliche Auswahlmöglichkeiten: Datumsauswahl durch HTML-Kalender und Uhrzeitauswahl durch Dropdown-Menüs. Anpassbare Auswahl für einen effizienten Bestellprozess. Vielseitige Anwendungsmöglichkeiten: Optimal für Restaurants, Bäckereien, Speditionen und andere liefernde Shops. Ebenso geeignet für Dienstleistungsunternehmen, die Terminvereinbarungen anbieten. Individuelle Konfiguration: Freie Wahl zwischen Datum- und/oder Zeitauswahl je nach den Bedürfnissen des Geschäfts. Flexible Anpassung....</p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/01/16/neues-hnp-lieferdatum-lieferzeit-woocommerce-plugin/">Neues HNP Lieferdatum &#038; Lieferzeit WooCommerce Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In der dynamischen Welt des E-Commerce ist es von entscheidender Bedeutung, den Kunden eine nahtlose und personalisierte Erfahrung zu bieten. Das HNP Lieferdatum &amp; Lieferzeit WordPress &amp; WooCommerce Plugin eröffnet neue Möglichkeiten für Online-Shops, insbesondere für Restaurants, Bäckereien, Speditionen und Dienstleistungsanbieter. Diese Erweiterung ermöglicht es Kunden, das Lieferdatum und die Lieferzeit flexibel zu wählen, um den individuellen Anforderungen gerecht zu werden.</p>
<hr />
<p><strong>Überblick der Funktionen:</strong></p>
<ol>
<li><strong>Datums- und Zeitauswahl:</strong>
<ul>
<li>Integriert mühelos neue Felder für Lieferdatum und Lieferzeit auf der WooCommerce-Kassenseite.</li>
<li>Unabhängige und synchronisierte Nutzung von Datum- und Zeitauswahl-Plugins.</li>
</ul>
</li>
<li><strong>Datenverwaltung:</strong>
<ul>
<li>Gespeicherte Informationen werden an die Admin- und Kunden-E-Mails der Kaufbestätigung weitergeleitet.</li>
<li>Anzeige der Daten in der Admin-Bestellübersicht für eine einfache Verwaltung.</li>
</ul>
</li>
<li><strong>Validierung und Filteroptionen:</strong>
<ul>
<li>Gültigkeitsprüfung der eingegebenen Daten für eine zuverlässige Erfassung.</li>
<li>Datumsauswahl kann nach Wochentagen und individuellen Terminen gefiltert werden.</li>
</ul>
</li>
<li><strong>Maximale Uhrzeit und Verzögerungsoptionen:</strong>
<ul>
<li>Einführung einer &#8220;maximalen Uhrzeit&#8221; Funktion für Lieferungen am Bestelltag.</li>
<li>Möglichkeit der Lieferverzögerung in Tagen oder Minuten für individuelle Anforderungen.</li>
</ul>
</li>
<li><strong>Benutzerfreundliche Auswahlmöglichkeiten:</strong>
<ul>
<li>Datumsauswahl durch HTML-Kalender und Uhrzeitauswahl durch Dropdown-Menüs.</li>
<li>Anpassbare Auswahl für einen effizienten Bestellprozess.</li>
</ul>
</li>
<li><strong>Vielseitige Anwendungsmöglichkeiten:</strong>
<ul>
<li>Optimal für Restaurants, Bäckereien, Speditionen und andere liefernde Shops.</li>
<li>Ebenso geeignet für Dienstleistungsunternehmen, die Terminvereinbarungen anbieten.</li>
</ul>
</li>
<li><strong>Individuelle Konfiguration:</strong>
<ul>
<li>Freie Wahl zwischen Datum- und/oder Zeitauswahl je nach den Bedürfnissen des Geschäfts.</li>
<li>Flexible Anpassung an die spezifischen Anforderungen des Online-Shops.</li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<p><strong>Mehr Informationen und Kaufmöglichkeit:</strong></p>
<p><strong><a href="https://shop.homepage-nach-preis.de/produkt/hnp-lieferdatum-lieferzeit-woocommerce-plugin/" target="_blank" rel="noopener nofollow">https://shop.homepage-nach-preis.de/produkt/hnp-lieferdatum-lieferzeit-woocommerce-plugin/</a></strong></p>
<p>Der Beitrag <a rel="nofollow" href="https://homepage-nach-preis.de/2024/01/16/neues-hnp-lieferdatum-lieferzeit-woocommerce-plugin/">Neues HNP Lieferdatum &#038; Lieferzeit WooCommerce Plugin</a> erschien zuerst auf <a rel="nofollow" href="https://homepage-nach-preis.de">Homepage nach Preis - Webseite erstellen lassen</a>. Geschrieben von <a rel="nofollow" href="https://homepage-nach-preis.de/author/homepageadmin/">Homepage-nach-Preis</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://homepage-nach-preis.de/2024/01/16/neues-hnp-lieferdatum-lieferzeit-woocommerce-plugin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
