Kategorien
Wordpress

Wie man eine WordPress-Website erfolgreich hostet: Von der Domain bis zum E-Commerce




Das Hosting einer WordPress-Website ist eine grundlegende Aufgabe für jeden, der eine starke Online-Präsenz aufbauen möchte. Vom Kauf einer geeigneten Domain bis zur Implementierung von E-Commerce-Funktionen, wie WooCommerce, ist der Weg vielseitig. Eine gut gehostete Website bietet nicht nur Geschwindigkeit und Zuverlässigkeit, sondern auch eine skalierbare Plattform für zukünftiges Wachstum. Daher ist es wichtig, die richtigen Entscheidungen von Anfang an zu treffen. Hinzu kommt, dass ein attraktives Website-Design und funktionale Benutzeroberfläche essenziell sind, um die Nutzererfahrung zu verbessern und Besucher langfristig zu binden. Es ist auch sinnvoll, auf gute SEO-Praktiken zu achten, die die Sichtbarkeit in Suchmaschinen erhöhen und somit mehr Traffic generieren können.

Kategorien
Entwickler Webdesign

oxid update 6.1.5 auf 6.2

composer.json, die sich im Hauptverzeichnis des Shops befindet, müssen Version geändert werden. Das betrifft die Sektion „require“ und „require-dev“. Beispiel für einen OXID eShop Community Edition 6.2.0:

"require": {
   "oxid-esales/oxideshop-metapackage-ce": "v6.2.0"
},
"require-dev": {
   "oxid-esales/testing-library": "^v7.0.1",
   "incenteev/composer-parameter-handler": "^v2.0.0",
   "oxid-esales/oxideshop-ide-helper": "^v3.1.2",
   "oxid-esales/azure-theme": "^v1.4.2"
},

Hier der link zur composer.json des oxid-shop6.2.0 ce https://github.com/OXID-eSales/oxideshop_project/blob/b-6.2-ce/composer.json Meist stehen in der composer.json noch mehr in require, and require-dev: Um die aktuellen Versionen der Packages zu finden lohnt sich eine suche in der: https://packagist.org/ (4) Alte Module migrieren Für alle Module, die noch nicht auf dem „neuen Weg“  via composer installiert werden, muss man eine Initialisierung „per Hand“ vornehmen. Dazu gibt es aber eine Update Component, die den Großteil erledigt. Dies ist wie folgt zu installieren:

  1. composer require –no-update oxid-esales/oxideshop-update-component
  2. composer update
  3. vendor/bin/oe-console oe:oxideshop-update-component:install-all-modules

Am Ende aufräumen mit…

composer remove --no-update oxid-esales/oxideshop-update-component
composer update --no-dev --no-interaction

Siehe: https://docs.oxid-esales.com/eshop/de/6.2/installation/update/von-6.1.x-auf-6.2.0-aktualisieren.html#schritt-aktualisierung-der-modulkonfigurationen

Diskussion zum Thema findet sich hier:
https://forum.oxid-esales.com/t/nach-update-6-1-5-6-2-1-module-nicht-sichtbar/96577
https://forum.oxid-esales.com/t/modulerstellung-oxid-6-2/96641
Unter Umständen müssen alte Module noch überarbeitet werden. Bekannte Fehler sind hier:
1. Settings stehen noch in der metadata.php, diese müssen entfernt werden

could not be installed due to Invalid boolean value- "" was used for module setting.

2. Veralteter Code für Aufrufe aus der DB:

  • alt: $executeOnSlave neu: DatabaseInterface::forceMasterConnection()
  • alt: DatabaseInterface::FETCH_MODE_DEFAULT neu: FETCH_MODE_BOTH
  • alt: oxDB::getDB – Codebeispiel:
$rs = oxDb::getDb()->select($sQuery);
if ($rs != false && $rs->recordCount() > 0) {
    while (!$rs->EOF) {
        //do something
        $rs->moveNext();
    }
}
  •  neu: \OxidEsales\Eshop\Core\DatabaseProvider::getDb – Codebeispiel:
$resultSet = \OxidEsales\Eshop\Core\DatabaseProvider::getDb()->select($query);
 //Fetch the results row by row
 if ($resultSet != false && $resultSet->count() > 0) {
     while (!$resultSet->EOF) {
         $row = $resultSet->getFields();
         //do something
         $resultSet->fetchRow();
     }
 }
  • komplett weggefallen in Oxid v6:
    • ResultSetInterface::move()
    • ResultSetInterface::moveNext()
    • ResultSetInterface::moveFirst()
    • ResultSetInterface::moveLast()
    • ResultSetInterface::_seek()
    • ResultSetInterface::EOF()
Siehe: https://docs.oxid-esales.com/developer/en/6.0/update/eshop_from_53_to_6/database.html

Noch ein link zum OxidUpdate61->62
https://nerdpress.org/2020/04/20/updating-oxid-eshop-to-6-2-0/?highlight=oxid%20update

Kategorien
Entwickler Wordpress

Woocommere Delete All Products with Sql-Statement

DELETE relations.*, taxes.*, terms.*
FROM wp_term_relationships AS relations
INNER JOIN wp_term_taxonomy AS taxes
ON relations.term_taxonomy_id=taxes.term_taxonomy_id
INNER JOIN wp_terms AS terms
ON taxes.term_id=terms.term_id
WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type='product');
  
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'product');
DELETE FROM wp_posts WHERE post_type = 'product';
Kategorien
Entwickler Wordpress

WordPress wechsel des Sendernamen und Email Adresse global

