[image_texte image_url="/ameublement/wp-content/uploads/2025/08/hero-section-img.webp" alt_image="Ameublement et tapissier à Marrakech salon marocain moderne sur mesure" titre="Ameublement à Marrakech – Salon, Décoration & Mobilier sur mesure" paragraphe="Ameublement Marrakech, Akram Ameublement est spécialisé dans la création de salons marocains et modernes sur mesure. Notre atelier de tapissier à Marrakech réalise également la réfection et la conception de vos assises avec un savoir-faire artisanal. Découvrez notre collection et bénéficiez d’un accompagnement personnalisé pour votre décoration intérieure." bouton="Demander un devis" lien_bouton="/nous-contactez"]

Ameublement à Marrakech : salons marocains et décoration sur mesure

Découvrez notre collection de salons marocains et modernes à Marrakech, conçus sur mesure par notre atelier d’ameublement et de tapissier. Chaque réalisation allie tradition artisanale, confort et design contemporain avec des matériaux de qualité.

<?php

function wpcode_elementor_form_shortcode($atts) {

ob_start();

$message = '';

if (
isset($_POST['form_submit']) &&
isset($_POST['akram_nonce']) &&
wp_verify_nonce($_POST['akram_nonce'], 'akram_form')
) {

$name = sanitize_text_field($_POST['visitor_name'] ?? '');
$phone = sanitize_text_field($_POST['visitor_phone'] ?? '');
$email = sanitize_email($_POST['visitor_email'] ?? '');
$msg = sanitize_textarea_field($_POST['visitor_message'] ?? '');

if (!$name || !$phone || !$email || !$msg) {
$message = "<p style='color:red;'>Veuillez remplir tous les champs.</p>";
} else {

$body = "
<p><strong>Nom:</strong> $name</p>
<p><strong>Téléphone:</strong> $phone</p>
<p><strong>Email:</strong> $email</p>
<p><strong>Message:</strong><br>$msg</p>
";

$sent = wp_mail(
"akramameublement@gmail.com",
"Nouveau message site",
$body,
[
'Content-Type: text/html; charset=UTF-8',
'Reply-To: ' . $email
]
);

if ($sent) {
$message = "<p style='color:green;'>Message envoyé ✔</p>";
} else {
$message = "<p style='color:red;'>Erreur lors de l'envoi.</p>";
}
}
}
?>

<div class="form-wrapper">

<?php echo $message; ?>

<form method="post">

<?php wp_nonce_field('akram_form', 'akram_nonce'); ?>

<input type="text" name="visitor_name" placeholder="Nom" required>
<input type="text" name="visitor_phone" placeholder="Téléphone" required>
<input type="email" name="visitor_email" placeholder="Email" required>

<textarea name="visitor_message" placeholder="Message" required></textarea>

<button type="submit" name="form_submit">Envoyer</button>

</form>

</div>

<style>
.form-wrapper {
max-width: 500px;
margin: auto;
}

form input,
form textarea {
width: 100%;
margin-bottom: 10px;
padding: 10px;
}

form button {
background: #8B0000;
color: #fff;
padding: 12px;
border: none;
cursor: pointer;
}
</style>

<?php

return ob_get_clean();
}

add_shortcode('formulaire_contact_akram', 'wpcode_elementor_form_shortcode');

 

