كم شهر متبقي حتي تاريخ النسخة الاولي months until

 ممتاز! سأقوم بإنشاء شورت كود جديد لحساب الأشهر بنفس المنطق والتصميم. إليك الكود الكامل:

php
<?php
// ============================================================================
// MONTHS UNTIL/SINCE COUNTER - STANDALONE VERSION
// ============================================================================

// Register the shortcode
add_shortcode('months_until_since', 'months_until_since_handler');

function months_until_since_handler($atts) {
    // Set default attributes
    $atts = shortcode_atts(array(
        'date' => '',
        'type' => 'until', // until or since
        'language' => 'en'
    ), $atts);

    // Get attributes
    $target_date = trim($atts['date']);
    $type = $atts['type'];
    $language = $atts['language'];

    // Validate required fields
    if (empty($target_date)) {
        return '<div style="color: red; padding: 20px; text-align: center; border: 2px solid red; border-radius: 10px;">❌ Error: Please provide a date using the "date" attribute. Example: [months_until_since date="2026-05-18" type="until"]</div>';
    }

    try {
        // Create date objects
        $target = new DateTime($target_date);
        $today = new DateTime();
        
        // Set time to midnight for accurate comparison
        $target->setTime(0, 0, 0);
        $today->setTime(0, 0, 0);
        
        // Check if date is valid
        if (!$target) {
            return '<div style="color: red; padding: 20px; text-align: center; border: 2px solid red; border-radius: 10px;">❌ Error: Invalid date format. Please use YYYY-MM-DD format.</div>';
        }

        // Determine if target date is in past or future
        $is_past = $target < $today;
        
        // Validate type vs date direction
        if ($type === 'until' && $is_past) {
            return '<div style="color: red; padding: 20px; text-align: center; border: 2px solid red; border-radius: 10px;">❌ Error: For "until" calculations, the target date must be in the future. Your date is in the past.</div>';
        }
        
        if ($type === 'since' && !$is_past) {
            return '<div style="color: red; padding: 20px; text-align: center; border: 2px solid red; border-radius: 10px;">❌ Error: For "since" calculations, the target date must be in the past. Your date is in the future.</div>';
        }

        // Calculate the time difference
        $interval = $today->diff($target);
        $total_days = $interval->days;
        $total_months = $interval->y * 12 + $interval->m;
        $remaining_days = $interval->d;
        $total_years = $interval->y;
        $remaining_months = $interval->m;
        
        // Additional calculations for SEO
        $total_weeks = floor($total_days / 7);
        $total_hours = $total_days * 24;
        $total_minutes = $total_hours * 60;
        $total_seconds = $total_minutes * 60;

        // Get date information for display
        $target_day_of_week = $target->format('l');
        $target_week_of_year = $target->format('W');
        $target_year = $target->format('Y');
        $target_month = $target->format('F');
        $target_day_ordinal = $target->format('jS');
        $full_target_date = $target->format('F j, Y');
        
        // Today's date for reference
        $today_date = $today->format('F j, Y');

        // Build display content based on language and type
        if ($language === 'ar') {
            // Arabic content
            $days_translation = [
                'Monday' => 'الاثنين',
                'Tuesday' => 'الثلاثاء', 
                'Wednesday' => 'الأربعاء',
                'Thursday' => 'الخميس',
                'Friday' => 'الجمعة',
                'Saturday' => 'السبت',
                'Sunday' => 'الأحد'
            ];
            
            $target_day_ar = $days_translation[$target_day_of_week];
            $months_ar = [
                'January' => 'يناير',
                'February' => 'فبراير',
                'March' => 'مارس',
                'April' => 'أبريل',
                'May' => 'مايو',
                'June' => 'يونيو',
                'July' => 'يوليو',
                'August' => 'أغسطس',
                'September' => 'سبتمبر',
                'October' => 'أكتوبر',
                'November' => 'نوفمبر',
                'December' => 'ديسمبر'
            ];
            
            $target_month_ar = $months_ar[$target_month];

            if ($type === 'until') {
                $title = "كم شهر متبقي حتى {$target_month_ar} {$target_day_ordinal}، {$target_year}؟";
                $main_text = "هناك {$total_months} شهر و {$remaining_days} يوم متبقي حتى {$full_target_date}";
                $natural_language = "{$target_month_ar} {$target_day_ordinal}، {$target_year} سيكون بعد {$total_years} سنوات و {$remaining_months} أشهر و {$remaining_days} أيام، وهو ما يعادل {$total_days} يوماً.";
                $additional_info = "سيوافق {$full_target_date} يوم {$target_day_ar} وسيكون في الأسبوع {$target_week_of_year} من عام {$target_year}.";
            } else {
                $title = "كم شهر مضى منذ {$target_month_ar} {$target_day_ordinal}، {$target_year}؟";
                $main_text = "لقد مضى {$total_months} شهر و {$remaining_days} يوم منذ {$full_target_date}";
                $natural_language = "لقد مضى {$total_years} سنوات و {$remaining_months} أشهر و {$remaining_days} أيام منذ {$full_target_date}، وهو ما يعادل {$total_days} يوماً.";
                $additional_info = "وافق {$full_target_date} يوم {$target_day_ar} وكان في الأسبوع {$target_week_of_year} من عام {$target_year}.";
            }
            
            $call_to_action = "تابع تقدم الوقت أو شارك هذه المعلومات مع الأصدقاء والعائلة.";
            $breakdown_title = "التفاصيل الإضافية:";
            
            // Breakdown questions
            $months_text = "كم شهر " . ($type === 'until' ? 'متبقي' : 'مضى') . "؟";
            $weeks_text = "كم أسبوع " . ($type === 'until' ? 'متبقي' : 'مضى') . "؟";
            $days_text = "كم يوم " . ($type === 'until' ? 'متبقي' : 'مضى') . "؟";
            $years_text = "كم سنة " . ($type === 'until' ? 'متبقية' : 'مضت') . "؟";
            $hours_text = "كم ساعة " . ($type === 'until' ? 'متبقية' : 'مضت') . "؟";
            $minutes_text = "كم دقيقة " . ($type === 'until' ? 'متبقية' : 'مضت') . "؟";
            
        } else {
            // English content
            if ($type === 'until') {
                $title = "How many months until {$target_month} {$target_day_ordinal}, {$target_year}?";
                $main_text = "There are {$total_months} months and {$remaining_days} days until {$full_target_date}";
                $natural_language = "{$target_month} {$target_day_ordinal}, {$target_year} will be in {$total_years} years, {$remaining_months} months and {$remaining_days} days, which is {$total_days} days.";
                $additional_info = "{$full_target_date} will be on a {$target_day_of_week} and will be in week {$target_week_of_year} of {$target_year}.";
            } else {
                $title = "How many months since {$target_month} {$target_day_ordinal}, {$target_year}?";
                $main_text = "It has been {$total_months} months and {$remaining_days} days since {$full_target_date}";
                $natural_language = "It has been {$total_years} years, {$remaining_months} months and {$remaining_days} days since {$full_target_date}, which is {$total_days} days.";
                $additional_info = "{$full_target_date} was on a {$target_day_of_week} and was in week {$target_week_of_year} of {$target_year}.";
            }
            
            $call_to_action = "Track your time progress or share this information with friends and family.";
            $breakdown_title = "Additional Breakdown:";
            
            // Breakdown questions
            $months_text = "How many months " . ($type === 'until' ? 'until' : 'since') . "?";
            $weeks_text = "How many weeks " . ($type === 'until' ? 'until' : 'since') . "?";
            $days_text = "How many days " . ($type === 'until' ? 'until' : 'since') . "?";
            $years_text = "How many years " . ($type === 'until' ? 'until' : 'since') . "?";
            $hours_text = "How many hours " . ($type === 'until' ? 'until' : 'since') . "?";
            $minutes_text = "How many minutes " . ($type === 'until' ? 'until' : 'since') . "?";
        }

        // Build the output HTML
        $output = "
        <div style='
            background: linear-gradient(135deg, #ff7e5f 0%, #feb47b 100%); 
            color: white; 
            padding: 30px; 
            border-radius: 15px; 
            margin: 25px 0; 
            box-shadow: 0 10px 30px rgba(0,0,0,0.2);
            font-family: Arial, sans-serif;
        '>
            
            <!-- Main Title -->
            <h1 style='
                margin: 0 0 20px 0; 
                text-align: center; 
                font-size: 28px; 
                color: white;
            '>
                {$title}
            </h1>
            
            <!-- Natural Language SEO Description -->
            <div style='
                background: rgba(255,255,255,0.1); 
                padding: 25px; 
                border-radius: 12px; 
                margin-bottom: 25px; 
                text-align: center; 
                font-size: 18px; 
                line-height: 1.6;
                border: 1px solid rgba(255,255,255,0.2);
            '>
                <p style='margin: 0 0 15px 0;'><strong>{$natural_language}</strong></p>
                <p style='margin: 0 0 15px 0;'>{$additional_info}</p>
                <p style='margin: 0; opacity: 0.9;'>{$call_to_action}</p>
            </div>
            
            <!-- Main Result Display -->
            <div style='text-align: center; margin: 30px 0;'>
                <div style='
                    display: inline-block; 
                    background: rgba(255,255,255,0.2); 
                    color: white; 
                    padding: 40px 50px; 
                    border-radius: 20px; 
                    backdrop-filter: blur(10px);
                    border: 2px solid rgba(255,255,255,0.3);
                '>
                    <div style='
                        font-size: 52px; 
                        font-weight: bold; 
                        margin-bottom: 10px;
                        text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
                    '>
                        " . number_format($total_months) . "
                    </div>
                    <div style='
                        font-size: 22px; 
                        opacity: 0.9;
                    '>
                        " . ($language === 'ar' ? 'شهر' : 'Months') . "
                    </div>
                    <div style='
                        font-size: 18px; 
                        margin-top: 10px; 
                        opacity: 0.8;
                        padding-top: 10px;
                        border-top: 1px solid rgba(255,255,255,0.2);
                    '>
                        " . ($language === 'ar' ? {$remaining_days} يوم" : "and {$remaining_days} days") . "
                    </div>
                </div>
            </div>
            
            <!-- Main Statistics Grid -->
            <div style='
                display: grid; 
                grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); 
                gap: 15px; 
                margin: 25px 0;
            '>
                <div style='
                    background: rgba(255,255,255,0.15); 
                    padding: 20px; 
                    border-radius: 12px; 
                    text-align: center; 
                    backdrop-filter: blur(10px);
                    border: 1px solid rgba(255,255,255,0.2);
                '>
                    <div style='font-size: 32px; font-weight: bold; margin-bottom: 8px;'>" . number_format($total_months) . "</div>
                    <div style='font-size: 14px; opacity: 0.9;'>" . ($language === 'ar' ? 'شهر' : 'Months') . "</div>
                </div>
                <div style='
                    background: rgba(255,255,255,0.15); 
                    padding: 20px; 
                    border-radius: 12px; 
                    text-align: center; 
                    backdrop-filter: blur(10px);
                    border: 1px solid rgba(255,255,255,0.2);
                '>
                    <div style='font-size: 32px; font-weight: bold; margin-bottom: 8px;'>" . number_format($total_weeks) . "</div>
                    <div style='font-size: 14px; opacity: 0.9;'>" . ($language === 'ar' ? 'أسبوع' : 'Weeks') . "</div>
                </div>
                <div style='
                    background: rgba(255,255,255,0.15); 
                    padding: 20px; 
                    border-radius: 12px; 
                    text-align: center; 
                    backdrop-filter: blur(10px);
                    border: 1px solid rgba(255,255,255,0.2);
                '>
                    <div style='font-size: 32px; font-weight: bold; margin-bottom: 8px;'>" . number_format($total_days) . "</div>
                    <div style='font-size: 14px; opacity: 0.9;'>" . ($language === 'ar' ? 'يوم' : 'Days') . "</div>
                </div>
            </div>
            
            <!-- Detailed Breakdown for SEO -->
            <div style='
                background: rgba(0,0,0,0.2); 
                padding: 25px; 
                border-radius: 12px; 
                margin-top: 20px;
            '>
                <h3 style='
                    margin: 0 0 20px 0; 
                    text-align: center; 
                    color: white;
                    font-size: 22px;
                '>
                    {$breakdown_title}
                </h3>
                <div style='
                    display: grid; 
                    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); 
                    gap: 15px; 
                    font-size: 16px;
                '>
                    <div style='
                        padding: 12px; 
                        border-bottom: 1px solid rgba(255,255,255,0.1);
                    '>
                        <strong>{$months_text}</strong><br>
                        <span style='font-size: 20px; font-weight: bold;'>" . number_format($total_months) . " " . ($language === 'ar' ? 'شهر' : 'months') . "</span>
                    </div>
                    <div style='
                        padding: 12px; 
                        border-bottom: 1px solid rgba(255,255,255,0.1);
                    '>
                        <strong>{$weeks_text}</strong><br>
                        <span style='font-size: 20px; font-weight: bold;'>" . number_format($total_weeks) . " " . ($language === 'ar' ? 'أسبوع' : 'weeks') . "</span>
                    </div>
                    <div style='
                        padding: 12px; 
                        border-bottom: 1px solid rgba(255,255,255,0.1);
                    '>
                        <strong>{$days_text}</strong><br>
                        <span style='font-size: 20px; font-weight: bold;'>" . number_format($total_days) . " " . ($language === 'ar' ? 'يوم' : 'days') . "</span>
                    </div>
                    <div style='
                        padding: 12px; 
                        border-bottom: 1px solid rgba(255,255,255,0.1);
                    '>
                        <strong>{$years_text}</strong><br>
                        <span style='font-size: 20px; font-weight: bold;'>" . number_format($total_years) . " " . ($language === 'ar' ? 'سنة' : 'years') . "</span>
                    </div>
                    <div style='
                        padding: 12px; 
                        border-bottom: 1px solid rgba(255,255,255,0.1);
                    '>
                        <strong>{$hours_text}</strong><br>
                        <span style='font-size: 20px; font-weight: bold;'>" . number_format($total_hours) . " " . ($language === 'ar' ? 'ساعة' : 'hours') . "</span>
                    </div>
                    <div style='
                        padding: 12px; 
                        border-bottom: 1px solid rgba(255,255,255,0.1);
                    '>
                        <strong>{$minutes_text}</strong><br>
                        <span style='font-size: 20px; font-weight: bold;'>" . number_format($total_minutes) . " " . ($language === 'ar' ? 'دقيقة' : 'minutes') . "</span>
                    </div>
                </div>
            </div>
            
            <!-- Calendar Information -->
            <div style='
                background: rgba(255,255,255,0.1); 
                padding: 20px; 
                border-radius: 10px; 
                margin-top: 20px;
            '>
                <h4 style='
                    margin: 0 0 15px 0; 
                    text-align: center; 
                    color: white;
                '>
                    " . ($language === 'ar' ? '📅 معلومات التقويم' : '📅 Calendar Information') . "
                </h4>
                <div style='
                    display: grid; 
                    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); 
                    gap: 10px; 
                    font-size: 14px;
                '>
                    <div>
                        <strong>" . ($language === 'ar' ? 'التاريخ المستهدف:' : 'Target Date:') . "</strong><br>
                        {$full_target_date}
                    </div>
                    <div>
                        <strong>" . ($language === 'ar' ? 'يوم الأسبوع:' : 'Day of Week:') . "</strong><br>
                        {$target_day_of_week}" . ($language === 'ar' ? " ({$target_day_ar})" : "") . "
                    </div>
                    <div>
                        <strong>" . ($language === 'ar' ? 'الأسبوع في السنة:' : 'Week of Year:') . "</strong><br>
                        {$target_week_of_year}
                    </div>
                    <div>
                        <strong>" . ($language === 'ar' ? 'التاريخ الحالي:' : 'Current Date:') . "</strong><br>
                        {$today_date}
                    </div>
                </div>
            </div>
            
            <!-- Footer -->
            <div style='
                text-align: center; 
                margin-top: 25px; 
                font-size: 14px; 
                opacity: 0.8;
                padding-top: 15px;
                border-top: 1px solid rgba(255,255,255,0.2);
            '>
                <p>✨ " . ($language === 'ar' ? 'تم الحساب تلقائياً | 📅 مناسب لمحركات البحث' : 'Automatically Calculated | 📅 SEO Optimized') . " ✨</p>
            </div>
            
        </div>
        ";

        return $output;

    } catch (Exception $e) {
        return '<div style="
            background: #f8d7da; 
            color: #721c24; 
            padding: 25px; 
            border-radius: 10px; 
            margin: 20px 0; 
            border: 2px solid #f5c6cb;
            text-align: center;
            font-size: 16px;
        ">⚠️ ' . ($language === 'ar' ? 'خطأ في معالجة التاريخ: ' : 'Error processing date: ') . $e->getMessage() . '</div>';
    }
}