/* change default from eamil worpdress */
function change_my_from_address( $original_email_address ) {
    return 'jobs@droidcon.com';
}
add_filter( 'wp_mail_from', 'change_my_from_address' );

// Function to change sender name
function change_my_sender_name( $original_email_from ) {
    return 'droidcon';
}
add_filter( 'wp_mail_from_name', 'change_my_sender_name' );

Kategorien
Entwickler Wordpress

WordPress Woocommerce

Wenn ein User sich einloggt in WordPress oder Woocomerce dann sollte es dem User auch angezeigt werden. Die kann man mit einem Filter erreichen

add_filter( 'wp_nav_menu_items', 'ag_dynamic_menu_item_label', 9999, 2 );

function ag_dynamic_menu_item_label( $items, $args ) {
    if ( ! is_user_logged_in() ) {
        $items = str_replace( "Mein Konto", "Login", $items );
    }
    if( is_user_logged_in() ){

        $items =str_replace( "Mein Konto", "Hallo " . wp_get_current_user()->user_firstname, $items);
    }
    return $items;
}

Der Wert „Mein Konto“ entspricht dem Value Wert im Menu Ursprünglicher Name. Siehe bild unten:

Kategorien
Entwickler

ajax form data übergeben und ändern

Öfters muss man mal übergebene Daten aus einem Form bearbeiten, konvertieren

var formData = jQuery('#yourID').serializeArray();
formadata.find(function(input){
	return input.name == 'yourFormName';
}).value = yourValueOrVariable;


jQuery.ajax({
	type: 'POST',
    url: 'your/url',
    dataType: 'json',
    data: formData,
    success: function(data){
	   //code here
    }
})
Kategorien
Entwickler Wordpress

wordpress suche ajax complete

https://awhitepixel.com/blog/making-autocomplete-search-in-wordpress-with-code/
Kategorien
Uncategorized

oxid log funtion

logging

Kategorien
Entwickler git

Git unterschiedliche History mergen

In Git kann es zu problemen kommen, wenn einer ein Git-repro erstellt und der zweite im Team sich das Repro per pull übernehmen will. Versucht man einfach ein git pull origin main zu starten wird git darauf hinweisen, das es nicht möglich ist, unterschiedliche historys zu mergen.

Der Fehler wird benahmt mit
fatal: refusing to merge unrelated histories, dies tritt auf wenn zwei nicht verwandte Projekte zu einem einzigen Zweig zusammengeführt werden. Dieser Fehler tritt auf, weil jedes Projekt seine eigene History von commits und tags hat. Diese beiden Geschichten werden nicht miteinander vereinbar sein.

Die Lösung für das Problem:

git pull origin main --allow-unrelated-histories 

Kategorien
Entwickler Wordpress

Produkt Rückstand verhindern(auch im Administratorbereich) auf WooCommerce

Bei Woocommerce ist es manchmal gewünscht, Ware im Lager zurückzuhalten. Hier mal ein Beispiel:
Die Artikel werden aus dem Lager abgezogen wenn die Bestellung während des Bestellvorgang erstellt wird, was ermöglicht, das der erste Kunde noch die Zahlung verarbeiten kann, wenn der zweite mit der Zahlungsabwicklung beginnt, ist der Bestand für den zweiten Kunden noch verfügbar.

Diese Einstellung kann man im woocommerce unter
WOOCOMMERCE->PRODUKTE->LAGERBESTAND einstellen

Lässt man das Feld mit der Ware reservieren leer, quasi hinterlegt keinen Zeitwert in welchem die Ware reserviert werden soll, dann können Kunden nur soviele Artikel kaufen wie im Stock hinterlegt.

Eine Möglichkeit den Bestand zu halten und diese Funktion trotzdem zu nutzen bietet offentsichtlich dieses Plugin:
https://wordpress.org/plugins/woocommerce-cart-stock-reducer/

Das ist aber noch nicht getestet.

Um das ganze auf Code Ebene abzubilden hier der Zustand Backorder zu verbieten wenn der Bestand auf Null sinkt:

Backend:

add_action( 'admin_footer', 'disable_backorder_option_from_product_settings' );
function disable_backorder_option_from_product_settings() {
    global $pagenow, $post_type;

    if( in_array( $pagenow,  array('post-new.php', 'post.php') ) && $post_type === 'product' ) :
    ?>
    <script>
    jQuery(function($){
        // For product variations
        $('#variable_product_options').on('change', function(){
            $('select[name^=variable_backorders]').each( function(){
                $(this).prop('disabled','disabled').val('no');
            });
        });
        // For all other product types
        $('select#_backorders').prop('disabled','disabled').val('no');
    });
    </script>
    <?php
    endif;
}

Der Code für das Frontend:

add_filter( 'woocommerce_product_backorders_allowed', '__return_false', 1000 );
add_filter( 'woocommerce_product_backorders_require_notification', '__return_false', 1000 );

add_filter( 'woocommerce_product_get_backorders', 'get_backorders_return_no' );
add_filter( 'woocommerce_product_variation_get_backorders', 'get_backorders_return_no' );
function get_backorders_return_no( $backorders ){
    return 'no';
}

add_filter( 'woocommerce_product_get_stock_status', 'filter_product_stock_status', 10, 2 );
add_filter( 'woocommerce_product_variation_get_stock_status', 'filter_product_stock_status', 10, 2 );
function filter_product_stock_status( $stock_status, $product ){
    return $product->get_stock_quantity() <= 0  ? 'outofstock' : $stock_status;
}