function image_texte_shortcode($atts) {

$atts = shortcode_atts([
'image_url' => '',
'alt_image' => '',
'titre' => '',
'paragraphe' => '',
'bouton' => '',
'lien_bouton' => ''
], $atts, 'image_texte');

if (empty($atts['image_url'])) {
return '';
}

$image_url = esc_url($atts['image_url']);

ob_start();
?>

<section class="image-texte">

<img
class="image-hero"
src="<?php echo $image_url; ?>"
alt="<?php echo esc_attr($atts['alt_image']); ?>"
width="724"
height="535"
fetchpriority="high"
loading="eager"
decoding="async"
sizes="100vw">

<div class="overlay"></div>

<div class="content">

<?php if (!empty($atts['titre'])) : ?>
<h1><?php echo esc_html($atts['titre']); ?></h1>
<?php endif; ?>

<?php if (!empty($atts['paragraphe'])) : ?>
<p><?php echo esc_html($atts['paragraphe']); ?></p>
<?php endif; ?>

<?php if (!empty($atts['bouton']) && !empty($atts['lien_bouton'])) : ?>
<a class="hero-btn" href="<?php echo esc_url($atts['lien_bouton']); ?>">
<?php echo esc_html($atts['bouton']); ?>
</a>
<?php endif; ?>

</div>

</section>

<style>
.image-texte{
position:relative;
min-height:450px;
display:flex;
align-items:flex-end;
justify-content:flex-end;
overflow:hidden;
border-radius:12px;
background:#000;
}

.image-hero{
position:absolute;
inset:0;
width:100%;
height:100%;
object-fit:cover;
}

.overlay{
position:absolute;
inset:0;
background:rgba(0,0,0,.35);
}

.content{
position:relative;
z-index:2;
max-width:500px;
padding:30px;
text-align:right;
color:#fff;
}

.content h1{
margin:0 0 10px;
font-size:clamp(28px,4vw,48px);
line-height:1.2;
color:#fff;
}

.content p{
margin:0;
font-size:16px;
line-height:1.6;
color:#eee;
}

.hero-btn{
display:inline-block;
margin-top:15px;
padding:12px 20px;
background:#8B0000;
color:#fff;
text-decoration:none;
border-radius:6px;
transition:opacity .3s;
}

.hero-btn:hover{
opacity:.9;
}

@media (max-width:768px){

.image-texte{
min-height:380px;
justify-content:center;
}

.content{
text-align:center;
padding:20px;
}

.content h1{
font-size:30px;
}

.content p{
font-size:15px;
}
}
</style>

<?php

return ob_get_clean();
}

add_shortcode('image_texte', 'image_texte_shortcode');

add_shortcode('menu_dynamique', function ($atts) {

$atts = shortcode_atts([
'items' => ''
], $atts);

if (empty($atts['items'])) {
return '';
}

$items = explode(',', $atts['items']);

ob_start();
?>

<style>
.menu-dynamique {
display: flex;
gap: 15px;
flex-wrap: wrap;
justify-content: center;
}

.menu-dynamique a {
padding: 10px 18px;
background: #8B0000;
color: #fff;
text-decoration: none;
border-radius: 6px;
font-size: 14px;
transition: 0.3s;
}

.menu-dynamique a:hover {
background: #a00000;
}
</style>

<div class="menu-dynamique">

<?php foreach ($items as $item):

$item = trim($item);

// transformation slug URL-friendly
$slug = sanitize_title($item);

// lien vers page (à adapter si tu veux structure différente)
$url = home_url('/' . $slug);
?>

<a href="<?php echo esc_url($url); ?>">
<?php echo esc_html($item); ?>
</a>

<?php endforeach; ?>

</div>

<?php
return ob_get_clean();
});
add_shortcode('afficher_produits', function ($atts) {

$atts = shortcode_atts([
'categorie' => 0,
'intro' => '',
'bas' => ''
], $atts);

$cat = intval($atts['categorie']);

$query = new WP_Query([
'post_type' => 'produit',
'posts_per_page' => -1,

'tri_produits' => true, // 🔥 ACTIVE LE TRI GLOBAL

'meta_query' => [
[
'key' => 'categorie',
'value' => $cat,
'compare' => '=',
'type' => 'NUMERIC'
]
]
]);

if (!$query->have_posts()) {
return "<p>Aucun produit trouvé.</p>";
}

// 🔥 ID UNIQUE pour éviter conflits JS
$uid = uniqid('prod_');

ob_start();
?>

<style>
.produits-wrap {
max-width: 1200px;
margin: auto;
}

.produits-intro {
margin-bottom: 20px;
font-size: 16px;
line-height: 1.6;
}

.liste-produits {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}

.produit {
border: 1px solid #ddd;
padding: 15px;
border-radius: 12px;
text-align: center;
background: #fff;
}

.produit img {
width: 100%;
aspect-ratio: 1 / 1;
object-fit: cover;
border-radius: 10px;
}

.hidden {
display: none;
}

.btns {
text-align: center;
margin-top: 25px;
}

.btn-more,
.btn-less {
padding: 12px 20px;
margin: 5px;
background: #8B0000;
color: #fff;
border: none;
border-radius: 8px;
cursor: pointer;
}

.produits-bas {
margin-top: 25px;
font-size: 15px;
line-height: 1.6;
color: #555;
}

@media (max-width: 768px) {
.liste-produits {
grid-template-columns: repeat(2, 1fr);
}
}
</style>

<div class="produits-wrap" id="<?php echo $uid; ?>">

<?php if (!empty($atts['intro'])): ?>
<div class="produits-intro">
<?php echo esc_html($atts['intro']); ?>
</div>
<?php endif; ?>

<div class="liste-produits">

<?php
$i = 0;

while ($query->have_posts()) : $query->the_post();

$img = get_the_post_thumbnail_url(get_the_ID(), 'medium');
if (!$img) {
$img = get_stylesheet_directory_uri() . '/images/placeholder.png';
}

$hidden = ($i >= 8) ? 'hidden' : '';
?>

<div class="produit <?php echo esc_attr($hidden); ?>">
<a href="<?php echo esc_url(get_permalink()); ?>">
<img src="<?php echo esc_url($img); ?>">
<h3><?php echo esc_html(get_the_title()); ?></h3>
</a>
</div>

<?php $i++; endwhile; wp_reset_postdata(); ?>

</div>

<div class="btns">
<button type="button" class="btn-more">Afficher plus</button>
<button type="button" class="btn-less" style="display:none;">Afficher moins</button>
</div>

<?php if (!empty($atts['bas'])): ?>
<div class="produits-bas">
<?php echo esc_html($atts['bas']); ?>
</div>
<?php endif; ?>

</div>

<script>
document.addEventListener("DOMContentLoaded", function () {

const container = document.getElementById("<?php echo $uid; ?>");
if (!container) return;

const items = container.querySelectorAll(".produit");
const btnMore = container.querySelector(".btn-more");
const btnLess = container.querySelector(".btn-less");

let visible = 8;

function update() {
items.forEach((el, i) => {
el.classList.toggle("hidden", i >= visible);
});

btnMore.style.display = (visible < items.length) ? "inline-block" : "none";
btnLess.style.display = (visible > 8) ? "inline-block" : "none";
}

btnMore.addEventListener("click", function () {
visible += 8;
update();
});

btnLess.addEventListener("click", function () {
visible = 8;
update();
container.scrollIntoView({ behavior: "smooth" });
});

update();
});
</script>

<?php
return ob_get_clean();
});
function restore_produits_cpt() {
register_post_type('produit', [
'label' => 'Produits',
'public' => true,
'has_archive' => true,
'rewrite' => [
'slug' => 'produit',
'with_front' => false
],
'supports' => ['title', 'editor', 'thumbnail']
]);
}
add_action('init', 'restore_produits_cpt');
function akram_auto_alt_images($content) {

if (is_admin() || empty($content)) return $content;

libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->encoding = 'utf-8';
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);

