Не показывать уже подписанные на программы - PullRequest
3 голосов
/ 23 апреля 2020

Итак, у меня есть этот код:

<?php

global $wpdb;

$table_name = $wpdb->prefix . 'usermeta';
$current_user_id = get_current_user_id();
$Sdoubledata = array($retrieved_data);
foreach($Sdoubledata as $Sdoubledata) {
// Het stuk code hieronder haalt de programma's op uit de database waar de gebruiker al op geabonneerd is.
$retrieve_data = $wpdb->get_results("SELECT * FROM {$table_name} WHERE user_id={$current_user_id} AND meta_key='programma';");
}
echo "<br>";
?>
<!-- Dit stuk code laat de programma's zien waar de radiostation al op geabonneerd is. -->
<br>
<p>De programma's waarop u geabonneerd bent:</p>
<form action="#" enctype="multipart/form-data" method="post">
    <?php wp_nonce_field( 'set_programmatest_action', 'set_programmatest' ); ?>
    <table>
        <?php foreach ( $retrieve_data as $retrieved_data ) { ?>
            <tr>
                <th>Programma:</th>
                <td style="vertical-align: middle;"><?php echo esc_html( $retrieved_data->meta_value ); ?></td>
                <th>
                    <button name="programmatest" type="submit" id="button" value="<?php echo esc_attr( $retrieved_data->meta_value ); ?>">Abonnement opzeggen</button>
                </th>
            </tr>
        <?php } 
        ?>
    </table>
</form>

<?php
    // Verifieer nonce en sla de data op als de user is ingelogd.
    // Nonce docs: https://developer.wordpress.org/themes/theme-security/using-nonces/
    if (isset( $_POST['programmatest'] ) && isset( $_POST['set_programmatest'] ) && wp_verify_nonce( $_POST['set_programmatest'], 'set_programmatest_action' )) {

      $Data = filter_input( INPUT_POST, 'programmatest', FILTER_SANITIZE_STRING );
      $current_user_id = get_current_user_id();

        if ( $current_user_id && ! empty( $Data ) ) {
            delete_user_meta( $current_user_id, 'programma', $Data );
            echo "Uw abonnement op" . ' ' . $Data. ' ' ."is opgezegd.";
            //Refresh de pagina
            ?>

            <?php
                $page = $_SERVER['PHP_SELF'];
                $sec = "2";
                ?>
                <html>
                    <head>
                    <meta http-equiv="refresh" content="<?php echo $sec?>;URL='<?php echo $page?>'">
                    </head>
                    <body>
                    <?php
                        echo ' ' . "U wordt doorverwezen naar de Homepagina";
                    ?>
                    </body>
                </html>
                <?php
                        }
                    }
             ?>


<?php
global $wpdb;

    $table_name = $wpdb->prefix . 'programma';
    // Dit haalt de data op uit de database

    $NSdoubledata = array("uitwerkingen", "GoudvanOud");
    foreach($NSdoubledata as $NSdoubledata) {
    $retrieve_data = $wpdb->get_results( "SELECT Anaam FROM {$table_name}" );
    if(in_array($NSdoubledata)) {
        echo "Hij doet het!";
    } else {
        echo "Nee, toch niet.";
    }
    }

    echo "<br>";

?>
<!--De code hier laat de data die opgehaald is zien en laat de programma's zien waar de radiostation op kan abonneren-->
<br>
<p>Programma's waarop u kunt abonneren:</p>
<form action="#" enctype="multipart/form-data" method="post">
    <?php wp_nonce_field( 'set_programma_action', 'set_programma' ); ?>
    <table>
        <?php foreach ( $retrieve_data as $retrieved_data ) { ?>
            <tr>
                <th>Programma:</th>
                <td style="vertical-align: middle;"><?php echo esc_html( $retrieved_data->Anaam ); ?></td>
                <th>
                    <button name="programma" type="submit" value="<?php echo esc_attr( $retrieved_data->Anaam ); ?>">Abonneer</button>
                </th>
            </tr>
        <?php } ?>
    </table>
