ブログのURLに関連するURLを使用してカスタムリンクをメニューに追加する方法


16

私の仕事の一部は、Wordpress Webサイトを作成することです。私は通常、クライアントがレビューするテストサーバーにアップロードするのに十分なものができるまで、ラップトップで作業します。

新しいプロジェクトごとにVirtualHostを作成するので、常に次のようなドメインのWordpressインストールで作業していますhttp://local.example.com/が、サイトがテストサーバー(自分で制御されていない)にアップロードされると、ドメインは次のようになりhttp://testserver.com/arbitrary/path/example/ます。

問題は、たとえばを指すメニューにカスタムリンクを追加すると、/events/ローカルにリンクを作成して正常に機能するhttp://local.example.com/events/が、テストサーバーではリンクがを指すためhttp://testserver/events/、明らかに正しくないことです。
必要なのは、ローカルリンクとテストサーバーの両方で機能するURLをカスタムリンクに指定することです。

私はすでに変更の問題対処homesiteurlによってWordpressのオプション:

  • ローカルデータベースでこれらの設定を変更する
  • データベースのダンプを作成する
  • サーバー上のデータベースを更新する
  • ローカルオプションを復元します。

カスタムリンクに完全なURLを使用したくないので、サーバーのデータベースを更新する必要があるたびにそれらをサーバーのURLに置き換える必要があります。

投稿コンテンツ内のリンクには、2つのショートコードを追加する問題を解決するプラグインがあります:http ://wordpress.org/extend/plugins/url-shortcodes/ 、しかし、カスタムリンクに似たものを見つけることができませんでした。


5
ウィリントン、私はどこでも動作するURLにあなたを助けることはできません。私ができることはspectacu.la/search-and-replace-for-wordpress-databasesを指すことです。私はかなり長い間Davidのsearch&replaceを使用してきました。たとえば、シリアル化されたデータであっても、たとえばurlを変更するとうまくいきます。だからそれは私がそれを行う方法です:データベースを別のドメインに移動した後、リンクをハードコーディングして変換するだけです 幸運、ピーター
ピーター

これまでのところ、開発環境からライブ環境に正常に移動できることがわかった唯一の方法は、SQLダンプを実行して、homeオプションとsiteurlオプションを変更するだけでなく、ファイル全体を検索して置換することです。URLが1000回以上あったファイルがありました。(それがどうしてそんなに高くなったかわからない:))
ロブウィリアムズ

@ Peter、@ Rob、回答ありがとうございます。検索と置換が唯一の解決策ではないかと心配しましたが、最初に質問したかったのです。そのスクリプトを見てみましょう。
ウィリントンベガ

ベストは、私が提案したようなスクリプトを使用することです。検索および置換文字列の長さが同じではない場合、dbダンプでのテキスト検索および置換はシリアル化されたデータ(特にwp_optionsで見つかる)を台無しにすることに注意してください。 。成功、ピーター
ピーター

回答:


9

私はこれに対する解決策も探していましたが、簡単な解決策を見つけました。

これは、URLフィールドに配置する必要があるものです。

/index.php/internal-site-name

ここに画像の説明を入力してください

それはうまく機能します!

よろしくクリス


これは機能しますが、index.phpを含むようにURLも変更します。#リンクのある単一ページアプリケーションの場合、最初にページを更新し、次に目的地に移動します(初回のみ)。それでも、良いアイデア
カタリンDeaconescu

私はindex.phpの一部せずに/何かを使用して動作するようです
user3808307

4

nav_menu_link_attributesフィルターを使用して、出力される前に各メニュー項目のhref属性を検査および変更できます。

この例では、で始まるhref属性を探し/、その場合はテストサイトの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の3番目の行を、このよりスマートなワードプレスのベースURL(wordpressのsite_urlを取得)で変更してください:$ atts ['href'] = site_url()。$ atts ['href'];
グタンボレロ

2

ヘッドメタで<base href=" ">タグを使用すると、ページ内のすべての相対アンカーにベース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(); ?>/">

私はあなたに遅れる可能性があることを知っていますが、他の誰かを助けることができます。


有望に見えます。テストして報告します。
エリックヘッペルレ-CodeSlayer2010

ehepperle.com/sites/in-progress/some-wp-site-root/サイトのルートを明示的に設定しない限り、パスでは機能しません。baseタグを使用しても、Web開発の速度はそれほど向上しません。これは、別のサイトに移行するときに、ベースを再定義する必要があるためです。ただし、href値の長さを減らすことで、この値を確認できます。
エリックヘッペルレ-CodeSlayer2010

アイデアは良好であるが、ワードプレスは、ベースWPカスタムメニューの相対パスを使用してパス無視すると思われる(例えば:/接触)
gtamborero

1

メニュー設定のカスタムURLでは、[blogurl]への相対リンクを使用できます。秘密は、単一の/。で相対URLを開始することです。単一の/がカスタムURLを開始すると、システムは通常のhttp://URLを付加せず、実行時にターゲットURLに現在のblogURLが生成されます。


ホームページにアクセスする場合は、単に/カスタムURLとして入力します

フォルダー内のインデックスページに移動する場合は、カスタムURLとしてbbforums配置/bbforumsします。

これにより、メニューのすべてのカスタムリンクに新しいblogURLをハードコーディングすることなく、サイトをテストドメインに移動できます。

例:
私のブログがhttp://example.comサブドメインでテストする場合、http://test.example.com上記の相対URL規則を使用して、メニューの問題なしにテストと実稼働の間でサイトを移動できます。XClonerプラグインを使用してサイトを移動して、このアプローチを正常にテストしました。


5
これは、たとえばexample.com/blogのようなスラッシュのあるブログURLでは機能しません。メニュー項目「/」をたどると、example.comに移動ます
ジンパンジー14年

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.