$images = $dom->getElementsByTagName('img');

$index = 1; // pour différencier les images

foreach ($images as $img) {

$alt = trim($img->getAttribute('alt'));
if (!empty($alt)) continue;

$src = $img->getAttribute('src');
$attachment_id = attachment_url_to_postid($src);

$final_alt = '';

// =========================
// 1. ALT depuis médiathèque
// =========================
if ($attachment_id) {
$media_alt = get_post_meta($attachment_id, '_wp_attachment_image_alt', true);

if (!empty($media_alt)) {
$final_alt = $media_alt;
}
}

// =========================
// 2. NOM IMAGE (PRIORITÉ SEO)
// =========================
if (empty($final_alt) && !empty($src)) {

$filename = basename(parse_url($src, PHP_URL_PATH));
$filename = preg_replace('/\.[^.]+$/', '', $filename);
$filename = str_replace(['-', '_'], ' ', $filename);

// nettoyer noms inutiles
if (!preg_match('/^(img|image|photo|dsc|pxl)/i', $filename)) {
$final_alt = ucwords($filename);
}
}

// =========================
// 3. TITRE PAGE (fallback)
// =========================
if (empty($final_alt)) {
$title = get_the_title();
if (!empty($title)) {
$final_alt = $title;
}
}

// =========================
// 4. FALLBACK FINAL
// =========================
if (empty($final_alt)) {
$final_alt = 'Image produit';
}

// =========================
// 5. AJOUT VARIATION (SEO++)
// =========================
$final_alt .= ' - image ' . $index;
$index++;

// Nettoyage final
$final_alt = trim(preg_replace('/\s+/', ' ', $final_alt));

$img->setAttribute('alt', esc_attr($final_alt));
}

return $dom->saveHTML();
}

