为什么在保存元值之后,它会保存所有的值,我点击的值?

时间:2021-08-15 作者:saeed

我有一个保存元帖子并向访问者显示的代码:

<?php if(is_singular( \'manga\' ) ){
                        $manga_link=get_post_meta($post->ID,"featured_fields_manga",true);
                        $count_season = get_post_meta($post->ID,"featured_fields_manga",true);
                        if($manga_link){
                            ?>
                            <div class="download-series">
                                <?php
                                foreach( $count_season as $key){
                                    $num_ar[] = $key[\'season_serie\'];
                                }
                                $num_arr = array_unique($num_ar);
                                foreach($num_arr as $numi){
                                    ?>
                                    <div class="down-row-serie">
                                        <?php
                                        foreach( $manga_link as $season){
                                            $meta = $season[\'season_serie\'];
                                            switch($meta){
                                                case $meta === $numi:
                                                    ?>
                                                    <div class="wppper-line">
                                                        <div class="chapright">
                                                            <ul class="meta">
                                                                <?php if(!empty($season[\'quality_serie\'])){?><li><span>name</span><?php echo $season[\'quality_serie\'];?> </li><?php }?>
                                                            </ul>
                                                        </div>
                                                        <div class="chapleft">
                                                            <ul class="dl">
                                                                <a id="<?php echo get_the_ID(); ?>" class="your_class_to_update">save this in meta field</a>
                                                            </ul>
                                                        </div>
                                                    </div>
                                                    <?php
                                                    break;
                                            }
                                        }
                                        ?>
                                    </div>
                                <?php }?>
                            </div>
                            <?php
                        }} ?>
到目前为止,一切都很好。现在我想:访客点击后;将此保存在元字段“中;,“the”;“名称”;和一个以上数据(“chap”)应该保存在一个新的meta键中(我知道保存在user meta中更好,现在我只是想保存在post meta中)。代码是这样的(此代码有问题,因为在用户单击“将此保存在元字段中”后,此帖子中的“所有”名称和“chap”将保存在帖子元中。我只想保存我单击的那一个):

function custom_update_post() {
    $post_id = $_POST[\'post_id\'];
    $post_meta_name = get_post_meta($post_id, \'name-manga-en\',true);
    $first_link = get_post_meta($post_id,"featured_fields_manga", true);
    if($first_link){
        ?>
        <?php
        foreach( $first_link as $season){
            ?>
        <?php
    $meta = array(
        \'chap\'          => $post_meta_name,
        \'name\'          => $season[\'quality_serie\']
    );
    add_post_meta( $post_id, \'my_meta\', $meta );
        }}
}
add_action( \'wp_ajax_custom_update_post\', \'custom_update_post\' );
js代码:

jQuery(document).ready( function($) {
    $(\'.your_class_to_update\').on(\'click\', function() {
        var post_id = $(this).attr( \'id\' );
        $.ajax({
            type: \'POST\',
            url: ajax_object.ajaxurl,
            data: {
                action: \'custom_update_post\',
                post_id: post_id
            }
        });
    });
});
我希望我解释得很好。要更清楚,请参见此图片:more explanation例如,“我只想保存”;11تا20“;“不是”;11تا20和1تا10和86“;。怎么了?

这是对Tom J Nowell所问问题的更多解释:

在第一个代码中,我们有一个名为“quot;您的\\u class\\u to\\u更新;。当用户点击;将此保存在元字段中“;有了这个类,脚本将使用ajax加载,并识别函数中的代码。

现在关于元数据:在名为“meta”的帖子中有一个meta\\u键;精选的\\u fields\\u manga;。此meta\\u键具有meta\\u值,该值在数组中存储一些数据。像这样的事情:

quality\\u系列:86 linkdown:link1

quality\\u系列:120 linkdown:link2

我可以用第一个代码回显这些数据,并将它们显示给用户。现在我希望当用户点击;将此保存在元字段中“;(它位于每个多个数据旁边。例如,在86和link1旁边(您可以在图片中看到)),只有86可以保存在新的meta\\u键中。请注意,我的第一个和第三个代码运行良好。问题是第二个代码(用户单击后保存此数据的函数)。此错误代码用“保存所有值”;quality\\u serie(质量系列);。现在清楚了吗?

1 个回复
SO网友:Tom J Nowell

好的,我们有一些事情,我们想把它们当作最喜欢/最不喜欢的事情。首先,我们需要两个功能:

  • saeed_is_favourited( int $post_id, string $thing_to_favourite ) (其中$thing_to_favourite 是我们标记为已保存/已收藏/等的内容,以及$default 是我们还不知道时要返回的值saeed_set_favourited( int $post_id, string $thing_to_favourite, bool $favourited ) 我们设置的位置$thing_to_favourite 在这篇文章中,无论是喜欢还是不喜欢,您都需要一种方法来发送AJAX请求以调用saeed_set_favourited 具有请求的值。

    我们将使用具有如下键的用户元在用户元中存储它是否受欢迎:

    saeed_favourite_123_ABC
    
    在哪里123 是帖子ID,并且ABC 是我们喜欢/不喜欢的东西。这个东西是一个字符串,你可以选择任何字符串。在我给出的例子中,这是完全武断的。它不是一篇文章、一个元密钥或一个用户名的鼻涕虫。如果我想的话,我可以用它们,或者我可以自己编出来。

    下面是一个尝试saeed_is_favourited

    function saeed_is_favourited( int $post_id, string $thing_to_favourite ) : bool {
        $user_id = get_current_user_id();
        $meta_key = \'saeed_favourited_\' . $post_id . \'_\' . $thing_to_favourite;
        $result = get_user_meta( $user_id, $meta_key, true );
        return boolval( $result );
    }
    
    使用方式如下:

    if ( saeed_is_favourited( get_the_ID(), \'apples\' ) ) {
        echo "you have favourited apples on this post";
    } else {
        echo "you have not favourited apples on this post";
    }
    

    以下是实施saeed_set_favourited

    function saeed_set_favourited( int $post_id, string $thing_to_favourite, bool $favourited ) : void {
        $user_id = get_current_user_id();
        $meta_key = \'saeed_favourited_\' . $post_id . \'_\' . $thing_to_favourite;
        update_user_meta( $user_id, $meta_key, $favourited );
    }
    
    注意,我使用update_user_meta, 不add_user_meta. add_user_meta 可以创建多个元键/值对,元键不是唯一的。

    最后,我们需要一种方法来确定它是否受到青睐。下面是一个老式的管理AJAX处理程序:

    function saeed_ajax_favourite_a_thing() : void {
        $post_id = 0;
        if ( ! empty( $_POST[\'post_id\'] ) {
            $post_id = intval( $_POST[\'post_id\'] );
        } else {
            wp_die( \'a post_id number is needed, none was provided\' );
        }
    
        $thing_to_favourite = \'\';
        if ( ! empty( $_POST[\'thing_to_favourite\'] ) {
            $thing_to_favourite = $_POST[\'thing_to_favourite\'];
        } else {
            wp_die( \'a thing_to_favourite is needed, none was provided\' );
        }
    
        $favourite = false;
        if ( ! empty( $_POST[\'favourite\'] ) {
            $favourite = boolval( $_POST[\'favourite\'] );
        } else {
            wp_die( \'a favourite is needed, either true or false, none was provided\' );
        }
        saeed_set_favourited( $post_id, $thing_to_favourite, $favourite );
    }
    add_action( \'wp_ajax_saeed_ajax_favourite_a_thing\', \'saeed_ajax_favourite_a_thing\' );
    
    然后,您将传递一个post ID、一个thing\\u to\\u favorite(表示您想要收藏的东西)和一个true/false(表示是喜欢还是不喜欢)。

    E、 g.这是我的最爱apple:

            $.ajax({
                type: \'POST\',
                url: ajax_object.ajaxurl,
                data: {
                    action: \'saeed_ajax_favourite_a_thing\',
                    post_id: post_id
                    thing_to_favourite: \'apple\',
                    favourite: true
                }
            });
    

    您应该考虑使用更现代的RESTAPI端点来更干净地替代此AJAX处理程序。

    您还可以使用saeed_is_favourited 构建前端,使用AJAX打开/关闭项目。

    因为它使用了用户元,所以偏好将以每个用户为基础。

    您将要检查is_user_logged_in() 因为此代码不适用于已注销的用户。

    Note that none of this code is tested, you may need to make modifications after integrating it into your code

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在