>  기사  >  백엔드 개발  >  데이터 내보내기: 맞춤형 데이터베이스 테이블

데이터 내보내기: 맞춤형 데이터베이스 테이블

WBOY
WBOY원래의
2023-09-02 18:01:07796검색

데이터 내보내기: 맞춤형 데이터베이스 테이블

이 시리즈의 첫 번째 기사에서 언급했듯이 사용자 정의 데이터베이스 테이블의 주요 문제점 중 하나는 기존 가져오기 및 내보내기 핸들러에서 처리되지 않는다는 것입니다. 이 기사는 이 문제를 해결하는 것을 목표로 하지만 현재 완전히 만족스러운 해결책은 없다는 점에 유의해야 합니다.

두 가지 시나리오를 고려해 보겠습니다.

  1. 사용자 정의 테이블은 기본 WordPress 테이블을 참조합니다
  2. 사용자 정의 테이블은 기본 테이블과 완전히 독립적입니다

"최악의 시나리오"는 첫 번째 시나리오입니다. 사용자 활동 로그를 저장하는 사용자 정의 테이블을 예로 들어 보겠습니다. 이는 사용자 ID, 개체 ID 및 개체 유형을 참조하며, 모두 기본 WordPress 테이블에 저장된 데이터를 참조합니다. 이제 누군가 WordPress 웹사이트의 모든 데이터를 두 번째 웹사이트로 가져오려고 한다고 상상해 보세요. 예를 들어, 게시물을 가져올 때 해당 ID를 가진 게시물이 두 번째 사이트에 이미 존재할 수 있으므로 WordPress에서 새 ID를 할당해야 하는 것이 전적으로 가능합니다.

이 경우 해당 변경 사항을 추적하고 표에 참조된 ID를 업데이트해야 합니다. 이것 자체는 그리 어렵지 않습니다. 안타깝게도 다른 WordPress 사이트에서 데이터 가져오기를 처리하기 위한 WordPress Importer 플러그인에는 이를 수행하는 데 필요한 후크가 부족합니다. 이 의견에서 제안한 대로 잠재적인 해결 방법은 데이터를 메타데이터에도 저장하는 것입니다. 불행하게도 이로 인해 데이터가 중복되고 데이터베이스 정규화를 위반하게 되므로 일반적으로 좋은 생각이 아닙니다. 결국 이는 몇 가지 사용 사례에서만 실제로 실현 가능합니다.

두 번째 경우는 이러한 복잡성을 피하지만 여전히 사용자 정의 가져오기 및 내보내기 핸들러가 필요합니다. 다음 두 기사에서 이 상황을 설명하겠습니다. 그러나 이 시리즈의 나머지 부분과 일관성을 유지하기 위해 사례 (1)의 예이더라도 활동 로그 테이블을 고수하겠습니다.


형식을 결정하세요

먼저 내보낸 파일의 형식을 결정해야 합니다. 가장 좋은 형식은 데이터의 성격(또는 "구조")과 데이터 사용 방법에 따라 다릅니다. 제 생각에는 XML이 일대다 관계를 처리할 수 있기 때문에 일반적으로 더 좋습니다. 그러나 데이터가 표 형식인 경우 특히 스프레드시트 애플리케이션과의 통합이 쉽기 때문에 CSV가 더 선호될 수 있습니다. 이 예에서는 XML을 사용합니다.


가격 인상

다음 단계는 사용자가 로그 테이블에서 데이터를 내보낼 수 있도록 관리 페이지를 만드는 것입니다. 도구 메뉴 항목 아래에 페이지를 추가하는 클래스를 생성하겠습니다. 페이지에는 사용자에게 내보내기 파일을 다운로드하라는 메시지를 표시하는 버튼만 포함되어 있습니다. 또한 이 클래스는 양식 제출을 수신하고 파일 다운로드를 트리거하는 핸들러를 추가합니다.

먼저 클래스의 구조를 살펴본 다음 메서드의 세부정보를 입력해 보겠습니다.

으아아아

WPTuts_Log_Export_Admin_Page::load() 클래스를 초기화하고 적절한 작업에 콜백을 연결합니다.

  • add_submenu – 도구 메뉴 아래에 페이지를 추가하는 메서드입니다.
  • maybe_download – 이 방법은 다운로드 요청이 제출되었는지 확인하기 위해 청취합니다. 권한과 nonce도 확인합니다.

헤더를 직접 설정하므로 내보내기 리스너는 헤더가 전송되기 전에 일찍 호출되어야 합니다. 여기에 더 적합한 init 上,但由于我们只允许在管理中下载导出文件,因此 admin_init에 연결할 수 있습니다.

메뉴에 페이지를 추가하는 것은 쉽습니다. 도구 아래에 페이지를 추가하려면 add_management_page()를 호출하면 됩니다.

으아아아

여기서 $hook_suffix는 다양한 화면 관련 후크에 사용되는 접미사이며 여기에서 논의됩니다. 여기서는 사용하지 않습니다. 하지만 사용하는 경우 해당 값을 하드코딩하는 것보다 변수에 저장하는 것이 좋습니다.

위에서 메소드 display()를 페이지의 콜백으로 설정하고 다음으로 정의합니다.

으아아아

마지막으로 위 양식이 제출되는 시점을 모니터링하고 내보내기 파일 다운로드를 트리거하려고 합니다.