// =========================
// Hooks (IMPORTANT)
// =========================
add_filter('the_content', 'akram_auto_alt_images', 20);
add_filter('elementor/frontend/the_content', 'akram_auto_alt_images');
add_filter('widget_text', 'akram_auto_alt_images');
add_action('wp_head', function () {

if (is_singular('produit')) {

echo '<style>
/* 🎯 CIBLAGE ULTRA LARGE POUR SUPPRIMER TOUS TITRES THÈME */
h1:not(.keep-title),
.entry-title,
.page-title,
.post-title,
.product_title,
.wp-block-post-title,
header h1,
.site-title {
display:none !important;
}
</style>';

}

}, 1);
add_action('wp_head', function () {

if (is_singular('produit')) {

$title = get_the_title();
$desc = get_field('description_details');

if (!$desc) {
$desc = get_the_excerpt();
}

$desc = wp_trim_words(wp_strip_all_tags($desc), 35);

echo "<title>{$title} | Akram Ameublement</title>\n";
echo "<meta name='description' content='{$desc}'>\n";
echo "<meta property='og:title' content='{$title}'>\n";
echo "<meta property='og:description' content='{$desc}'>\n";
}

}, 5);

/*
-------------------------------------------------------------
*/
add_action('init', function() {

if (is_admin()) return;

// Désactive seulement le script emoji (SAFE MODE)
remove_action('wp_head', 'print_emoji_detection_script', 7);

});

add_action('wp_enqueue_scripts', function() {

if (is_admin()) return;

// Désactive emojis (version complète propre)
wp_deregister_script('wp-emoji');
wp_deregister_script('wp-emoji-release');

}, 100);
add_action('wp_head', function() {

if (!is_front_page()) return;

echo '<link rel="preload" as="image" href="https://akramameublement.com/ameublement/wp-content/uploads/2025/08/hero-section-img.webp" fetchpriority="high">';

}, 1);
add_action('wp_enqueue_scripts', function() {

if (is_admin()) return;

// Elementor icons uniquement si Elementor n'est pas utilisé sur la page
if (!did_action('elementor/loaded')) {
wp_dequeue_style('elementor-icons');
}

}, 20);

add_shortcode('afficher_produits_par_page', function ($atts) {

$atts = shortcode_atts([
'categorie' => 0
], $atts);

$cat = intval($atts['categorie']);

$query = new WP_Query([
'post_type' => 'produit',
'posts_per_page' => -1,

'tri_produits' => true, // 🔥 ACTIVE TON TRI GLOBAL

'meta_query' => [
[
'key' => 'categorie',
'value' => $cat,
'compare' => '=',
'type' => 'NUMERIC'
]
]
]);

if (!$query->have_posts()) {
return "<p>Aucun produit trouvé.</p>";
}

// 🔥 ID UNIQUE pour éviter conflits JS
$uid = uniqid('prod_page_');

ob_start();
?>

<style>
.liste-produits {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}

.produit {
border: 1px solid #ddd;
padding: 15px;
border-radius: 12px;
text-align: center;
background: #fff;
transition: 0.3s;
}

.produit:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}

.produit img {
width: 100%;
aspect-ratio: 1 / 1;
object-fit: cover;
border-radius: 10px;
}

.produit h3 {
font-size: 16px;
margin-top: 10px;
}

.hidden {
display: none;
}

.btns {
text-align: center;
margin-top: 25px;
}

.btn-more,
.btn-less {
padding: 12px 20px;
margin: 5px;
background: #8B0000;
color: #fff;
border: none;
border-radius: 8px;
cursor: pointer;
}

@media (max-width: 768px) {
.liste-produits {
grid-template-columns: repeat(2, 1fr);
}
}
</style>

<div id="<?php echo $uid; ?>">

<div class="liste-produits">

<?php
$i = 0;

while ($query->have_posts()) : $query->the_post();

$img = get_the_post_thumbnail_url(get_the_ID(), 'medium');
if (!$img) {
$img = get_stylesheet_directory_uri() . '/images/placeholder.png';
}

$hidden = ($i >= 8) ? 'hidden' : '';
?>

<div class="produit <?php echo esc_attr($hidden); ?>">
<a href="<?php echo esc_url(get_permalink()); ?>">
<img src="<?php echo esc_url($img); ?>">
<h3><?php echo esc_html(get_the_title()); ?></h3>
</a>
</div>

<?php $i++; endwhile; wp_reset_postdata(); ?>

</div>

<div class="btns">
<button type="button" class="btn-more">Afficher plus</button>
<button type="button" class="btn-less" style="display:none;">Afficher moins</button>
</div>

</div>

<script>
document.addEventListener("DOMContentLoaded", function () {

const container = document.getElementById("<?php echo $uid; ?>");
if (!container) return;

const items = container.querySelectorAll(".produit");
const btnMore = container.querySelector(".btn-more");
const btnLess = container.querySelector(".btn-less");

let visible = 8;

function update() {
items.forEach((el, i) => {
el.classList.toggle("hidden", i >= visible);
});

btnMore.style.display = (visible < items.length) ? "inline-block" : "none";
btnLess.style.display = (visible > 8) ? "inline-block" : "none";
}

btnMore.addEventListener("click", function () {
visible += 8;
update();
});

btnLess.addEventListener("click", function () {
visible = 8;
update();
container.scrollIntoView({ behavior: "smooth" });
});

update();
});
</script>

<?php
return ob_get_clean();
});

