it-swarm.asia

قم بتطبيق مرشح the_title () في عنوان المنشور والصفحة ، ولكن ليس في عنوان القائمة

يمكنني استخدام الكود التالي لتغيير عنوان WordPress posts و pages . ولكنه يغير عناوين عناصر قائمة التنقل أيضًا ، والتي أريد تجنبها.

أرغب في تغيير عنوان المنشورات والصفحات في: الصفحة الرئيسية ، جميع صفحات الأرشيف و// الكل عناصر واجهة المستخدم (أداة النشر الحديثة ، أداة نشر عشوائية ، إلخ)

هناك أسئلة مماثلة في كل من Stack Overflow و WP Stack Exchange تقترح استخدام دالة in_the_loop(). لسوء الحظ ، لا يعمل هذا الأمر بالنسبة لي ، لأنه إذا قمت بوضعه ، فسيؤثر أيضًا على عناصر واجهة مستخدم الشريط الجانبي.

هذا يعني ، إذا استخدمت دالة in_the_loop() ، فلن يؤثر عامل تصفية the_title على recent posts widget أو random post widget إلخ.

إذن كيف يمكنني تطبيق مرشح the_title على عناوين post و page فقط ، ولكن ليس عناوين القائمة؟

function pppp_title_update( $title, $id = null ) {

    if ( ! is_admin() ) {
       if(is_singular(array('post','page')) || is_archive() || is_home()){
            if(in_the_loop()){
                $current_post_id = get_the_ID();
                $new_titile = get_post_meta($current_post_id, 'pp_new_title',true);
                return $new_titile;  
            }                     
       } 
    }

    return $title;
}
add_filter( 'the_title', 'pppp_title_update', 10, 2 );
7
Ranuka

وصف المشكلة:

اسمحوا لي أن أعيد صياغة السؤال أولاً. اتريد:

  1. عيّن عنوانًا جديدًا لكل أنواع post و page من حقل التعريف.

  2. تريد أن يحدث هذا في كل مكان (الصفحة الرئيسية ، الصفحة المفردة ، عناصر واجهة التعامل وما إلى ذلك)

  3. ومع ذلك ، لا تريد أن يحدث تغيير هذا العنوان إذا كان العنوان في قائمة التنقل.

حل:

قبل أن أقدم لك الشفرة ، اسمحوا لي أن أوضح بضع نقاط أولاً (بناءً على الكود):

كيفية تغيير عناوين جميع المشاركات والصفحات:

أنت تعرف بالفعل استخدام فلتر the_title. ومع ذلك ، إذا كنت ترغب في استهداف جميع عناوين النوع post و page (ولكن ليس أنواع المنشورات المخصصة) ، فشرطك:

is_singular(array('post','page')) || is_archive() || is_home()

لن يعمل. على سبيل المثال ، سيغير نوع النشر المخصص في صفحة الأرشيف أو الصفحة الرئيسية أيضًا. لا يتحقق هذا الشرط من أن العنوان الذي نقوم بتصفيةه هو page أو post. بدلاً من ذلك ، فإنه يتحقق مما إذا كانت الصفحة نفسها إما مفردة (post أو page) أو أنها صفحة أرشيف (فئة ، علامة إلخ) أو الصفحة الرئيسية. لذلك تتأثر أنواع المنشورات المخصصة في هذه الصفحات. بالإضافة إلى ذلك ، إذا كان هناك عنصر واجهة مستخدم في صفحة نوع منشور مخصص (مفرد) ، فلن يتأثر هذا العنوان بعناوين العنوان page أو post.

لإصلاح ذلك ، نحتاج إلى فحص مختلف ، مثل:

$post = get_post( $id );
if ( $post instanceof WP_Post && ( $post->post_type == 'post' || $post->post_type == 'page' ) )

لماذا يتم تغيير عنوان قائمة التنقل وكيفية إيقافه:

يطبق WordPress مرشح the_title مرتين على عنوان عناصر قائمة التنقل (إذا كانت عناصر القائمة تتوافق مع المنشورات أو الصفحات الموجودة).

  1. أولاً كنشر الصفحة أو عنوان المقابلة. يحدث هذا في وظيفة wp_setup_nav_menu_item() لملف wp-includes/nav-menu.php.

  2. ثم كعنوان عنصر القائمة نفسها. يحدث هذا في فئة Walker_Nav_Menu.

