0

WordPress インストール内のデータから vcard を作成しようとしています (WP の部分は重要ではないと想定しています)。私は次のような URL パラメーターを使用してファイルを呼び出して/inc/vcard.php?vcard=664おり、これまでのところ次のコードがあります。

<?php ob_start();

define( 'WP_USE_THEMES', false );
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-blog-header.php' );

/**
 * Loads the WordPress environment and template.
 *
 * @package WordPress
 */
if ( !isset($wp_did_header) ) {
    $wp_did_header = true;
    require_once( dirname(__FILE__) . '/wp-load.php' );
    wp();
    require_once( ABSPATH . WPINC . '/template-loader.php' );
}

if (isset($_GET['vcard'])) {
    $attorney_id = $_GET['vcard'];

    $post = get_post($attorney_id);
    $slug = $post->post_name;

    if (!$post || get_post_type() !== 'attorneys') {
        echo 'Invalid attorney';
        return;
    }

    function field_check($field) {
        echo get_field($field) ? get_field($field) : '';
    }

    ?>

    BEGIN:VCARD
    VERSION:3.0
    REV:<?php echo get_the_date(); ?>
    FN:<?php field_check('first_name'); ?> <?php field_check('middle_initial'); ?> <?php field_check('last_name'); ?>
    N:<?php field_check('last_name'); ?>;<?php field_check('first_name'); ?> <?php field_check('middle_initial'); ?>

    TITLE:<?php field_check('position'); ?>

    ORG: Odin, Feldman &amp; Pittleman P.C.

    ADR;WORK:;;1775 Wiehle Avenue, Suite 400;Reston;Virginia;20190;United States of America

    URL:<?php field_check('blog_url'); ?>

    TEL;TYPE=WORK;VOICE:<?php field_check('phone_number'); ?>

    TEL;TYPE=WORK;Fax:<?php field_check('fax_number'); ?>

    EMAIL;TYPE=internet,pref:<?php field_check('email'); ?>

    URL;TYPE=WORK:<?php the_permalink(); ?>

    TZ:-0400
    END:VCARD

    <?php header('Content-Type: text/x-vcard; charset=utf-8');header('Content-Disposition: attachment; filename="' . $slug . '.vcf"'); exit();
}
else {
    echo 'Invalid input.';
}
$output = ob_get_contents();
ob_end_clean();
echo $output;

しかし、出力バッファリングが正しく機能していないか、2 つ (ヘッダーと出力バッファリング) を一緒に使用する方法をまだ接続していないようです。どんな助けでも大歓迎です。ありがとう!

簡単に言うと、私はこの関数を WordPress の外で呼び出しているので、出力バッファの開始後に WordPress を「インクルード」しています。

アップデート

両方の提案 (ヘッダーをバッファーの外側に設定し、ヘッダーをexit();一番下に移動) の後、違いはありません:

<?php ob_start();

define( 'WP_USE_THEMES', false );
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-blog-header.php' );

/**
 * Loads the WordPress environment and template.
 *
 * @package WordPress
 */
if ( !isset($wp_did_header) ) {
    $wp_did_header = true;
    require_once( dirname(__FILE__) . '/wp-load.php' );
    wp();
    require_once( ABSPATH . WPINC . '/template-loader.php' );
}