add_shortcode('tous_produits_promo', function () {

$query = new WP_Query([
'post_type' => 'produit',
'posts_per_page' => 20,

'tri_produits' => true,
'champ_tri' => 'en_promotion',

'meta_query' => [
[
'key' => 'remise',
'value' => 0,
'compare' => '>',
'type' => 'NUMERIC'
]
]
]);

if (!$query->have_posts()) {
return "<p>Aucune promotion.</p>";
}

ob_start();
?>

<style>
.promo-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}

.promo-item {
border: 1px solid #ddd;
border-radius: 10px;
padding: 15px;
text-align: center;
background: #fff;
}

.promo-item img {
width: 100%;
aspect-ratio: 1 / 1;
object-fit: cover;
border-radius: 8px;
}

.hidden { display: none; }

.promo-buttons {
text-align: center;
margin-top: 25px;
}

.promo-buttons button {
padding: 12px 20px;
margin: 5px;
background: #8B0000;
color: #fff;
border: none;
border-radius: 6px;
cursor: pointer;
}

@media (max-width: 768px) {
.promo-grid {
grid-template-columns: repeat(2, 1fr);
}
}
</style>

<div class="promo-grid">
<?php
$i = 0;

while ($query->have_posts()) {
$query->the_post();

$img = get_the_post_thumbnail_url(get_the_ID(), 'medium');
if (!$img) {
$img = get_stylesheet_directory_uri() . '/images/placeholder.png';
}

$hidden = ($i >= 8) ? 'hidden' : '';
?>

<div class="promo-item <?php echo esc_attr($hidden); ?>">
<a href="<?php echo esc_url(get_permalink()); ?>">
<img src="<?php echo esc_url($img); ?>">
<h3><?php echo esc_html(get_the_title()); ?></h3>
</a>
</div>

<?php
$i++;
}

wp_reset_postdata();
?>
</div>

<div class="promo-buttons">
<button type="button" id="promo-more">Afficher plus</button>
<button type="button" id="promo-less" style="display:none;">Afficher moins</button>
</div>

<script>
document.addEventListener("DOMContentLoaded", function () {

const items = document.querySelectorAll(".promo-item");
const btnMore = document.getElementById("promo-more");
const btnLess = document.getElementById("promo-less");
const grid = document.querySelector(".promo-grid");

if (!items.length) return;

let visible = 8;

function update() {
items.forEach((el, i) => {
el.classList.toggle("hidden", i >= visible);
});

btnMore.style.display = (visible < items.length) ? "inline-block" : "none";
btnLess.style.display = (visible > 8) ? "inline-block" : "none";
}

btnMore.addEventListener("click", function () {
visible += 8;
update();
});

btnLess.addEventListener("click", function () {
visible = 8;
update();
grid.scrollIntoView({ behavior: "smooth" });
});

update();
});
</script>

<?php
return ob_get_clean();
});
add_shortcode('afficher_produits_choix', function ($atts) {

$atts = shortcode_atts([
'limit' => 20
], $atts);

$query = new WP_Query([
'post_type' => 'produit',
'posts_per_page' => intval($atts['limit']),

// active le tri personnalisé
'tri_produits' => true,
'champ_tri' => 'mise_en_avant'
]);

if (!$query->have_posts()) {
return "<p>Aucun produit trouvé.</p>";
}

ob_start();
?>

<style>
.produits-choix {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}

.produit {
border: 1px solid #ddd;
padding: 15px;
border-radius: 12px;
text-align: center;
background: #fff;
}

.produit img {
width: 100%;
aspect-ratio: 1 / 1;
object-fit: cover;
border-radius: 10px;
}

.hidden {
display: none;
}

.choix-buttons {
text-align: center;
margin-top: 25px;
}

.choix-buttons button {
padding: 12px 20px;
margin: 5px;
background: #8B0000;
color: #fff;
border: none;
border-radius: 6px;
cursor: pointer;
}

@media (max-width: 768px) {
.produits-choix {
grid-template-columns: repeat(2, 1fr);
}
}
</style>

<div class="produits-choix">

<?php
$i = 0;

while ($query->have_posts()) :
$query->the_post();

$img = get_the_post_thumbnail_url(get_the_ID(), 'medium');

if (!$img) {
$img = get_stylesheet_directory_uri() . '/images/placeholder.png';
}

$hidden = ($i >= 8) ? 'hidden' : '';
?>

<div class="produit <?php echo esc_attr($hidden); ?>">

<a href="<?php echo esc_url(get_permalink()); ?>">

<img src="<?php echo esc_url($img); ?>">

<h3>
<?php echo esc_html(get_the_title()); ?>
</h3>

</a>

</div>

<?php
$i++;
endwhile;

wp_reset_postdata();
?>

</div>

<div class="choix-buttons">

<button type="button" id="choix-more">
Afficher plus
</button>

<button type="button" id="choix-less" style="display:none;">
Afficher moins
</button>

</div>

<script>
document.addEventListener("DOMContentLoaded", function () {

const items = document.querySelectorAll(".produits-choix .produit");
const btnMore = document.getElementById("choix-more");
const btnLess = document.getElementById("choix-less");
const grid = document.querySelector(".produits-choix");

if (!items.length) return;

let visible = 8;

function update() {

items.forEach((el, i) => {
el.classList.toggle("hidden", i >= visible);
});

btnMore.style.display =
(visible < items.length)
? "inline-block"
: "none";

btnLess.style.display =
(visible > 8)
? "inline-block"
: "none";
}

btnMore.addEventListener("click", function () {
visible += 8;
update();
});

btnLess.addEventListener("click", function () {
visible = 8;
update();

grid.scrollIntoView({
behavior: "smooth"
});
});

update();
});
</script>

<?php

return ob_get_clean();

});
add_filter('posts_clauses', function ($clauses, $query) {

global $wpdb;

if (
!is_admin()
&& $query->get('post_type') === 'produit'
&& $query->get('tri_produits')
) {

$champ_tri = $query->get('champ_tri');

$clauses['join'] .= "

LEFT JOIN {$wpdb->postmeta} pm_promo
ON ({$wpdb->posts}.ID = pm_promo.post_id AND pm_promo.meta_key = 'en_promotion')

LEFT JOIN {$wpdb->postmeta} pm_mise
ON ({$wpdb->posts}.ID = pm_mise.post_id AND pm_mise.meta_key = 'mise_en_avant')

LEFT JOIN {$wpdb->postmeta} pm_choix
ON ({$wpdb->posts}.ID = pm_choix.post_id AND pm_choix.meta_key = 'choix')

LEFT JOIN {$wpdb->postmeta} pm_ordre
ON ({$wpdb->posts}.ID = pm_ordre.post_id AND pm_ordre.meta_key = 'ordre_affichage')
";

$clauses['groupby'] = "{$wpdb->posts}.ID";

// helper : vide => 999999 (toujours à la fin)
$null_to_end = "COALESCE(NULLIF(meta_value, ''), 999999)";

// TRI : MISE EN AVANT
if ($champ_tri === 'mise_en_avant') {

$clauses['orderby'] = "

CAST(COALESCE(NULLIF(pm_mise.meta_value,''),999999) AS UNSIGNED) ASC,
CAST(COALESCE(NULLIF(pm_choix.meta_value,''),999999) AS UNSIGNED) ASC,
CAST(COALESCE(NULLIF(pm_ordre.meta_value,''),999999) AS UNSIGNED) ASC

";
}

// TRI : PROMOTION
elseif ($champ_tri === 'en_promotion') {

$clauses['orderby'] = "

CAST(COALESCE(NULLIF(pm_promo.meta_value,''),0) AS UNSIGNED) DESC,
CAST(COALESCE(NULLIF(pm_choix.meta_value,''),999999) AS UNSIGNED) ASC,
CAST(COALESCE(NULLIF(pm_ordre.meta_value,''),999999) AS UNSIGNED) ASC

";
}
}

return $clauses;

}, 10, 2);
/*
*/

