Cách thêm Liên kết tùy chỉnh vào Menu có URL liên quan đến URL blog


16

Một phần công việc của tôi là tạo các trang web Wordpress. Tôi thường làm việc trên máy tính xách tay của mình cho đến khi tôi có một cái gì đó đủ tốt để được tải lên máy chủ thử nghiệm nơi khách hàng xem xét nó.

Tôi tạo Virtualhost cho mọi dự án mới vì vậy tôi luôn làm việc với cài đặt Wordpress trong một miền trông giống như vậy http://local.example.com/, nhưng khi trang web được tải lên máy chủ thử nghiệm (không phải do tôi kiểm soát), tên miền có thể kết thúc giống như vậy http://testserver.com/arbitrary/path/example/.

Vấn đề là nếu tôi thêm một liên kết tùy chỉnh vào một menu, ví dụ, /events/nó sẽ hoạt động tốt khi tạo một liên kết cục bộ http://local.example.com/events/, nhưng trong máy chủ thử nghiệm, liên kết sẽ trỏ đến http://testserver/events/, điều này rõ ràng là không đúng.
Những gì tôi muốn là cung cấp cho liên kết tùy chỉnh một URL sẽ hoạt động cả trên môi trường cục bộ của tôi và máy chủ thử nghiệm.

Tôi đã xử lý vấn đề thay đổi tùy chọn homesiteurlWordpress bằng cách:

  • thay đổi các cài đặt trên cơ sở dữ liệu cục bộ
  • tạo một bãi chứa cơ sở dữ liệu
  • cập nhật cơ sở dữ liệu trên máy chủ
  • Khôi phục các tùy chọn địa phương.

Tôi không muốn sử dụng URL đầy đủ cho các liên kết tùy chỉnh và phải thay thế các URL bằng URL máy chủ mỗi khi tôi cần cập nhật cơ sở dữ liệu của máy chủ.

Đối với các liên kết bên trong nội dung bài đăng, có một plugin giải quyết vấn đề khi thêm hai mã ngắn: http://wordpress.org/extend/plugins/url-shortcodes/ , nhưng tôi chưa thể tìm thấy thứ gì đó tương tự cho Liên kết tùy chỉnh .


5
Willington, tôi không thể giúp bạn một url hoạt động ở bất cứ đâu. Những gì tôi có thể làm là chỉ cho bạn đến Spectacu.la/search-and-replace-for-wordpress-database . Tôi đã sử dụng tìm kiếm & thay thế của David trong một thời gian và tôi làm việc tốt để thay đổi, ví dụ như url - ngay cả khi trong dữ liệu được tuần tự hóa. Vì vậy, đó là cách tôi làm điều đó: chỉ cần liên kết được mã hóa cứng và chuyển đổi sau khi di chuyển cơ sở dữ liệu sang tên miền khác. Chúc may mắn, Peter
Peter

Cho đến nay, cách duy nhất mà tôi tìm thấy để chuyển thành công từ môi trường dev sang môi trường sống là sau khi thực hiện kết xuất SQL để thực hiện tìm kiếm và thay thế trên toàn bộ tệp, không chỉ thay đổi tùy chọn trang chủ và trang web. Tôi đã có các tệp có URL trong đó hơn 1000 lần. (vẫn không biết làm thế nào nó đạt được mức cao như vậy :))
Rob Williams

@Peter, @Rob cảm ơn các bạn đã trả lời, tôi sợ rằng tìm kiếm và thay thế là giải pháp duy nhất nhưng muốn hỏi trước. Tôi sẽ xem kịch bản đó.
Willington Vega

Tốt nhất là sử dụng một kịch bản như kịch bản mà tôi đề xuất. Lưu ý rằng tìm kiếm và thay thế văn bản trong kết xuất db sẽ làm hỏng dữ liệu tuần tự (đặc biệt được tìm thấy trong wp_options) nếu và khi độ dài của chuỗi tìm kiếm và thay thế không giống nhau, vì dữ liệu đó được lưu trữ trong db với thông số độ dài . Thành công, Peter
Peter

Câu trả lời:


9

Tôi cũng đang tìm kiếm một giải pháp cho việc này và tôi đã tìm thấy một giải pháp đơn giản.

Đây là những gì bạn cần đặt vào trường URL:

/index.php/internal-site-name

nhập mô tả hình ảnh ở đây

Nó hoạt động tốt!

Trân trọng Chris


Điều này hoạt động nhưng nó cũng thay đổi url để bao gồm index.php. Trong trường hợp ứng dụng một trang có # liên kết, trước tiên, nó sẽ làm mới trang và sau đó đưa bạn đến đích (chỉ lần đầu tiên). Mặc dù vậy, một ý tưởng hay
Catalin Deaconescu