لمتطلباتكم ، نحتاج إلى إيقاف مرشح the_title في المرتين.

لحسن الحظ ، يحتوي WordPress على مرشحين: حرائق pre_wp_nav_menu قبل تصفية عناوين القائمة وحرائق wp_nav_menu_items بعد تصفية عناوين القائمة. لذلك يمكننا استخدام هذين المرشحين لإزالة عامل التصفية the_title أولاً لعناوين عنصر قائمة التنقل ثم إضافة عامل التصفية the_title مرة أخرى للعناوين الأخرى.

الشفرة

يمكنك استخدام الكود التالي في ملف السمة functions.php أو كمكون إضافي منفصل:

function wpse309151_title_update( $title, $id = null ) {
    if ( ! is_admin() && ! is_null( $id ) ) {
        $post = get_post( $id );
        if ( $post instanceof WP_Post && ( $post->post_type == 'post' || $post->post_type == 'page' ) ) {
            $new_titile = get_post_meta( $id, 'pp_new_title', true );
            if( ! empty( $new_titile ) ) {
                return $new_titile;
            }
        }
    }
    return $title;
}
add_filter( 'the_title', 'wpse309151_title_update', 10, 2 );

function wpse309151_remove_title_filter_nav_menu( $nav_menu, $args ) {
    // we are working with menu, so remove the title filter
    remove_filter( 'the_title', 'wpse309151_title_update', 10, 2 );
    return $nav_menu;
}
// this filter fires just before the nav menu item creation process
add_filter( 'pre_wp_nav_menu', 'wpse309151_remove_title_filter_nav_menu', 10, 2 );

function wpse309151_add_title_filter_non_menu( $items, $args ) {
    // we are done working with menu, so add the title filter back
    add_filter( 'the_title', 'wpse309151_title_update', 10, 2 );
    return $items;
}
// this filter fires after nav menu item creation is done
add_filter( 'wp_nav_menu_items', 'wpse309151_add_title_filter_non_menu', 10, 2 );
11
Fayaz

محرر التنقل في WordPress لديه القدرة على تغيير عنوان القائمة بغض النظر عن عنوان المنشور/الصفحة.

إذا كنت بحاجة إلى المزيد من رمز الحل التلقائي أدناه ، فستحل محل عنوان المنشور/الصفحة في كل مكان باستخدام عامل التصفية the_title ولكن استعادة العنوان الافتراضي لعنصر القائمة باستخدام عامل التصفية nav_menu_item_title.

/**
 * Replace post/page title on home, single and archive pages.
 *
 * @param string $title   Post title
 * @param int    $post_id Post ID
 *
 * @return string New post tilte
 */
function wpse_309151_get_replace_default_title_from_meta( $title, $post_id ) {

    $post_type = get_post_type( $post_id );

    if( !is_admin() && ( $post_type === 'post' || $post_type === 'page' ) ) {

        $new_title = get_post_meta( $post_id, 'wpse_309151_post_title', true);

        if( $new_title && !empty( $new_title ) ) {
            return $new_title;
        }
    }

    return $title;
}

add_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

/**
 * Restore default post/page title in navigation
 *
 * @param string   $title The menu item's title.
 * @param WP_Post  $item  The current menu item.
 * @param stdClass $args  An object of wp_nav_menu() arguments.
 * @param int      $depth Depth of menu item. Used for padding.
 *
 * @return string Restored post title
 */
function wpse_309151_get_restore_default_title_for_navigation( $title, $item, $args, $depth ) {

    // Remove filter to not affect title
    remove_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

    $post_id = $item->object_id;
    $title   = get_the_title( $post_id );

    // Add the title filter back
    add_filter( 'the_title', 'wpse_309151_get_replace_default_title_from_meta', 10, 2 );

    return $title;
}

add_filter( 'nav_menu_item_title', 'wpse_309151_get_restore_default_title_for_navigation', 10, 4 );
3
kierzniak