global $external_db;

function bloc_literie_shortcode($atts) {

$atts = shortcode_atts(array(
'titre' => '',
'texte' => '',
'element1' => '',
'element2' => '',
'element3' => '',
'element4' => '',
), $atts);

ob_start();
?>

<div class="bloc-literie">
<h2><?php echo esc_html($atts['titre']); ?></h2>

<p><?php echo esc_html($atts['texte']); ?></p>

<ul>
<?php
for ($i = 1; $i <= 4; $i++) {

if (!empty($atts["element$i"])) {

$parts = explode('|', $atts["element$i"]);

$url = $parts[0] ?? '#';
$label = $parts[1] ?? '';

echo '<li>';
echo '<a href="' . esc_url($url) . '">';
echo esc_html($label);
echo '</a>';
echo '</li>';
}
}
?>
</ul>
</div>

<?php
return ob_get_clean();
}

add_shortcode('bloc_literie', 'bloc_literie_shortcode');

/**
* SEO AUTOMATION PRODUITS - RANK MATH OPTIMISÉ
*/

add_action('save_post_produits', function($post_id) {

// Sécurité WordPress
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (wp_is_post_revision($post_id)) return;
if (!current_user_can('edit_post', $post_id)) return;

$title = get_the_title($post_id);
if (!$title) return;

/* =========================================================
1. FOCUS KEYWORD (Rank Math)
========================================================= */
$keyword = sanitize_text_field($title);

update_post_meta($post_id, 'rank_math_focus_keyword', $keyword);

/* =========================================================
2. SEO TITLE OPTIMISÉ
========================================================= */
update_post_meta(
$post_id,
'rank_math_title',
$title . ' | Marrakech - Design Extérieur Moderne'
);

/* =========================================================
3. META DESCRIPTION SEO (avec keyword exact)
========================================================= */
update_post_meta(
$post_id,
'rank_math_description',
'Découvrez ' . $title . ' à Marrakech. Design extérieur moderne, fabrication sur mesure pour terrasses, villas et riads au Maroc.'
);

/* =========================================================
4. SLUG OPTIMISÉ
========================================================= */
$slug = sanitize_title($title);
wp_update_post([
'ID' => $post_id,
'post_name' => $slug
]);

}, 20);