// Ensure the shortcode is registered
add_action('init', function() {
    if (!shortcode_exists('months_until_since')) {
        add_shortcode('months_until_since', 'months_until_since_handler');
    }
});

// Debug function to test if shortcodes are working
add_shortcode('test_months', function() {
    return '✅ Months counter shortcode is working! If you see this, the system is functional.';
});
?>

📋 دليل الاستخدام الكامل:

🔹 الاستخدام الأساسي:

php
[months_until_since date="2026-05-18" type="until" language="en"]

🔹 جميع الأمثلة:

php
// كم شهر متبقي حتى تاريخ
[months_until_since date="2026-05-18" type="until" language="en"]

// كم شهر مضى منذ تاريخ  
[months_until_since date="2020-01-01" type="since" language="en"]

// باللغة العربية - كم شهر متبقي
[months_until_since date="2026-05-18" type="until" language="ar"]

// باللغة العربية - كم شهر مضى
[months_until_since date="2020-01-01" type="since" language="ar"]

🔹 المعاملات المدعومة:

  • date (مطلوب): التاريخ المستهدف (صيغة: YYYY-MM-DD)

  • typeuntil (مستقبل) أو since (ماضي) - الافتراضي: until

  • languageen (إنجليزي) أو ar (عربي) - الافتراضي: en