</form>

<?php
    // Verifieer nonce en sla de data op als de user is ingelogd.
    // Nonce docs: https://developer.wordpress.org/themes/theme-security/using-nonces/
    if (isset( $_POST['programma'] ) && isset( $_POST['set_programma'] ) && wp_verify_nonce( $_POST['set_programma'], 'set_programma_action' )) {

      $data = filter_input( INPUT_POST, 'programma', FILTER_SANITIZE_STRING );
      $current_user_id = get_current_user_id();

        if ( $current_user_id && ! empty( $data ) ) {
            //voeg de huidige user_id en data toe in de rij met meta_key programma
            add_user_meta( $current_user_id, 'programma', $data );
            echo "U bent geabonneerd op". ' ' . $data;
        }
    }
?>

Что я пробовал:

<?php
global $wpdb;

$skip = array($retrieved_data);
if(in_array($retrieved_data, $skip)) {

    $table_name = $wpdb->prefix . 'programma';
    // This retrieves the data from the database
    $retrieve_data = $wpdb->get_results( "SELECT Anaam FROM {$table_name}" );
    echo "<br>";

}

?>

Код позволяет пользователю подписаться на программу и отменить свою подписку. Однако, когда пользователь подписался на программу, программы, на которые он / она уже подписан, все еще отображаются в том месте, где он позволяет пользователям подписаться на программу.

Пример:

enter image description here

Как вы видите, в первой части пользователь может видеть, на какие программы он или она уже подписан. Во второй части пользователь может выбрать, на какую программу он или она могут подписаться. Поскольку пользователь уже подписан на «uitwerkingen», он не должен видеть в нем возможность подписываться. Я уже искал решение по переполнению стека, но не могу найти какое-либо решение.

Как это исправить?

Структура моей базы данных:

Таблица пользовательских метаданных:

enter image description here

таблица программ:

enter image description here

enter image description here

РЕДАКТИРОВАТЬ

Это первая l oop данных, которые я делаю, чтобы показать все подписанные на программы.

<?php

global $wpdb;

$table_name = $wpdb->prefix . 'usermeta';
$current_user_id = get_current_user_id();
//I made an array containing all the subscribed to programs
$Sdoubledata = array("uitwerkingen", "GoudvanOud");
foreach($Sdoubledata as $Sdoubledata) {
$retrieve_data = $wpdb->get_results("SELECT * FROM {$table_name} WHERE user_id={$current_user_id} AND meta_key='programma';");
if(in_array("uitwerkingen", "GoudvanOud")) {
    continue;
}
}
echo "<br>";
?>

А это второй л oop:

<?php
global $wpdb;

    $table_name = $wpdb->prefix . 'programma';
    // I made an array containing all the programs a user can subscribe to.
    $NSdoubledata = array("uitwerkingen", "GoudvanOud");
    // I made a foreach which contains the result of the query
    foreach($NSdoubledata as $NSdoubledata) {
    $retrieve_data = $wpdb->get_results( "SELECT Anaam FROM {$table_name}" );
    // I want to output the programs as you told me.
    echo ($NSdoubledata);
    }

    echo "<br>";

?>

1 Ответ

3 голосов
/ 02 мая 2020

Я полагаю, что простое изменение SQL решит это для вас.

SELECT Anaam FROM programma
WHERE ID_prog NOT IN 
      (SELECT meta_value FROM usermeta WHERE user_id={$current_user_id})

Так что если вы измените это в своей строке, которая в настоящее время читает

$retrieve_data = $wpdb->get_results( "SELECT Anaam FROM {$table_name}" );

Это должно выглядеть так больше похоже на

$retrieve_data = $wpdb->get_results( "SELECT Anaam FROM programma WHERE ID_prog NOT IN (SELECT meta_value FROM usermeta WHERE user_id={$current_user_id})" );

После этого должны создаваться только списки программ, на которые пользователь еще не подписан.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...