วิธีเพิ่มลิงก์ที่กำหนดเองไปยังเมนูด้วย URL ที่สัมพันธ์กับ URL บล็อก


16

ส่วนหนึ่งของงานของฉันคือการสร้างเว็บไซต์ Wordpress ฉันมักจะทำงานบนแล็ปท็อปของฉันจนกว่าฉันจะมีสิ่งที่ดีพอที่จะอัปโหลดไปยังเซิร์ฟเวอร์ทดสอบที่ลูกค้าทำการตรวจสอบ

ฉันจะสร้าง VirtualHost สำหรับโครงการใหม่ทุกดังนั้นฉันมักจะทำงานร่วมกับการติดตั้ง Wordpress ในโดเมนที่มีลักษณะเช่นhttp://local.example.com/แต่เมื่อเว็บไซต์ที่มีการอัปโหลดไปยังเซิร์ฟเวอร์ทดสอบ (ไม่ได้ถูกควบคุมโดยฉัน) http://testserver.com/arbitrary/path/example/โดเมนอาจจะเป็นสิ่งที่ชอบ

ปัญหาคือถ้าฉันเพิ่มลิงค์ที่กำหนดเองไปยังเมนูที่ชี้ไปเช่น/events/มันจะทำงานได้ดีในการสร้างลิงค์ไปยังhttp://local.example.com/events/แต่ในเซิร์ฟเวอร์ทดสอบลิงก์จะชี้ไปhttp://testserver/events/ที่ซึ่งเห็นได้ชัดว่าไม่ถูกต้อง
สิ่งที่ฉันต้องการคือการให้ลิงค์ URL ที่กำหนดเองซึ่งจะทำงานทั้งในสภาพแวดล้อมท้องถิ่นและเซิร์ฟเวอร์ทดสอบ

ฉันจัดการกับปัญหาของการเปลี่ยนตัวเลือกhomeและsiteurlWordpress แล้วโดย:

  • เปลี่ยนการตั้งค่าเหล่านั้นในฐานข้อมูลท้องถิ่น
  • สร้างดัมพ์ของฐานข้อมูล
  • อัพเดตฐานข้อมูลบนเซิร์ฟเวอร์
  • กู้คืนตัวเลือกในท้องถิ่น

ฉันไม่ต้องการใช้ URL แบบเต็มสำหรับลิงก์ที่กำหนดเองและต้องแทนที่ URL ด้วยเซิร์ฟเวอร์ทุกครั้งที่ฉันต้องอัปเดตฐานข้อมูลของเซิร์ฟเวอร์

สำหรับลิงก์ภายในเนื้อหาโพสต์มีปลั๊กอินที่ช่วยแก้ปัญหาการเพิ่มรหัสย่อสองรายการคือ: http://wordpress.org/extend/plugins/url-shortcodes/แต่ฉันไม่สามารถหาสิ่งที่คล้ายกับลิงก์ที่กำหนดเองได้ .


5
Willington ฉันไม่สามารถช่วยคุณไปยัง URL ที่ใช้งานได้ทุกที่ ฉันจะทำอะไรที่เป็นจุดให้คุณspectacu.la/search-and-replace-for-wordpress-databases ฉันใช้การค้นหาและแทนที่ของ David มาระยะหนึ่งแล้วและฉันก็ทำงานได้ดีในการเปลี่ยนแปลงเช่น url's แม้ว่าจะเป็นข้อมูลที่ต่อเนื่องกันก็ตาม นั่นคือวิธีที่ฉันทำ: เพียงแค่เชื่อมโยงฮาร์ดโค้ดและแปลงหลังจากย้ายฐานข้อมูลไปยังโดเมนอื่น ขอให้โชคดีปีเตอร์
ปีเตอร์

จนถึงวิธีเดียวที่ฉันได้พบว่าการย้ายจากสภาพแวดล้อม dev ไปเป็นสภาพแวดล้อมที่ประสบความสำเร็จคือหลังจากทำการถ่ายโอนข้อมูล SQL เพื่อทำการค้นหาและแทนที่ไฟล์ทั้งหมดไม่ใช่แค่เปลี่ยนตัวเลือก home และ siteurl ฉันมีไฟล์ที่มี URL อยู่ในนั้นมากกว่า 1,000 ครั้ง (ยังไม่รู้ว่ามันจะจัดการได้อย่างไรเพื่อให้ได้คะแนนนั้นสูง :))
Rob Williams

@ Peter, @Rob ขอบคุณพวกคุณสำหรับการตอบกลับฉันกลัวว่า search-and-replace เป็นคำตอบเดียว แต่ต้องการถามก่อน ฉันจะดูสคริปต์นั้น
Willington Vega

