آموزش جامع مدیریت و بهبود تابع the_excerpt وردپرس
سلام دوستان خوبم.در آموزش امروز قصد داریم بر روی خلاصه مطالب مدیریت داشته باشیم.منظور من را زمانی می فهمید که مثلا در یک باکس می خواهید تعداد خاصی از کلمات به صورت کامل نمایش داده بشه.
باید بدانید که در حالت عادی با قرار دادن دستور زیر :
<?php the_excerpt(); ?>
[/php]بطور خلاصه به نمایش مطالب می پردازیم که این خاصیت بیشتر در صفحات archive.php یا صفحه اول دیده میشود تا بتوان بطور خلاصه تعداد مطالب بیشتری را نمایش داد.امیدوارم تا اینجا در جریان قرار گرفته باشید که چیکار میخواهیم بکنیم.برای شروع کار فایل functions.php خود را باز کنید و اگر ندارید بسازید و کد زیر را در آن قرار دهید :
[php]// 3zar.ir excerpt length.function print_excerpt($length) { // Max excerpt length. Length is set in characters
global $post;
$text = $post->post_excerpt;
if ( ” == $text ) {
$text = get_the_content(”);
$text = apply_filters(‘the_content’, $text);
$text = str_replace(‘]]>’, ‘]]>’, $text);
}
$text = strip_shortcodes($text); // optional, recommended
$text = strip_tags($text); // use ‘ $text = strip_tags($text,'<p><a>’); ‘ if you want to keep some tags
$text = substr($text,0,$length);
$excerpt = reverse_strrchr($text, ‘.’, 1);
if( $excerpt ) {
echo apply_filters(‘the_excerpt’,$excerpt);
} else {
echo apply_filters(‘the_excerpt’,$text);
}
}
// Returns the portion of haystack which goes until the last occurrence of needle
function reverse_strrchr($haystack, $needle, $trail) {
return strrpos($haystack, $needle) ? substr($haystack, 0, strrpos($haystack, $needle) + $trail) : false;
}
[/php]
توضیح : شما در کد بالا تابعی تعریف میکنید با نام “print_excerpt” که می توانید در هر جا که خواستید داخل حلقه while جهت نمایش مطالب آن را فراخوانی کنید.
خوب حالا در مکانی که میخواهین خلاصه مطلب را نمایش بدید به جای دستورات زیر :
[php]<?php the_excerpt(); ?>
یا
<?php the_content(); ?>
[/php]از دستور زیر استفاده کنید :
[php]<?php print_excerpt(50); ?>
[/php]درکد بالا بنا به نیاز عدد 50 را تغییر دهید.
روش دوم : خوب دوستان عزیز شما تا اینجا با روش خلاصه کردن آشنا شدید, میخواهم روش دیگری که با آموزش بالا فرق دارد را بهتون یاد بدم که جالب تر است.
ابتدا بهتر بدونیم بدونیم تابع excerpt از کجا فراخوانی میشود.این تابع در فایل مورد نظر در مسیر زیر قرار دارد :
[php]wp-includes/formatting.php
[/php]در خط 2111 تابع wp_trim_excerpt را مشاهده میکنید که کد زیر را دارد :
[php]function wp_trim_excerpt($text = ”) {
$raw_excerpt = $text;
if ( ” == $text ) {
$text = get_the_content(”);
$text = strip_shortcodes( $text );
$text = apply_filters(‘the_content’, $text);
$text = str_replace(‘]]>’, ‘]]>’, $text);
$excerpt_length = apply_filters(‘excerpt_length’, 55);
$excerpt_more = apply_filters(‘excerpt_more’, ‘ ‘ . ‘[…]’);
$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
return apply_filters(‘wp_trim_excerpt’, $text, $raw_excerpt);
}
دوستان خوبم توجه کنید ما نمی خواهیم هسته وردپرس را از بین ببریم.خوب حالا از کد بالا یک کپی بگیرید و فایل functions.php را باز کنید و کد را در آن بگزارید.کار ما شروع میشود این تابع در خط اول با نام
[php]wp_trim_excerpt()
[/php]فراخوانی میشود.پس اول اسم آن را به
[php]improved_trim_excerpt()
[/php]
تغییر دهید.شما الان در خط اول باید کدی مطابق زیر داشته باشید :
[php]function improved_trim_excerpt($text) {
[/php]حالا بر روی کد بصورت تخصصی تر کار میکنیم.میخواهیم طول کلمات چکیده و خلاصه مطلب را زیاد کنیم, برای این کار در خط 8 کد بالا متغییری بصورت زیر تعریف شده است :
[php]$excerpt_length = 55;
[/php]
که شما میتوانید تعداد کلمات را با تغییر عدد 55 افزایش یا کاهش دهید.
خوب حالا میخواهیم یه مشکل دیگه خلاصه مطلب را برطرف کنیم آن هم در پاراگراف بندی است. برای این کار کد زیر را در 8 جایگزاری نمائید:
$text = strip_tags($text, ‘<p>’);
[/php]
شما می توانید تعداد تگ های بیشتری هم بدین طریق اضافه کنید.حالا میخواهیم روی کد های جاوا اسکریپت کار کنیم.معمولا اگه دیده باشید اگر در خط های اول نوشته های مطالبتون کدی گذاشته باشید که کاربرا آن را ببینند وقتی خلاصه اون را نمایش میدهید ظاهر آن جالب نیست و برای حل این مشکل استفاده از کد زیر راهکار خوبی است, در خط 8 کد زیر را جایگزاری نمائید :
[php]$text = preg_replace(‘@<script[^>]*?>.*?</script>@si’, ”, $text);
[/php]
بسیار خوب دوستان خوبم, تا اینجا کار ما به پایان رسیده است. حال برای اینکه ببینید نتیجه کارتان را خروجی کد های بالای شما پس از تغییر باید چیزی شبیه این باشد :
[php]function improved_trim_excerpt($text) {
global $post;
if ( ” == $text ) {
$text = get_the_content(”);
$text = apply_filters(‘the_content’, $text);
$text = str_replace(‘\]\]\>’, ‘]]>’, $text);
$text = preg_replace(‘@<script[^>]*?>.*?</script>@si’, ”, $text);
$text = strip_tags($text, ‘<p>’);
$excerpt_length = 80;
$words = explode(‘ ‘, $text, $excerpt_length + 1);
if (count($words)> $excerpt_length) {
array_pop($words);
array_push($words, ‘[…]’);
$text = implode(‘ ‘, $words);
}
}
return $text;
}
خوب برای پایان کار باید به این هسته وردپرس بگوئیم که از از تابع جدید ما یعنی improved_trim_excerpt بجای wp_trim_excerpt استفاده کند.چاره کار در اضافه کردن 2 خط کد زیر است, اول برای عدم فراخوانی و دومی برای فراخوانی :
[php]remove_filter(‘get_the_excerpt’, ‘wp_trim_excerpt’);
add_filter(‘get_the_excerpt’, ‘improved_trim_excerpt’);
بسیار خوب کد نهایی شما این چنین می شود :
[php]remove_filter(‘get_the_excerpt’, ‘wp_trim_excerpt’);
add_filter(‘get_the_excerpt’, ‘improved_trim_excerpt’);
function improved_trim_excerpt($text) {
global $post;
if ( ” == $text ) {
$text = get_the_content(”);
$text = apply_filters(‘the_content’, $text);
$text = str_replace(‘\]\]\>’, ‘]]>’, $text);
$text = preg_replace(‘@<script[^>]*?>.*?</script>@si’, ”, $text);
$text = strip_tags($text, ‘<p>’);
$excerpt_length = 80;
$words = explode(‘ ‘, $text, $excerpt_length + 1);
if (count($words)> $excerpt_length) {
array_pop($words);
array_push($words, ‘[…]’);
$text = implode(‘ ‘, $words);
}
}
return $text;
}
[/php]
کار تمام شد حالا شما از تابع زیر در هر جا که میخواهید استفاده کنید:
[php]<?php the_excerpt(); ?>
[/php]امیدوارم از این آموزش استفاده لازم را ببرید.
شادی از آن لحظه های شما …
لینک کوتاه : https://3zar.ir/?p=16392
خیلی جالب بود باز هم از این مطالب جالب بذارید…باز هم تشکر
موفق و موید باشید
موفق و موید باشید
ممنون از لطفتون.
واقعا عالی بود. مرسی
واقعا عالی بود. مرسی
جالب بود.
لایــــــــــــــــــــکــ داشت.
درود و سپاس از شما
خیلی جالب بود باز هم از این مطالب جالب بذارید…باز هم تشکر
زیبا بود !
دست گلت درد نکنه واقعاً جای تشکر و قدر دانی داره
بسیار مقاله خوب , جامع و مفیدی بود
قربانت علی جان.
بسیار مفید بود
عالی بود
قربانت فرزاد جان
من این کارهایی که گفتین روی فایل functions.php انجام دادم. الان سایتم این ارور رو میده:
Fatal error: Call to undefined function remove_filter() in /home/ariaroid/public_html/wp-includes/functions.php on line 3862
سلام محمد جان
عذر خواهم دیر پاسختون را میدهم.چند تا روش هست شما از کدام یکیش دارین استفاده میکنید ؟
سلام.
ممنون از پاسختون.
من میخواستم دکمه “بیشتر بخوانید” قالب صحیفه رو به دکمه ادامه مطلب تغییر بدم.
شما گفتین از این آموزش استفاده کنم:
https://www.3zar.ir/17476-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AE%D9%84%D8%A7%D8%B5%D9%87-%D9%85%D8%B7%D9%84%D8%A8-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88.html
اون مطلبو خوندم فهمیدم اول باید کاری که اینجا گفتین رو انجام بدم. روش دوم به نظرم بهتر بود اونو انجام دادم. که بعدش برم به اون پستی که شما لینک دادین. که اونم نشد و ارور داد.
راستی پوسته صحیفه رو از سایت برداشتین؟
سلام
الان دارم آمادش میکنم.سعی میکنم یک باگ کوچیک داره اونم بگیرم میزارم که دانلود کنید.
میتونیم ورژن قبلیو به ورژن جدید آپگرید کنیم؟
و سوال اصلیه منو پاسخ ندادید
سلام
قبلش در تنظیمات قالب در بخش advanced از تنظینات یک خروجب بگیرید.
خیلی ممنون, استفاده کردیم
سلام
چه کدی در قالب قرار بدم که فقط زمانی خلاصه مطلب رو نمایش بده که خودم توی باکس خلاصه مطلب چیزی نوشته باشم نه اینکه چند کلمه اول مطلب رو نشون بده.
تشکر
سلام
از دستور شرطی باید بهره ببرید:
[php]
$exc=the_excerpt(); if($exc != ”) {
}
[/php]
کد نهایی در فایل فانکشن کار نکرد و ارور داد… من فقط در فایل فانکشن عدد 55 رو مثلا به 100 تغییر دادم و کدهای دیگه رو اضافه نکردم که درست بود. به این صورت:
remove_filter(‘get_the_excerpt’, ‘wp_trim_excerpt’);
add_filter(‘get_the_excerpt’, ‘improved_trim_excerpt’);
function improved_trim_excerpt($text) {
$raw_excerpt = $text;
if ( ” == $text ) {
$text = get_the_content(”);
$text = strip_shortcodes( $text );
$text = apply_filters(‘the_content’, $text);
$text = str_replace(‘]]>’, ‘]]>’, $text);
$excerpt_length = apply_filters(‘excerpt_length’, 100);
$excerpt_more = apply_filters(‘excerpt_more’, ‘ ‘ . ‘[…]’);
$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
return apply_filters(‘wp_trim_excerpt’, $text, $raw_excerpt);
}
سلام
ببخشید من این کد رو توی قالبم قراردادم ولی خط 13 رو خطا میگیره:
if (count($words)> $excerpt_length) {
این خط این قسمتش > یعنی چی؟ همین رو خطا میگیره
ممنونم خداخیرتون بده