web-dev-qa-db-ja.com

JSスクリプトなどのリソースに使用するリンクパスを取得するにはどうすればよいですか?

plugin_dir_pathと同等のものを返す関数はありますが、プラグイン/テーマに依存しませんか? JSスクリプトはリソースとしてキューに入れる必要があるため、/var/www/html/wordpress/thing/thing2/script.jsなどのサーバー上のパスを含めることはできません。http://www.example.com/thing/thing2/script.jsに対応する必要があります。

2
Daniel Smith

@butlerblogの答えは機能しますが、私はそれが不必要に複雑であると思います。私は上と下をチェックしました、site_urlは常に現在のサイトのリンクを提供し、スキーマがhttpであるかhttpsであるかどうかに関係なく解決するため、問題はありません。

私はよりシンプルで理解しやすい関数を書きました:

/**
 * Retrieves the full front-facing URL for a given path. In other words, it transforms an absolute path
 * into an URI.
 *
 * Note: when allowing direct access to your files, if there is any I/O (there shouldn't be, but, you know) operations,
 * you must check whether or not ABSPATH is defined.
 *
 * @see https://stackoverflow.com/a/44857254/12297763
 *
 * @param string $from An absolute path. You can just call this function with the parameter __FILE__ and it will give you a front-facing URI for that file.
 * @param boolean $strict Flag that the function uses to see if it needs to do additional checks.
 *
 * @return string|false Returns a string in the form of an URI if all checks were passed or False if checks failed.
 */
function getURIFromPath( $from, $strict = False )
{
    if( $strict ) {
        if( !\file_exists( $from ) ) {
            return False;
        }
    }

    $abspath = untrailingslashit( ABSPATH ) ;

    $directory = dirname( $from );

    return str_replace( "//", "\\", site_url() . str_replace( $abspath, '',  $directory ) );
}

名前を付ける理由URI...は、PHPファイルを含めるためにリンクを作成することはありません。これは、コードをパッケージとして配布する場合に使用され、フレームワークの/メインプラグインの定数に依存することはできません。つまり、パッケージのインストールパスがわからない場合は、これを使用します。CSSと同様に機能します../(常に相対)。

1
Daniel Smith

これは、これを行うためのちょっとした方法です。しかし、残念ながら、両方を実行するWP関数はありません(テーマおよび/またはプラグイン)。これは、どちらか一方または両方の命題にすぎません。

表面的には、難しいことではないと思います。パスを取得して、サイトのURLなどと比較するだけです。しかし、WPがルート以外の場所(ディレクトリなど)にインストールされている場合)で問題が発生します。

関数の私のセットアップを見ると、「else」条件は単純です。 WPが常にルートにある場合、それで十分です。他のすべてのことは、他の可能性を処理するために行われます(WPはディレクトリ-以下)。

その場合、サイトのURLを分解して、ルートドメイン(3より大きい配列)だけではないかどうかを判断します。その場合、explode()プロセスから取得したURLの一部をループします。配列の最初の3つの要素はドメインのルート( https://example.com )であるため、スキップできます。次に、パスを作成します(下にあるディレクトリが1つだけではない場合)。

これを使用すると、ルートURLの下のすべてが取り除かれ、使用できるクリーンなURLだけが取得されます。次に、ファイルへのパスを追加します。

function my_get_file_url_path() {

    // Account for WP being installed in a directory.
    $path_info = '';
    $site_url  = site_url();
    $url_parts = explode( '/', $site_url );

    if ( array_count_values( $url_parts ) > 3 ) {
        $x = 0;
        foreach ( $url_parts as $this_part ) {
            if ( $x > 2 ) {
                $path_info = $this_part . '/';
            }
            $x++;
        }

        $site_actual_url = str_replace( $path_info, '', trailingslashit( $site_url ) );

        return $site_actual_url . trim( str_replace( $_SERVER['DOCUMENT_ROOT'], '', __DIR__ ), '/' );

    } else {
        return str_replace( $_SERVER['DOCUMENT_ROOT'], $site_url, __DIR__ );
    }
}
1
butlerblog