if (isset($_GET['vcard'])) {
    $attorney_id = $_GET['vcard'];

    $post = get_post($attorney_id);
    $slug = $post->post_name;

    if (!$post || get_post_type() !== 'attorneys') {
        echo 'Invalid attorney';
        return;
    }

    function field_check($field) {
        echo get_field($field) ? get_field($field) : '';
    }

    ?>

    BEGIN:VCARD
    VERSION:3.0
    REV:<?php echo get_the_date(); ?>
    FN:<?php field_check('first_name'); ?> <?php field_check('middle_initial'); ?> <?php field_check('last_name'); ?>
    N:<?php field_check('last_name'); ?>;<?php field_check('first_name'); ?> <?php field_check('middle_initial'); ?>

    TITLE:<?php field_check('position'); ?>

    ORG: Odin, Feldman &amp; Pittleman P.C.

    ADR;WORK:;;1775 Wiehle Avenue, Suite 400;Reston;Virginia;20190;United States of America

    URL:<?php field_check('blog_url'); ?>

    TEL;TYPE=WORK;VOICE:<?php field_check('phone_number'); ?>

    TEL;TYPE=WORK;Fax:<?php field_check('fax_number'); ?>

    EMAIL;TYPE=internet,pref:<?php field_check('email'); ?>

    URL;TYPE=WORK:<?php the_permalink(); ?>

    TZ:-0400
    END:VCARD

    <?php
}
else {
    echo 'Invalid input.';
}
$output = ob_get_contents();
ob_end_clean();
header('Content-Type: text/x-vcard; charset=utf-8');header('Content-Disposition: attachment; filename="' . $slug . '.vcf"');
echo $output;
exit();

アップデート #2

コードをさらに修正して、迷子の行がどこにもないようにしました。

<?php ob_start();

$slug = 'vcard';

define( 'WP_USE_THEMES', false );
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-blog-header.php' );

/**
 * Loads the WordPress environment and template.
 *
 * @package WordPress
 */
if ( !isset($wp_did_header) ) {
    $wp_did_header = true;
    require_once( dirname(__FILE__) . '/wp-load.php' );
    wp();
    require_once( ABSPATH . WPINC . '/template-loader.php' );
}

if (isset($_GET['vcard'])) {
    $attorney_id = $_GET['vcard'];

    $post = get_post($attorney_id);
    $slug = $post->post_name;

    if (!$post || get_post_type() !== 'attorneys') {
        return 'Invalid attorney';
    }

    function field_check($field) {
        echo get_field($field) ? get_field($field) : '';
    }

?>
BEGIN:VCARD
VERSION:3.0
REV:<?php echo get_the_date(); ?>

FN:<?php field_check('first_name'); ?> <?php field_check('middle_initial'); ?> <?php field_check('last_name'); ?>

N:<?php field_check('last_name'); ?>;<?php field_check('first_name'); ?> <?php field_check('middle_initial'); ?>

TITLE:<?php field_check('position'); ?>

ORG: Odin, Feldman &amp; Pittleman P.C.
ADR;WORK:;;1775 Wiehle Avenue, Suite 400;Reston;Virginia;20190;United States of America
URL:<?php field_check('blog_url'); ?>

TEL;TYPE=WORK;VOICE:<?php field_check('phone_number'); ?>

TEL;TYPE=WORK;Fax:<?php field_check('fax_number'); ?>

EMAIL;TYPE=internet,pref:<?php field_check('email'); ?>

URL;TYPE=WORK:<?php the_permalink(); ?>

TZ:-0400
END:VCARD<?php
}
else {
    return 'Invalid input.';
}
$output = ob_get_contents();
header('Content-Type: text/x-vcard');
header('Content-Disposition: attachment; filename='.$slug.'.vcf');
return $output;
exit();

しかし、まだどこにも到達していません。これを読み込もうとすると、「ヘッダーは既に送信されました」というメッセージは表示されませんが、「Web ページが見つかりません」というメッセージが表示されることに気付きました。ヘッダー呼び出しを取り出すと、次のサンプル入力が得られます。

BEGIN:VCARD
VERSION:3.0
REV:November 4, 2013
FN:Sample Name
N:Adams;Robert C.
TITLE:Shareholder
ORG: Sample Company
ADR;WORK:;;Street;City;State;12345;United States of America
URL:
TEL;TYPE=WORK;VOICE:(555) 123-4567
TEL;TYPE=WORK;Fax:(555) 123-4567
EMAIL;TYPE=internet,pref:sample@test.com
URL;TYPE=WORK:http://www.google.com
TZ:-0400
END:VCARD

これはソース ビューにありますが、ブラウザではすべて 1 行で表示されます。ヘッダーを vcard としてレンダリングする場合、これは問題になりますか? ありがとう!

4

1 に答える 1

0

出力を送信する前にコードが停止しないように、exit() を削除します。

于 2013-11-07T13:09:09.533 に答える