# WPML-kompatibilis téma vagy bővítmény készítése

> Lépésről lépésre: konfigurációs fájl, sztringek, widgetek, azonosítók, WooCommerce, és a leggyakoribb hibák megoldása.

Ez a fejezet téma- és bővítményfejlesztőknek szól. Végigvezet azon, mit kell megtenned, hogy a termékedet a WPML hibátlanul le tudja fordítani. Minden lépéshez tartozik egy rövid próba, amellyel ellenőrizheted az eredményt.

## 1. Nyelvi konfigurációs fájl

A nyelvi konfigurációs fájl (`wpml-config.xml`) megmondja a WPML-nek, mit kell fordítani a témádban vagy bővítményedben: egyedi tartalomtípusokat, taxonómiákat, mezőket, admin szövegeket, widgeteket. A fájl felépítését a [Nyelvi konfigurációs fájl](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/fejleszto-wpml-config/) fejezet írja le.

Próba:

1. Hozz létre néhány bejegyzést és taxonómiát.
2. Küldd el őket fordításra.
3. Ellenőrizd, hogy a frontenden lefordítva jelennek meg.

## 2. Sztringek előkészítése

A sztring minden olyan szöveg az oldalon, amely nem bejegyzés, oldal vagy taxonómia része. Hogy a WPML le tudja fordítani, esetenként így készítsd elő:

- **Kódba írt szövegek:** gettext függvénybe kell csomagolni őket, lásd a [Gettext használata](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/fejleszto-gettext/) fejezetet.
- **A `wp_options` táblában tárolt szövegek:** regisztráld őket a `wpml-config.xml` fájlban. Ha a kulcsok nem fixek, például a téma olyan tömböt használ, amely a felhasználói bevitellel nő, dinamikusan, a WPML API függvényeivel regisztráld a bejegyzéseket.
- **Dinamikus szövegek:** felhasználói bevitel, egyedi adatbázistáblákban tárolt tartalom, vagy sztringcsomagokba rendezett szövegek. Ezekhez a WPML sztringregisztrációs és sztringcsomag-függvényeit használd.

A sztringek ellenőrzéséhez használhatod a Multilingual Tools bővítményt, amely megmutatja, mely sztringek fordíthatók, és melyek igényelnek további beállítást. Ezt a bővítményt csak tesztoldalon használd.

Próba:

1. A **WPML → Theme and plugins localization** oldalon olvasd be a témádat vagy bővítményedet.
2. Hozz létre egy oldalt a szövegekkel.
3. Nézd meg, megjelennek-e a sztringek a **WPML → String Translation** oldalon.
4. Fordíts le néhányat, és ellenőrizd a frontenden.

## 3. Egyedi widgetek és blokkok regisztrálása