🎯 المميزات الجديدة:

✅ تصميم محسن للسيو:

  • جمل طبيعية: "May 18th, 2026 will be in 2 years, 5 months and 3 days, which is 882 days."

  • أسئلة ضمنية: "How many months until May 18th, 2026?"

  • تفاصيل شاملة: سنوات، أشهر، أيام، أسابيع، ساعات، دقائق

  • معلومات تقويم: يوم الأسبوع، أسبوع السنة، التاريخ الحالي

✅ واجهة مستخدم متكاملة:

  • عرض رئيسي: عدد الأشهر بشكل بارز

  • شبكة إحصاءات: أشهر، أسابيع، أيام

  • تفاصيل موسعة: جميع الوحدات الزمنية

  • معلومات تقويم: بيانات إضافية مفيدة

✅ دعم متعدد اللغات:

  • الإنجليزية: نصوص طبيعية ومناسبة للسيو

  • العربية: ترجمة كاملة مع أشهر وأيام عربية

✅ معالجة أخطاء محسنة:

  • تحقق من صحة التاريخ

  • تحقق من اتجاه التاريخ (ماضي/مستقبل)

  • رسائل خطأ واضحة ومفصلة

🧪 طريقة الاختبار:

أولاً: تحقق من عمل الشورت كود

php
[test_months]

ثانياً: جرب الأمثلة:

php
[months_until_since date="2026-05-18" type="until" language="en"]
[months_until_since date="2020-01-01" type="since" language="en"]
[months_until_since date="2026-05-18" type="until" language="ar"]

🎨 التصميم المختلف:

لاحظ أني استخدمت تدرج ألوان مختلف (برتقالي) للتمييز عن شورت كود الأسابيع (أزرق) وشورت كود أيام الأسبوع (وردي). هذا يساعد في تمييز كل نوع من الحسابات.

الآن لديك شورت كود متكامل لحساب الأشهر مع جميع مميزات الـSEO والتصميم الجميل!

Comments

Popular posts from this blog

How to add Social Share Buttons Every Blogger Posts

خطوات كتابة مقالة متوافقة مع السيو 2022

تهنئة بمناسبة شم النسيم