/* =========================================================
5. AJOUT CONTENU SEO AUTOMATIQUE (600+ mots Rank Math)
========================================================= */
add_filter('the_content', function($content) {

if (!is_singular('produits')) return $content;

$title = get_the_title();

$seo_content = '

<h1>' . esc_html($title) . ' au Maroc</h1>

<p><strong>' . esc_html($title) . '</strong> est un produit conçu pour les espaces extérieurs modernes au Maroc, notamment les terrasses, jardins, villas et riads.</p>

<h2>Design extérieur moderne</h2>
<p>Ce modèle combine esthétique moderne et confort, idéal pour les projets d’aménagement extérieur haut de gamme à Marrakech et dans tout le Maroc.</p>

<h2>Fabrication sur mesure</h2>
<p>Chaque ' . esc_html($title) . ' est fabriqué sur mesure selon vos dimensions, vos couleurs et vos besoins spécifiques.</p>

<h2>Résistance et durabilité</h2>
<p>Conçu pour résister au climat marocain, chaleur et exposition extérieure prolongée.</p>

<h2>Utilisation recommandée</h2>
<p>Parfait pour villas, hôtels, riads et espaces professionnels.</p>

<h2>Qualité premium</h2>
<p>Finitions haut de gamme avec matériaux durables et design contemporain.</p>

';

return $seo_content . $content;

}, 20);

/* =========================================================
6. H1 SEO FORCÉ (optionnel si thème mal optimisé)
========================================================= */
add_filter('the_title', function($title, $id) {

if (is_admin()) return $title;

if (get_post_type($id) === 'produits' && is_singular('produits')) {
return $title . ' au Maroc';
}

return $title;

}, 10, 2);

Ameublement à Marrakech : salons, mobilier et tapissier sur mesure

En tant que spécialiste de l’ameublement à Marrakech, nous concevons des salons marocains et modernes sur mesure adaptés à tous les styles d’intérieur. Notre atelier de tapissier réalise également la fabrication et la rénovation de vos assises avec un savoir-faire artisanal, alliant confort, durabilité et élégance.

Nos catégories d’ameublement à Marrakech

Nous proposons différentes catégories d’ameublement à Marrakech pour répondre à tous les besoins : salons marocains, mobilier sur mesure, literie et solutions de décoration intérieure. Chaque produit est conçu pour allier esthétique, confort et harmonie dans votre intérieur.

Nos réalisations en ameublement à Marrakech

Nos meilleures promotions d’ameublement à Marrakech