Tôi đã sử dụng / một cái gì đó mà không có phần index.php và dường như hoạt động
3808307

4

Bạn có thể sử dụng nav_menu_link_attributesbộ lọc để kiểm tra và sửa đổi thuộc tính href cho từng mục menu trước khi xuất.

Trong ví dụ này, chúng tôi tìm kiếm bất kỳ thuộc tính nào bắt đầu bằng a /và thêm URL trang web thử nghiệm trong trường hợp đó:

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 );

Bạn có thể tạo một plugin đơn giản với mã này và chỉ kích hoạt nó trên máy chủ thử nghiệm của bạn hoặc tạo một loại cờ nào đó áp dụng có điều kiện bộ lọc này khi có môi trường trang web thử nghiệm.


Đó là cách tốt nhất tôi tìm thấy! Nhưng vui lòng @Milo, thay đổi dòng thứ ba bằng url cơ sở wordpress thông minh hơn này (lấy trang web_url của wordpress): $ atts ['href'] = site_url (). $ atts ['href'];
gtamborero

2

Sử dụng <base href=" ">thẻ trong meta head sẽ cung cấp một url cơ sở cho tất cả các neo tương đối trong trang.

Tham khảo:
https://www.w3.org/TR/html4/struct/links.html
12.4 Thông tin đường dẫn: phần tử BASE

Liên kết tùy chỉnh tương đối trong wordpress:
Nếu bạn muốn url trang web là url cơ sở của tất cả các neo, hãy thêm liên kết này vào theme / header.php trong <head>:

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

tôi biết có thể là muộn cho bạn nhưng có thể giúp đỡ người khác.


Trông đầy hứa hẹn. Tôi sẽ kiểm tra và báo cáo lại.
Eric Hepperle - CodeSlayer2010

Không hoạt động với các đường dẫn như ehepperle.com/sites/in-progress/some-wp-site-root/trừ khi bạn đặt gốc trang web một cách rõ ràng. Tốc độ phát triển web không được cải thiện đáng kể bằng cách sử dụng basethẻ, vì khi bạn di chuyển sang một trang web khác, bạn sẽ phải xác định lại cơ sở là gì. Tuy nhiên, tôi có thể thấy giá trị trong việc giảm độ dài của giá trị href.
Eric Hepperle - CodeSlayer2010

Ý tưởng là tốt nhưng dường như Wordpress bỏ qua đường dẫn Cơ sở khi sử dụng các đường dẫn tương đối trên các menu tùy chỉnh wp (ví dụ: / contact)
gtamborero

1

Trên một URL tùy chỉnh trong thiết lập Menu, có thể sử dụng các liên kết tương đối đến [blogurl]. Bí mật là bắt đầu URL tương đối bằng một /. Khi một URL duy nhất / bắt đầu URL tùy chỉnh, hệ thống sẽ không thêm vào thông thường http://và sau đó blogURL hiện tại sẽ được tạo trong URL mục tiêu tại thời điểm thực hiện.

VÍ DỤ
Nếu bạn muốn truy cập trang chủ của mình, chỉ cần đặt /làm URL tùy chỉnh

Nếu bạn muốn đi đến trang chỉ mục trong thư mục bbforumsthì đặt /bbforumslàm URL tùy chỉnh.

Điều này cho phép bạn di chuyển một trang web đến một miền thử nghiệm mà không phải mã cứng blogURL mới trong tất cả các liên kết tùy chỉnh cho các menu.

Ví dụ:
Nếu blog của tôi http://example.comvà tôi muốn kiểm tra nó trong một tên miền phụ http://test.example.com, trang web có thể được di chuyển giữa thử nghiệm và sản xuất mà không gặp sự cố menu bằng cách sử dụng quy ước URL tương đối được ghi chú ở trên. Tôi đã thử nghiệm thành công phương pháp này bằng cách sử dụng plugin XCloner để di chuyển trang web.


5
Điều này không hoạt động đối với các URL blog có dấu gạch chéo, ví dụ: ví dụ.com / blog . Theo dõi mục menu '/' sẽ đưa bạn đến example.com .
Jimpanzee

1

Trước tiên, bạn phải cài đặt plugin này cho mã ngắn URL.

Thêm mã này vào functions.phptệp của bạn trong chủ đề của bạn:

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 );
    } 
}

Sau đó, bạn phải gọi wp_nav_menuhàm từ các tệp mẫu:

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

Đó là nó. Sau đó đi đến phần menu phía sau.

Ví dụ: nếu tôi muốn cung cấp URL trang cho một liên kết tùy chỉnh, tôi sẽ thêm nó như thế này:

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

Bây giờ bạn có thể đi đến front-end và kiểm tra xem shortcode có hoạt động không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.