ดีที่สุดคือการใช้สคริปต์เหมือนที่ฉันแนะนำ ขอให้สังเกตว่าการค้นหาข้อความ & แทนที่ในฐานข้อมูล db จะทำให้เสียข้อมูลแบบอนุกรม (โดยเฉพาะอย่างยิ่งที่พบใน wp_options) ถ้าและเมื่อความยาวของการค้นหาและแทนที่สตริงไม่เหมือนกันเนื่องจากข้อมูลนั้นถูกเก็บไว้ใน db ด้วยข้อกำหนดความยาว . สำเร็จปีเตอร์
ปีเตอร์

คำตอบ:


9

ฉันก็กำลังมองหาวิธีแก้ปัญหาสำหรับเรื่องนี้และฉันก็พบวิธีง่ายๆ

นี่คือสิ่งที่คุณต้องใส่ลงในช่อง URL:

/index.php/internal-site-name

ป้อนคำอธิบายรูปภาพที่นี่

มันใช้งานได้ดี!

ขอแสดงความนับถือคริส


1
มันใช้งานได้ แต่มันเปลี่ยน url เพื่อรวม index.php ในกรณีของแอปพลิเคชันหน้าเดียวที่มีลิงก์ # อันดับแรกมันจะรีเฟรชหน้าเว็บก่อนจากนั้นนำคุณไปยังปลายทาง (เฉพาะครั้งแรกเท่านั้น) ถึงกระนั้นความคิดที่ดี
Catalin Deaconescu

ฉันใช้ / บางอย่างโดยไม่มีส่วน index.php และดูเหมือนว่าจะใช้งานได้
user3808307

4

คุณสามารถใช้nav_menu_link_attributesตัวกรองเพื่อตรวจสอบและแก้ไขแอตทริบิวต์ href สำหรับแต่ละรายการเมนูก่อนที่จะส่งออก

ในตัวอย่างนี้เรามองหาแอตทริบิวต์ href ใด ๆ ที่ขึ้นต้นด้วย a /และเติม URL ของไซต์ทดสอบในกรณีนั้น:

function wpd_nav_menu_link_atts( $atts, $item, $args, $depth ){
    if( '/' == substr( $atts['href'], 0, 1 ) ){
        $atts['href'] = 'http://testserver.com/example' . $atts['href'];
    }
    return $atts;
}
add_filter( 'nav_menu_link_attributes', 'wpd_nav_menu_link_atts', 20, 4 );

คุณสามารถสร้างปลั๊กอินง่าย ๆ ด้วยรหัสนี้และเปิดใช้งานได้เฉพาะบนเซิร์ฟเวอร์ทดสอบของคุณหรือสร้างการตั้งค่าสถานะบางอย่างที่ใช้ตัวกรองนี้แบบมีเงื่อนไขเมื่อมีสภาพแวดล้อมของไซต์ทดสอบ


นั่นเป็นวิธีที่ดีที่สุดที่ฉันพบ! แต่โปรด @Milo เปลี่ยนบรรทัดที่สามด้วย url wordpress base ที่ชาญฉลาดนี้ (รับเป็น site_url ของ wordpress): $ atts ['href'] = site_url () $ ATTS [ 'href'];
gtamborero

2

การใช้<base href=" ">แท็กใน meta ส่วนหัวจะให้ URL พื้นฐานแก่แองเคอร์ญาติทั้งหมดในหน้า

การอ้างอิง:
https://www.w3.org/TR/html4/struct/links.html
12.4 ข้อมูลเส้นทาง: องค์ประกอบ BASE

ลิงก์ที่กำหนดเองแบบสัมพันธ์ใน wordpress:
หากคุณต้องการให้ url ของเว็บไซต์เป็น url พื้นฐานของจุดยึดทั้งหมดให้เพิ่มเข้าไปในtheme / header.phpภายใน<head>:

<base href="<?php echo site_url(); ?>/">

ฉันรู้ว่าอาจมาสายสำหรับคุณ แต่สามารถช่วยเหลือคนอื่นได้


ดูมีแนวโน้ม ฉันจะทดสอบและรายงานกลับ
Eric Hepperle - CodeSlayer2010

ไม่ทำงานกับพา ธ เช่นehepperle.com/sites/in-progress/some-wp-site-root/ถ้าคุณตั้งค่ารูทไซต์อย่างชัดเจน ความเร็วในการพัฒนาเว็บไม่ได้รับการปรับปรุงอย่างเห็นได้ชัดโดยใช้baseแท็กเนื่องจากเมื่อคุณย้ายไปยังเว็บไซต์อื่นคุณจะต้องกำหนดฐานใหม่อีกครั้ง อย่างไรก็ตามฉันสามารถดูค่าในการลดความยาวของค่า href
Eric Hepperle - CodeSlayer2010