Profitez de nos offres spéciales sur une sélection de salons marocains, meubles et articles d’ameublement à Marrakech. Nous proposons des produits artisanaux de qualité à prix compétitifs, réalisés avec un savoir-faire traditionnel et des finitions soignées.

[tous_produits_promo]

Nos produits et services d’ameublement à Marrakech

[menu_dynamique items="nos-tissus,nos-salons,La Literie,Le Voilage"]

Quelques réalisations d’ameublement à Marrakech

Découvrez quelques-unes de nos réalisations en ameublement à Marrakech : salons marocains sur mesure, décoration intérieure élégante et travaux de tapisserie artisanale. Chaque projet reflète notre savoir-faire et notre engagement pour la qualité et le détail.

[afficher_produits_choix]

Nous accompagnons nos clients à Marrakech dans tous leurs projets d’ameublement et de décoration sur mesure.

À propos de notre atelier d’ameublement et tapisserie à Marrakech

Nous sommes un atelier spécialisé dans l’ameublement à Marrakech et la tapisserie artisanale sur mesure. Nous concevons et réalisons des salons marocains, des meubles et des éléments de décoration intérieure adaptés à tous les styles.

Grâce à notre savoir-faire et à notre expérience, nous accompagnons nos clients dans leurs projets d’aménagement en proposant des solutions de qualité alliant confort, esthétique et durabilité.

 

 

Notre expertise en tissus et tapisserie à Marrakech

Notre atelier met un point d’honneur à préserver la tradition artisanale tout en intégrant des finitions modernes pour répondre aux exigences de chaque client à Marrakech et dans les environs.

Nous sélectionnons des tissus d’ameublement de qualité et réalisons des travaux de tapisserie sur mesure pour garantir confort, durabilité et esthétique dans chaque projet.

Notre équipe de tapissiers et artisans à Marrakech

Notre équipe est composée de professionnels qualifiés et passionnés par l’ameublement et la tapisserie à Marrakech. Nous mettons notre savoir-faire artisanal au service de créations sur mesure et de qualité.

Tapissiers expérimentés à Marrakech

Nos tapissiers à Marrakech possèdent une solide expérience dans la tapisserie et l’ameublement. Ils maîtrisent les techniques de rembourrage, couture et fabrication de mobilier sur mesure.

Artisans qualifiés en ameublement

Nos artisans travaillent avec différents types de tissus et matériaux pour réaliser des créations uniques, des restaurations et des réparations de meubles de qualité.

Création de meubles et décoration sur mesure

Nous réalisons des meubles sur mesure à Marrakech : salons marocains, canapés, fauteuils, têtes de lit, voilages et autres éléments de décoration adaptés aux besoins de chaque client.

Service personnalisé et accompagnement client

Nous accompagnons chaque client à Marrakech avec un service personnalisé, des conseils en décoration et des solutions adaptées à chaque projet d’ameublement.

Qualité et finition artisanale

Chaque réalisation est réalisée avec soin, précision et souci du détail afin de garantir une finition de haute qualité et durable.

Témoignages de nos clients à Marrakech

Découvrez les avis de nos clients à Marrakech sur nos services d’ameublement, de tapisserie et de décoration intérieure. Leur satisfaction reflète notre engagement pour la qualité et le travail bien fait.

★★★★★

Leïla A. – Marrakech

“Une expérience exceptionnelle avec Akram Ameublement. Leur large gamme de tissus et leur savoir-faire en tapisserie ont donné un nouveau souffle à notre maison. Le service client est impeccable. Merci pour cette belle transformation !”

★★★★★

Fatima Z. – Marrakech

“Nous avons fait appel à Akram Ameublement pour rénover notre mobilier et les résultats sont magnifiques. Leur collection de tissus est variée et de grande qualité, et la tapisserie est parfaitement réalisée. Une entreprise fiable et professionnelle !”

Découvrez nos produits d’ameublement à Marrakech

Nos produits et nos techniques de tapisserie permettent de transformer et moderniser votre intérieur à Marrakech, que ce soit pour un salon marocain, un canapé, une chambre à coucher ou des voilages sur mesure.

Découvrez notre collection de tissus d’ameublement : voir la collection .

Nous utilisons des mousses et matériaux de qualité provenant de marques reconnues comme Dolidol , Richbond , Simmons .

Besoin d’un devis ou d’un conseil ? Visitez notre atelier à Marrakech ou contactez-nous directement via notre formulaire de contact ou par WhatsApp au +212 6 61 24 55 88.

Scroll to Top