으아아아

남은 것은 .xml 파일을 생성하고 반환하는 함수 wptuts_export_logs()를 만드는 것입니다.


내보내기 파일 만들기

함수에서 가장 먼저 해야 할 일은 로그를 검색하는 것입니다. 있는 경우 적절한 헤더를 설정하고 XML 형식으로 인쇄해야 합니다. 사용자가 XML 파일을 다운로드하기를 원하므로 Content-Type을 text/xml,将 Content-Description 设置为 File Transfer로 설정했습니다. 또한 다운로드한 파일에 적합한 이름을 생성합니다. 마지막으로 몇 가지 설명을 추가하겠습니다. 이는 완전히 선택 사항이지만 사용자에게 다운로드한 파일로 무엇을 해야 하는지 안내하는 데 도움이 됩니다.

이 시리즈의 이전 부분에서 테이블에 대한 API를 만들었으므로 내보내기 핸들러는 데이터베이스를 직접 건드릴 필요도 없고 정리할 필요도 없습니다 $args 数组,因为这是由 处理的wptuts_get_logs().

function wptuts_export_logs( $args = array() ) {

    /* Query logs */
    $logs = wptuts_get_logs($args);

    /* If there are no logs - abort */
    if( !$logs )
        return false;

    /* Create a file name */
    $sitename = sanitize_key( get_bloginfo( 'name' ) );
    if ( ! empty($sitename) ) $sitename .= '.';
    $filename = $sitename . 'wptuts-logs.' . date( 'Y-m-d' ) . '.xml';

    /* Print header */
    header( 'Content-Description: File Transfer' );
    header( 'Content-Disposition: attachment; filename=' . $filename );
    header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );

    /* Print comments */
    echo "<!-- This is a export of the wptuts log table -->\n";
    echo "<!-- (Demonstration purposes only) -->\n";
    echo "<!--  (Optional) Included import steps here... -->\n";

    /* Print the logs */
}

您会注意到,我们已将实际查询数组作为参数传递给 wptuts_export_logs() 函数。我们可以对此进行硬编码,但不这样做也是有道理的。虽然这里的目的只是导出表中的所有内容,但将查询作为参数传递允许我们稍后添加在特定时间范围内或针对特定用户导出日志的选项。 p>

创建 XML 文件时,我们需要确保标签之间打印的值不包含字符 & 或 <code>>。为了确保这一点,对于 ID,我们使用 absint 清理数据,并使用 sanitize_key 清理对象类型和活动(因为我们希望这些仅包含小写字母数字、下划线和连字符)。

/* Print logs to file */
echo '&lt;logs&gt;';
foreach ( $logs as $log ) { ?&gt;
    &lt;item&gt;
        &lt;log_id&gt;&lt;?php echo absint($log-&gt;log_id); ?&gt;&lt;/log_id&gt;
        &lt;activity_date&gt;&lt;?php echo mysql2date( 'Y-m-d H:i:s', $log-&gt;activity_date, false ); ?&gt;&lt;/activity_date&gt;
        &lt;user_id&gt;&lt;?php echo absint($log-&gt;user_id); ?&gt;&lt;/user_id&gt;
        &lt;object_id&gt;&lt;?php echo absint($log-&gt;object_id); ?&gt;&lt;/object_id&gt;
        &lt;object_type&gt;&lt;?php echo sanitize_key($log-&gt;object_type); ?&gt;&lt;/object_type&gt;
        &lt;activity&gt;&lt;?php echo sanitize_key($log-&gt;activity); ?&gt;&lt;/activity&gt;
    &lt;/item&gt;
&lt;?php }
echo '&lt;/logs&gt;';

更一般地,您可以使用以下函数将要打印的值包装在 CDATA 标记内来清理它们:

/**
 * Wraps the passed string in a XML CDATA tag.
 *
 * @param string $string String to wrap in a XML CDATA tag.
 * @return string
 */
function wptuts_wrap_cdata( $string ) {
    if ( seems_utf8( $string ) == false )
        $string = utf8_encode( $string );

    return '&lt;![CDATA[' . str_replace( ']]&gt;', ']]]]&gt;&lt;![CDATA[&gt;', $string ) . ']]&gt;';
}

最后我们 exit() 以防止任何进一步的处理:

    /* Finished - now exit */   
    exit();

导航到我们的导出页面,单击“下载活动日志”应提示下载 XML 文件。


摘要

在本教程中,我们研究了从自定义表中导出数据。不幸的是,当数据引用本机 WordPress 表时,这充其量是有问题的。上述方法仅适用于数据无法做到这一点的情况。使用的示例(我们的活动日志)显然不属于此类,只是为了与本系列的其余部分保持一致而使用。

当数据确实引用本机表时,显然有必要将其与本机表一起导入,并在此过程中跟踪导入期间发生的 ID 任何更改。目前,现有的导入和导出处理程序无法实现这一点,因此唯一可行的选择是创建自己的处理程序。在自定义数据仅引用单个帖子类型的简单情况下,可以设计导入和导出处理程序来处理该帖子类型以及自定义数据,并通知用户不要使用该帖子类型的本机导出器。

在本系列的下一部分中,我们将为导出的 .xml 文件创建一个简单的导入处理程序。

위 내용은 데이터 내보내기: 맞춤형 데이터베이스 테이블의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.