ความคิดนั้นดี แต่ดูเหมือนว่า Wordpress จะไม่สนใจพา ธ ฐานเมื่อใช้พา ธ สัมพัทธ์บนเมนูกำหนดเองของ wp (ตัวอย่างเช่น: / contact)
gtamborero

1

ใน URL ที่กำหนดเองในการตั้งค่าเมนูคุณสามารถใช้ลิงก์ที่เกี่ยวข้องกับ [blogurl] ความลับคือการเริ่มต้น URL /ที่เกี่ยวข้องมีเพียงหนึ่งเดียว เมื่อหนึ่ง / เริ่ม URL ที่กำหนดเองระบบจะไม่เติมเงินทั่วไปhttp://และจากนั้นบล็อกปัจจุบันจะถูกสร้างขึ้นใน URL เป้าหมายในเวลาดำเนินการ

ตัวอย่าง
หากคุณต้องการไปที่หน้าแรกของคุณเพียงแค่ใส่/เป็น URL ที่กำหนดเอง

หากคุณต้องการไปที่หน้าดัชนีในโฟลเดอร์bbforumsให้ใส่/bbforumsเป็น URL ที่กำหนดเอง

สิ่งนี้ช่วยให้คุณสามารถย้ายเว็บไซต์ไปยังโดเมนทดสอบโดยไม่ต้องเขียนโค้ดใหม่ของ URLURL ในลิงก์ที่กำหนดเองทั้งหมดสำหรับเมนู

ตัวอย่างเช่น:
ถ้าบล็อกของฉันคือhttp://example.comและฉันต้องการทดสอบในโดเมนย่อยhttp://test.example.comไซต์สามารถย้ายระหว่างการทดสอบและการผลิตโดยไม่มีปัญหาเมนูโดยใช้ระเบียบ URL สัมพัทธ์ที่ระบุไว้ข้างต้น ฉันได้ทดสอบวิธีการนี้สำเร็จโดยใช้ปลั๊กอิน XCloner เพื่อย้ายเว็บไซต์


6
นี้ไม่ทำงานสำหรับ URL บล็อกที่มีเครื่องหมายทับเช่นexample.com/blog ต่อไปนี้รายการเมนู '/' ก็จะนำคุณไปยังexample.com
Jimpanzee

1

ก่อนอื่นคุณต้องติดตั้งปลั๊กอินนี้สำหรับรหัสย่อของ URL

เพิ่มรหัสนี้ไปยังfunctions.phpไฟล์ของคุณในรูปแบบของคุณ:

class description_walker extends Walker_Nav_Menu {
    function start_el( &$output, $item, $depth, $args ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
        $class_names = ' class="'. esc_attr( $class_names ) . '"';

        $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) . '"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) . '"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) . '"' : '';

        // echo $item->url;
        $string = explode( '::', $item->url, 3 );
        if ( $string[1] ) {
            $string[1] = str_replace( '-', ' ', $string[1] );
            $item->url = do_shortcode( "[$string[1]]" ); 
        }

        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $prepend = '<strong>';
        $append = '</strong>';
        $description  = ! empty( $item->description ) ? '<span>' . esc_attr( $item->description ) . '</span>' : '';

        if ( $depth != 0 ) {
            $description = $append = $prepend = "";
        }

        $item_output  = $args->before;
        $item_output .= '<a'. $attributes . '>';
        $item_output .= $args->link_before . $prepend . apply_filters( 'the_title', $item->title, $item->ID ) . $append;
        $item_output .= $description . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    } 
}

จากนั้นคุณต้องเรียกใช้wp_nav_menuฟังก์ชันจากไฟล์เทมเพลต:

$arg = array( 
    'menu'        => "main-menu", 
    'echo'        => true, 
    'fallback_cb' => 'wp_page_menu', 
    'depth'       => 0, 
    'walker'      => new description_walker() 
); 
wp_nav_menu( $arg );

แค่นั้นแหละ. จากนั้นไปที่ส่วนเมนูด้านหลัง

ตัวอย่างเช่นหากฉันต้องการให้ URL ของหน้าแก่ลิงก์ที่กำหนดเองฉันจะเพิ่มเช่นนี้:

http://::blogurl-id='1302'::

ตอนนี้คุณสามารถไปที่ส่วนหน้าและตรวจสอบว่ารหัสย่อทำงานได้หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.