Ha a termékedben oldalépítőhöz (például Elementorhoz) való egyedi widgetek vannak, regisztrálnod kell őket a fordításhoz. A módját az [Oldalépítő-widgetek regisztrálása](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/fejleszto-oldalepito-widgetek/) és a [Gutenberg-blokkok fordíthatóvá tétele](https://hub.hellowp.io/hu/plugins/sitepress-multilingual-cms/fejleszto-gutenberg-blokkok/) fejezet mutatja.

Próba:

1. Hozz létre egy oldalt az összes egyedi widgettel.
2. Küldd fordításra, és nézd meg, megjelennek-e a widgetek szövegei az Advanced Translation Editorban.
3. Ellenőrizd a fordításokat a frontenden.
4. Ismételd meg más widgetbeállításokkal.

## 4. Azonosítók lekérése a másik nyelven

Ha a funkciód nyelvenként más bejegyzés-azonosítót tölt be (például egy csúszka minden nyelven más diákkal), a `wpml_object_id` szűrővel kérd le a lefordított bejegyzés azonosítóját:

```php
// Loop posts
while (have_posts()): the_post();
$post = get_post( apply_filters( 'wpml_object_id', $post->ID, 'slide' ) );
```

Próba:

1. Hozd létre a bejegyzést vagy sablont egy szöveges sztringgel.
2. Állítsd be a funkciót úgy, hogy ezt használja.
3. Fordítsd le a bejegyzést, és adj a sztringnek más értéket.
4. Ellenőrizd, hogy a funkció a frontenden a lefordított azonosítót tölti be.

## 5. WooCommerce-kompatibilitás

A WooCommerce tartalmát a WPML Multilingual & Multicurrency for WooCommerce kiegészítő fordítja. Ha a témád vagy bővítményed WooCommerce-elemeket tartalmaz, igazítsd a WooCommerce-es kompatibilitási útmutatóhoz is.

## 6. Az admin nyelvváltó elrejtése

A WPML alapból nyelvváltót tesz a WordPress admin sávjába, és ez a bejelentkezett felhasználóknak a frontenden és a háttérben is látszik. Érzékeny oldalakon, például a saját beállítóoldaladon érdemes elrejteni. Tedd a `functions.php` fájlba (a függvény nevét cseréld a sajátodra):

```php
add_filter( 'wpml_show_admin_language_switcher', 'compsupp_disable_wpml_admin_lang_switcher' );

function compsupp_disable_wpml_admin_lang_switcher( $state ) {
    global $pagenow;

    // Add the admin pages that we need to hide the language switcher
    $admin_pages_to_hide_ls = array(
        'admin-page-slug', 'another-admin-page-slug', 'one-more-admin-page-slug'
    );

    // We can also have a filter here in case we need to add/remove pages later
    $admin_pages_to_hide_ls = apply_filters( 'compsupp_filter_disable_wpml_lang_switcher_in_admin', $admin_pages_to_hide_ls);

    if (
        $pagenow == 'admin.php'
        && isset( $_GET['page'] )
        && in_array( $_GET['page'], $admin_pages_to_hide_ls)
    ) {
        $state = false;
    }
    return $state;
}
```

## Különleges funkciók

Ha a termékedben különleges funkciók vannak, például egyedi adatbázistáblák, azokat saját kóddal kell a WPML-hez igazítani.

## Gyakori problémák és megoldásuk

**Az űrlapcímkék nem fordíthatók, mert az adatbázisból jönnek.** Kérd le a fordítást a `wpml_translate_single_string` szűrővel:

```php
$label = esc_html( apply_filters('wpml_translate_single_string', $this->checkout_item->name, 'wpsc', '$this->checkout_item->name .'_checkout_form_label'' ) );
```

**A `wp_query($args)` vagy `get_posts($args)` nem a jelenlegi nyelv bejegyzéseit adja vissza.** Add hozzá az argumentumokhoz a `suppress_filters=0` értéket.

**Egy csúszkában minden dia egy nyelven jelenik meg.** Távolítsd el a más nyelvű diákat:

```php
// Unset not translated slides
foreach( $slides as $k => $slide ) {
	$check = apply_filters( 'wpml_post_language_details', NULL, $slide->ID )
	$slide_language_code = substr( $check['locale'], 0, 2 );

	if( $check['different_language'] ) {
		unset( $slides[$k] );
	}
}
```

**A dia azonosítója a második nyelven más.** Használd a `wpml_object_id` szűrőt:

```php
// Loop posts
while (have_posts()): the_post();
$post = get_post( apply_filters( 'wpml_object_id', $post->ID, 'slide' ) );
```

**A csúszka saját admin oldalt használ, és az egyedi mezők értékeit be kell regisztrálni a fordításhoz.** Regisztráld az értéket sztringként:

```php
// Adding a new slide code
$slide_id = $this->slide->ID;
$url = $fields['url'];

// Register slide URL to translations
do_action( 'wpml_register_single_string', 'Slider', 'Slide_ID_' . $this->slide->ID, $url);

$this->add_or_update_or_delete_meta($this->slide->ID, 'url', $url);
```

**Az egyedi taxonómia azonosítója a második nyelven más.**

```php
$taxonomy_id = apply_filters( 'wpml_object_id', $taxonomy_id, 'my_custom_taxonomy' );
```

**Az egyedi (nem szabványos WordPress) AJAX-kérések mindig az alapértelmezett nyelv tartalmát adják.** Az AJAX-cím összeállításakor add át az aktuális nyelvet paraméterként a `wpml_current_language` szűrővel:

```php
$ajax_url = 'http://my-site.com/wp-content/plugins/my-plugin/handle-ajax.php';
$my_current_lang = apply_filters( 'wpml_current_language', NULL );
if ( $my_current_lang ) {
	$ajax_url = add_query_arg( 'wpml_lang', $my_current_lang, $ajax_url );
	// $ajax_url will be something like 'http://my-site.com/wp-content/plugins/my-plugin/handle-ajax.php?wpml_lang=es'
}
```

A `handle-ajax.php` fájlban, a tartalom előállítása előtt válts nyelvet a `wpml_switch_language` művelettel, és a végén zárd le a nyelvi hatókört. A WPML 5.0 óta a nyelvváltások egymásba ágyazódnak, ezért minden váltáshoz saját visszaállítás kell:

```php
if ( ! empty( $_GET[ 'wpml_lang' ] ) ) {
    // Opens a language scope. Only a non-empty language code switches the language.
    do_action( 'wpml_switch_language', sanitize_text_field( $_GET[ 'wpml_lang' ] ) );

    try {
        // Run other content queries.
    } finally {
        // Closes the scope that the call above opened.
        do_action( 'wpml_switch_language', null );
    }
}
```

**Hibás `id` érték a `WP_Query` `tax_query` `field` paraméterében.** Az `id` érték az alapértelmezett nyelven működik, a másodlagoson nem. Hibás lekérdezés:

```php
$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        array(
            'taxonomy' => 'people',
            'field'    => 'id',
            'terms'    => 'bob',
        ),
    ),
);
$query = new WP_Query( $args );
```

A `field` értékét javítsd `term_id`-re. A `field` paraméternek nincs `id` értéke, az alapértelmezett a `term_id`.
