自定义 post 类型中用户选择的预定义值(元数据与分类法)

Predefined values for user selection in custom post type (metadata vs taxonomy)

我正在构建一个插件,允许访问者提交软件配置以与他人共享。他们输入几位信息(他们的名字、软件和机器),然后上传他们的 XML 配置文件,最终将其转换为自定义 post 类型。

截至目前,我将他们输入的所有内容(如姓名、软件、机器类型等)存储为元数据。不过,我想为 software/machine 类型预定义选项,允许他们在提交时从这些选项中进行选择。

在 Wordpress 中实现此目的的好方法是什么?我应该通过表单将这些作为预定义值保存在 select 框中,然后将数据另存为元数据中的文本还是有更好的选择?

function slicer_profile_form()
{
    echo '<form action="' . esc_url( $_SERVER['REQUEST_URI'] ) . '" method="post" enctype="multipart/form-data">';

    echo '<p>';
    echo 'Your Name<br />';
    echo '<input type="text" name="slicer-profile-author" pattern="[a-zA-Z0-9 ]+" value="' . ( isset( $_POST["slicer-profile-author"] ) ? esc_attr( $_POST["slicer-profile-author"] ) : '' ) . '" size="48" />';
    echo '</p>';

    echo '<p>';
    echo 'Profile Name<br />';
    echo '<input type="text" name="slicer-profile-name" pattern="[a-zA-Z0-9 ]+" value="' . ( isset( $_POST["slicer-profile-name"] ) ? esc_attr( $_POST["slicer-profile-name"] ) : '' ) . '" size="48" />';
    echo '</p>';

    echo '<p>';
    echo 'Profile Description<br />';
    echo '<textarea name="slicer-profile-description" pattern="[a-zA-Z0-9 ]+" value="' . ( isset( $_POST["slicer-profile-description"] ) ? esc_attr( $_POST["slicer-profile-description"] ) : '' ) . '" rows="4"></textarea>';
    echo '</p>';

    echo '<p>';
    echo '3D Printer Model<br />';
    echo '<select name="slicer-profile-model">';
    echo '<option value="a8">Anet A8</option>';
    echo '<option value="cr10">Creality CR-10</option>';
    echo '<option value="mini">Monoprice Select Mini</option>';
    echo '<option value="makerselect">Monoprice Maker Select</option>';
    echo '<option value="ultimate">Monoprice Ultimate</option>';
    echo '<option value="prusamk2">Prusa MK2/MK2S/MK3</option>';
    echo '</select>';
    echo '</p>';

    echo '<p>';
    echo 'Slicer Software<br />';
    echo '<select name="slicer-profile-software">';
    echo '<option value="cura">Cura</option>';
    echo '<option value="s3d">Simplify3D</option>';
    echo '<option value="slic3r">Slic3r</option>';
    echo '</select>';
    echo '</p>';

    echo '<p>';
    echo 'Slicer Profile<br />';
    echo '<input type="file" name="slicer-profile" accept=".fff,.ini,.curaprofile">';
    echo '</p>';

    echo '<p><input type="submit" name="slicer-profile-submitted" value="Submit"/></p>';
    echo '</form>';
}

如果您想将项目组合在一起,请使用分类法。除了这个词的字面定义之外,它还可以很容易地为同一软件提取所有帖子并将它们分组。这就是 Taxonomy excel 所在的位置。

如果您只是有一个更全面的 CPT,那么只需要附加一些任意信息,这就是 Custom Fields excel 的内容。这主要用于不明确相关的任意信息,例如 PriceEvent Start DateFacebook Group/Page URL.

听起来您更适合软件和机器类型的 taxonomy/term 关系,尽管最终取决于您。您 可以 根据自定义字段查询帖子,但可明确定义的信息更适合分类法。

顺便说一句,是否有任何特殊原因让您每行使用回显语句而不是仅仅关闭 PHP 标记并回显标准 PHP 中的几个变量 HTML?

function slicer_profile_form(){ ?>
    <form action="<?= esc_url( $_SERVER['REQUEST_URI'] ); ?>" method="post" enctype="multipart/form-data">
        <label>
            Your Name<br>
            <input type="text" name="slicer-profile-author" pattern="[a-zA-Z0-9 ]+" value="<?= ( isset( $_POST["slicer-profile-author"] ) ? esc_attr( $_POST["slicer-profile-author"] ) : '' ); ?>" size="48" />
        </label>
        <label>
            Profile Name<br>
            <input type="text" name="slicer-profile-name" pattern="[a-zA-Z0-9 ]+" value="<?= ( isset( $_POST["slicer-profile-name"] ) ? esc_attr( $_POST["slicer-profile-name"] ) : '' ); ?>" size="48" />
        </label>
        <label>
            Profile Description<br>
            <textarea name="slicer-profile-description" pattern="[a-zA-Z0-9 ]+" value="<?= ( isset( $_POST["slicer-profile-description"] ) ? esc_attr( $_POST["slicer-profile-description"] ) : '' ); ?>" rows="4"></textarea>
        </label>
        <label>
            3D Printer Model<br>
            <select name="slicer-profile-model">
                <option value="a8">Anet A8</option>
                <option value="cr10">Creality CR-10</option>
                <option value="mini">Monoprice Select Mini</option>
                <option value="makerselect">Monoprice Maker Select</option>
                <option value="ultimate">Monoprice Ultimate</option>
                <option value="prusamk2">Prusa MK2/MK2S/MK3</option>
            </select>
        </label>
        <label>
            Slicer Software<br>
            <select name="slicer-profile-software">
                <option value="cura">Cura</option>
                <option value="s3d">Simplify3D</option>
                <option value="slic3r">Slic3r</option>
            </select>
        </label>
        <label>
            Slicer Profile<br>
            <input type="file" name="slicer-profile" accept=".fff,.ini,.curaprofile">
        </label>
        <p>
            <input type="submit" name="slicer-profile-submitted" value="Submit" />
        </p>
    </form>
<?php } ?>